1: 2013-02-18 (月) 13:34:09 maruo[5] [6] | |||
---|---|---|---|
Line 1: | Line 1: | ||
+ | *AndroidとVPN接続をしたい! [#mb57c775] | ||
+ | 時々あるじゃーないですか。あ、なんかサーバの調子が変!ログインして状況確認したい~!!(無いって?)そんな時に、普段持っているスマフォで様子を観察できたら、あら、これは便利!なんてことを考えてました。それを実現するのが、AndroidでVPN接続! | ||
+ | -リモート端末からのサーバへのコンソールログイン&メンテナンス | ||
+ | -動画/音楽/写真をケータイにダウンロードすることなく閲覧 | ||
+ | を果たしたいと思い、まずはOpenVPNを試してみました。Android4.0(ICS)だと、OpenVPNが動くというので、やってみたのですが、なぜかSIGUSR1が発行されてうまく動いてくれないとです。と、いうことで、他の方法でやってみることとしました。 | ||
+ | -IPsec/L2TPトンネル | ||
+ | -PPTPトンネル | ||
+ | |||
+ | ただし、PPTPは、 | ||
+ | -この間MS-CHAPv2がクラックされて危険だ、と言うこと | ||
+ | -SPモードはPPTP接続に対応していないということ | ||
+ | |||
+ | だったので、IPsec/L2TPトンネルにチャレンジしてみることとしました。ちなみにググってみると、設定の仕方は諸説ありますが…manファイル調べながらやってみて、以下としました。特にHeartBeatを使用してフローティングIPアドレスを使用してる人にはお役立ちだと思います。 | ||
+ | |||
+ | *今回の目標 [#fb76938a] | ||
+ | 以下のようなネットワークでAndroidスマフォと内部LANに立てたIPsec/L2TPサーバとVPN確立を目指します。 | ||
+ | #ref(IPsec.jpg); | ||
+ | |||
+ | *設定 [#i8fd2057] | ||
+ | **OpenSwan/xl2tpdのインストール [#g4e6a8c5] | ||
+ | OpenSwanはIPsecを提供するツール、xl2tpdはL2TPトンネリングを提供するツールです。 | ||
+ | |||
+ | さて、ココで問題。Android4.0(ICS)は、OS標準のIPsec-toolにバグがあり、そのままでは繋がってくれないとのこと。ですが、Portageのパッケージ管理内でなんとか事を済ませたい。このためにかなりイリーガルなやり方をしています。Gentooな方の参考になれば… | ||
+ | |||
+ | まず、OpenSwan2.6.38で、[[Android4.0(ICS)のバグ回避用パッチ>http://code.google.com/p/android/issues/attachmentText?id=23124&aid=231240180000&name=openswan-android-ics-natoa.patch]]をダウンロードしてきます。で、これを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の設定 [#fba2ebcc] | ||
+ | 今回は、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の設定 [#za2b55b7] | ||
+ | /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の設定 [#bd37aa36] | ||
+ | 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アドレス | ||
+ | |||
+ | さて…サーバの設定は終了 | ||
+ | |||
+ | *セキュリティの設定 [#r1c0ae3d] | ||
+ | |||
+ | 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((Encapseled Security Payload))を受信するためのポートをオープンします。 | ||
+ | |||
+ | 更に、NAPTなブロードバンドルータに、UDP 4500 とUDP 500をサーバにNAT変換するアドレス変換テーブルを設定します。 | ||
+ | |||
+ | *接続してみよう [#ddafd69c] | ||
+ | **サーバ群起動 [#b694e07a] | ||
+ | # /etc/init.d/ipsec start | ||
+ | # /etc/init.d/xl2tpd start | ||
+ | **Android側設定 [#q9b2cffb] | ||
+ | 端末設定→その他→VPN→VPNの追加 選択 | ||
+ | :名前|適当につけて | ||
+ | :種類|L2TP/IPSec PSK | ||
+ | :サーバアドレス|IPsec/L2TPサーバのIPアドレス若しくはホスト名 | ||
+ | :IPsec事前共有鍵|/etc/ipsec.secretsに設定した事前共有鍵 | ||
+ | |||
+ | んで、保存。接続するときは | ||
+ | :ユーザー名|/etc/ppp/chap-secretsに設定したユーザ名 | ||
+ | :パスワード|/etc/ppp/chap-secretsに設定したパスワード | ||
+ | |||
+ | で接続をタップ。 | ||
+ | |||
+ | *トラブルシューティング [#n4bd1374] | ||
+ | さて…つながりましたか??つながらない場合は…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 VPNでいろいろやってみよう [#b7f929d5] | ||
+ | **Androidから内部サーバへSSH [#a8da6346] | ||
+ | AndroidアプリのConnectBot(SSHアプリ)+Hacker's Keyboardで、3G→サーバログインできました。 | ||
+ | **AndroidからWindowsマシンにリモートデスクトップ [#g760656a] | ||
+ | おじさんは用途がないのでやってません。LAN内にWindowsを立ててる人は、便利かもね。リモートデスクトップアプリもあるようなので試してみて~ | ||
+ | **DLNAアプリで、動画/音楽/写真をストリーミング [#na926eb0] | ||
+ | Skiftaは、ダメでした。UPnPパケットを通過させてくれないみたい。PlugPlayerは、一度通信できたDLNAサーバを記憶してくれるので、VPNからもうまく閲覧できました。 | ||
+ | |||
+ | **Windows共有ディスクの参照 [#p0ef80a1] | ||
+ | うーん、DLNAが出来れば文句ないんだよな…やれば出来ると思うけど、やってません… | ||
+ | |||
+ | **その他 [#jf7b196f] | ||
+ | アイディア募集中。VPNつないでも、できることってあんまりないんだよね… |
(This host) = https://femt.ddo.jp