Back to page

− Links

 Print 

Diff of Gentoo Linuxな生活​/IPsecL2TP VPNで悩む :: Nest Of Hawk

Diff of xpwiki:Gentoo Linuxな生活/IPsecL2TP VPNで悩む

  • View the source[1].
  • Gentoo Linuxな生活/IPsecL2TP VPNで悩む has been deleted.
« Prev[2]  
4: 2013-02-15 (Fri) 00:27:34 maruo[3] source[4] Cur: - no date - source[5]
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つないでも、できることってあんまりないんだよね… 
« Prev[2]