ページへ戻る

+ Links

 印刷 

Gentoo Linuxな生活​/IPsec L2TP VPNで悩む のバックアップ差分(No.1) :: Nest Of Hawk

xpwiki:Gentoo Linuxな生活/IPsec L2TP VPNで悩む のバックアップ差分(No.1)

  Next »
1: 2013-02-18 (月) 13:34:09 maruo ソース
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つないでも、できることってあんまりないんだよね…
  Next »