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


Front page   Diff Backup Copy Rename ReloadPrint View   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom) Powered by xpWiki
Counter: 13877, today: 8, yesterday: 2
ページ内検索

ログイン

ユーザー名:


パスワード:





パスワード紛失

メインメニュー

サブメニュー
自宅鯖計画

Gentoo Linuxな生活

玄箱HGにGentoo格闘記

航空ショーへ行こう

モータースポーツな世界

奥深き写真の世界への誘い

我思う ゆえに我あり



携帯用QRコード