2017年6月24日 OpenSwan→LibreSwanへの移行を追記しました♪
AndroidとVPN接続をしたい!
時々あるじゃーないですか。あ、なんかサーバの調子が変!ログインして状況確認したい~!!(無いって?)そんな時に、普段持っているスマフォで様子を観察できたら、あら、これは便利!なんてことを考えてました。それを実現するのが、AndroidでVPN接続!
- リモート端末からのサーバへのコンソールログイン&メンテナンス
- 動画/音楽/写真をケータイにダウンロードすることなく閲覧
を果たしたいと思い、まずはOpenVPNを試してみました。Android4.0(ICS)だと、OpenVPNが動くというので、やってみたのですが、なぜかSIGUSR1が発行されてうまく動いてくれないとです。と、いうことで、他の方法でやってみることとしました。
- IPsec/L2TPトンネル
- PPTPトンネル
ただし、PPTPは、
- この間MS-CHAPv2がクラックされて危険だ、と言うこと
- SPモードはPPTP接続に対応していないということ
だったので、IPsec/L2TPトンネルにチャレンジしてみることとしました。ちなみにググってみると、設定の仕方は諸説ありますが…manファイル調べながらやってみて、以下としました。特にHeartBeatを使用してフローティングIPアドレスを使用してる人にはお役立ちだと思います。
OpenSwan/xl2tpdのインストール
OpenSwanはIPsecを提供するツール、xl2tpdはL2TPトンネリングを提供するツールです。
さて、ココで問題。Android4.0(ICS)は、OS標準のIPsec-toolにバグがあり、そのままでは繋がってくれないとのこと。ですが、Portageのパッケージ管理内でなんとか事を済ませたい。このためにかなりイリーガルなやり方をしています。Gentooな方の参考になれば…
まず、OpenSwan2.6.38をAndroid4.0(ICS)で動作できるようにするために、Android4.0(ICS)のバグ回避用パッチをダウンロードしてきます。で、これをPortageパッケージツリーのOpenSwanの下に置いておきます。Portageのパスがデフォルトの/usr/portageだとしますね。
# cp openswan-android-ics-ntoa.patch /usr/portage/net-misc/openswan/files
で、emergeでBuild時にパッチを当ててくれるようにebuildファイルを編集する。
# vi /usr/portage/net-misc/openswan/openswan-2.6.38.ebuild
src_prepare() { epatch "${FILESDIR}"/${P}-gentoo.patch epatch "${FILESDIR}"/openswan-android-ics-natoa.patch ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^追加です use ms-bad-proposal && epatch "${FILESDIR}"/${PN}-${PV%.*}-allow-ms-bad-proposal.patch find . -type f -regex '.*[.]\([1-8]\|html\|xml\)' -exec sed -i \ -e s:/usr/local:/usr:g '{}' \; || die "failed to replace text in docs" }
でもこのままemerge openswan打つとファイルのDigestサイズが合わないとケチつけられます。そこで、以下のコマンド打ち込み
# ebuild /usr/portage/net-misc/openswan/openswan-2.6.38.ebuild digest
さらに、コンパイルオプションの追加が必要。make.confのCFLAGSに ”-DSUPPORT_BROKEN_ANDROID_ICS”を追加してあげてください。で、やっとこさビルド。
# emerge openswan xl2tpd
OpenSwanの設定
今回は、PreSharedKeyという、事前共有鍵方式を使います。鍵交換方式のほうがセキュリティは高いのかもしれんが…まぁ、そこまで知識がないので、まずはこれで。で、PreSharedKeyを作ります。
# touch /etc/ipsec.secrets # chmod 600 /etc/ipsec.secrets # vi /etc/ipsec.secret
中身はこんな感じ
<IPsecサーバのIPアドレス> %any: PSK "事前共有鍵"
”事前共有鍵”にはIPsecをつなぐ場合のパスフレーズを書いておきます。続いて設定ファイルの編集。
# vi /etc/ipsec.conf
/etc/ipsec.d/examplesにあるl2tp-psk.confを参考に作ってます。
config setup dumpdir=/var/run/pluto/ #NATなルータを通すため nat_traversal=yes virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v6:fd00::/8,%v6:fe80::/10 oe=off protostack=netkey nhelpers=0 conn L2TP-PSK-NAT rightsubnet=vhost:%priv also=L2TP-PSK-noNAT conn L2TP-PSK-noNAT forceencaps=yes authby=secret pfs=no auto=add keyingtries=3 ike=aes-sha1;modp3072 phase2=esp phase2alg=aes-sha1;modp3072 rekey=no #iPhoneの再接続のための設定 dpddelay=10 dpdtimeout=90 dpdaction=clear ikelifetime=8h keylife=1h type=transport left=<サーバのIPアドレス> leftprotoport=17/1701 right=%any rightprotoport=17/%any
xl2tpdの設定
/etc/xl2tpd/xl2tpd.confをいじります。
[global] ; Global parameters: port = 1701 ; * Bind to port 1701 auth file = /etc/ppp/chap-secrets ; * Where our challenge secrets are listen-addr = <HeartBeatのフローティングIPアドレス> [lns default] ; Our fallthrough LNS definition ip range = 端末に割り振るアドレスの範囲 ; * Allocate from this IP range local ip = IPsecのサーバIPアドレス ; * Our local IP to use length bit = yes ; * Use length bit in payload? require chap = yes ; * Require CHAP auth. by peer refuse pap = yes ; * Refuse PAP authentication require authentication = yes ; * Require peer to authenticate name = IPsecServer pppoptfile = /etc/ppp/xl2tpd-options
L2TPのchapで認証します。auth fileのユーザ/パスワードで接続いたします。さて、HeartBeatを使ってる時のポイントはlisten-addrを指定することですね。HeartBeatで2重化運用している場合、固定のIPアドレスと、HeartBeatで切替時に付与されるフローティングIPアドレスがあります。切り替えても運用に支障がないように、フローティングIPアドレス側をIPsecサーバのアドレスとして運用したいですよね。それを固定するのがlisten-addrです。これが無いと、IFの1番目に振ってあるアドレス(固定IPアドレス)が使用されちゃいます。すると…IPsecの通信ができません…これで2日ハマりました…
さらに、/etc/ppp/chap-secretsの中身はこんな感じ
# Secrets for authentication using CHAP # client server secret IP addresses <ユーザ名> IPsecServer "パスワード" *
ユーザ名、パスワードは自分で任意に決めてやって。serverの欄は、xl2tpd.confで設定したnameと合わせます。
pppdの設定
xl2tpdから起動されるpppデーモンの設定です。xl2tpd.confのpppoptfileに指定したファイルを編集します。
name IPsecServer # /etc/xl2tpd/xl2tpd.conf で設定した name と合わせる noccp auth crtscts mtu 1410 mru 1410 nodefaultroute lock proxyarp connect-delay 5000 ms-dns DNSサーバのIPアドレス
さて…サーバの設定は終了
セキュリティの設定
L2TPには、IPsec経由でしか接続させないように以下のIPフィルタを設定。
iptables -t filter -A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport l2tp -j ACCEPT iptables -t filter -A INPUT -p udp -m udp --dport l2tp -j REJECT --reject-with icmp-port-unreachable iptables -t filter -A OUTPUT -p udp -m policy --dir out --pol ipsec -m udp --sport l2tp -j ACCEPT iptables -t filter -A OUTPUT -p udp -m udp --sport l2tp -j REJECT --reject-with icmp-port-unreachable
さらに、外部からのIPパケット受信にフィルタをかけてる方は、外部からのIPsecのネゴシエーションを受け付けるように、以下のIPフィルタも追加。
iptables -t filter -A INPUT -p udp -m udp --dport 500 -j ACCEPT iptables -t filter -A INPUT -p udp -m udp --dport 4500 -j ACCEPT iptables -t filter -A OUTPUT -p udp -m udp --sport 4500 -j ACCEPT iptables -t filter -A OUTPUT -p udp -m udp --sport 500 -j ACCEPT
IKE鍵交換プロトコルと、IPsecのESP*1を受信するためのポートをオープンします。
更に、NAPTなブロードバンドルータに、UDP 4500 とUDP 500をサーバにNAT変換するアドレス変換テーブルを設定します。
Android側設定
端末設定→その他→VPN→VPNの追加 選択
- 名前
- 適当につけて
- 種類
- L2TP/IPSec PSK
- サーバアドレス
- IPsec/L2TPサーバのIPアドレス若しくはホスト名
- IPsec事前共有鍵
- /etc/ipsec.secretsに設定した事前共有鍵
んで、保存。接続するときは
- ユーザー名
- /etc/ppp/chap-secretsに設定したユーザ名
- パスワード
- /etc/ppp/chap-secretsに設定したパスワード
で接続をタップ。
トラブルシューティング
さて…つながりましたか??つながらない場合は…Syslogを見てどんなエラーメッセージが出てるか調べましょう…私がぶつかったのは以下。
- byte 7 of ISAKMP NAT-OA Payload must be zero, but is not
- Android4.0(ICS)のバグです。OpenSwanにきちんとパッチが当たっているか確認しましょう
- control_finish: Peer requested tunnel XXX twice, ignoring second one.
- IPsec⇔L2TP間でパケットがやり取りされていません。Androidで指定するサーバアドレス、ipsec.confの”left=”、xl2tpd.confの”listen-addr =”、”local ip =”が一致してないとつながりませんでした。
AndroidからWindowsマシンにリモートデスクトップ
おじさんは用途がないのでやってません。LAN内にWindowsを立ててる人は、便利かもね。リモートデスクトップアプリもあるようなので試してみて~
DLNAアプリで、動画/音楽/写真をストリーミング
Skiftaは、ダメでした。UPnPパケットを通過させてくれないみたい。PlugPlayerは、一度通信できたDLNAサーバを記憶してくれるので、VPNからもうまく閲覧できました。
Atheros AR8161 Ethernetコントローラがイケてない?
どうも最近の自作マザーに搭載されているEthernetコントローラ Atheros AR8161NICドライバがイケてない模様で、2013/2/20付の最新ドライバだとIPsecの接続に以下のようなメッセージ出して失敗します。
packet from XXX.XXX.XXX.XXX:4500: recvfrom XXX.XXX.XXX.XXX:4500 has no Non-ESP marker
同一カーネルでALXドライバの古いバージョンを使用するとうまくできたりするのですが…この古いバージョン、パケット大量通信するとNICがハングしたりして誤動作したりするので、やっぱりイマイチです…バージョンアップをしばらく待ったほうがいいか…
で、結局ウチではIntel CT Desktop Ethernet Adapterをインスコすることで解決してしまいました。内蔵EtherはOFFで。なんか負けた気分だけど…安定動作が信条のサーバでは致し方なしですかね。
OpenSwan→LibreSwanへ移行
OpenSwanは、メンテナンスから外れ、フォークしたLibreSwanに引き継がれました。このため、新たに移行を致します。なお、Android7(Nugart)では、設定変更しないとIPsec/L2TP VPNが接続できませんでしたので、そちらも合わせて。
LibreSwanをインストール
まず、dev-libs/nss にutilsフラグをつけろと要求してきますので、package.useに追加します
dev-libs/nss utils
続いて、LibreSwanをインストールします。
# emerge --newuse -vuD libreswan
おしまいです。設定などはそのまま使用できます。
Page Info | |
---|---|
Page Name : | Gentoo Linuxな生活/IPsec L2TP VPNで悩む |
Page aliases : | None |
Page owner : | maruo |
Can Read | |
Groups : | All visitors |
Users : | All visitors |
Can Edit | |
Groups : | No one |
Users : | No one |