ページへ戻る

− Links

 印刷 

Gentoo Linuxな生活​/IPsec L2TP VPNで悩む のバックアップソース(No.7) :: Nest Of Hawk

xpwiki:Gentoo Linuxな生活/IPsec L2TP VPNで悩む のバックアップソース(No.7)

« Prev[4]  Next »[5]
2017年6月24日 OpenSwan→LibreSwanへの移行を追記しました♪

*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)で動作できるようにするために、[[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]
ESファイルエクスプローラ使用したら意外に簡単にできました。実はDLNAよりも、音楽/写真/動画の共有はこっちのほうが楽かしら…??

**その他 [#jf7b196f]
アイディア募集中。VPNつないでも、できることってあんまりないんだよね…

*Atheros AR8161 Ethernetコントローラがイケてない? [#b7745633]

どうも最近の自作マザーに搭載されているEthernetコントローラ [[Atheros AR8161NICドライバがイケてない>http://www.linuxfoundation.org/collaborate/workgroups/networking/alx]]模様で、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>http://www.amazon.co.jp/%E3%82%A4%E3%83%B3%E3%83%86%E3%83%AB-Gigabit-Desktop-Adapter-EXPI9301CT/dp/B001CXWWBE]]をインスコすることで解決してしまいました。内蔵EtherはOFFで。なんか負けた気分だけど…安定動作が信条のサーバでは致し方なしですかね。

*OpenSwan→LibreSwanへ移行 [#icb0b361]

OpenSwanは、メンテナンスから外れ、フォークしたLibreSwanに引き継がれました。このため、新たに移行を致します。なお、Android7(Nugart)では、設定変更しないとIPsec/L2TP VPNが接続できませんでしたので、そちらも合わせて。

**OpenSwanをアンインストール [#l54d9fe3]
 # emerge -C openswan

おわりです

**LibreSwanをインストール [#se33a857]
まず、dev-libs/nss にutilsフラグをつけろと要求してきますので、package.useに追加します
 dev-libs/nss utils

続いて、LibreSwanをインストールします。

 # emerge --newuse -vuD libreswan

おしまいです。設定などはそのまま使用できます。

**Android7用に設定を変更する [#y2451e9d]
Androidで要求してくる暗号化アルゴリズムを指定する必要があるとのことで、ipsec.confを以下の部分を修正及び追加いたします。

 ike=3des-sha1,aes-sha1,aes256-sha2_256,aes256-sha2_512
 phase2alg=3des-sha1,aes-sha1,aes256-sha2_256,aes256-sha2_512
 sha2-truncbug=yes

**サービス再起動 [#tb45a914]
 # /etc/init.d/ipsec restart
 # /etc/init.d/xl2tpd restart

これで、スマホからのVPN接続が確立できました♪


« Prev[4]  Next »[5]