2017年6月24日 OpenSwan→LibreSwanへの移行を追記しました♪

AndroidとVPN接続をしたい! anchor.png

時々あるじゃーないですか。あ、なんかサーバの調子が変!ログインして状況確認したい~!!(無いって?)そんな時に、普段持っているスマフォで様子を観察できたら、あら、これは便利!なんてことを考えてました。それを実現するのが、AndroidでVPN接続!

  • リモート端末からのサーバへのコンソールログイン&メンテナンス
  • 動画/音楽/写真をケータイにダウンロードすることなく閲覧

を果たしたいと思い、まずはOpenVPNを試してみました。Android4.0(ICS)だと、OpenVPNが動くというので、やってみたのですが、なぜかSIGUSR1が発行されてうまく動いてくれないとです。と、いうことで、他の方法でやってみることとしました。

  • IPsec/L2TPトンネル
  • PPTPトンネル

ただし、PPTPは、

  • この間MS-CHAPv2がクラックされて危険だ、と言うこと
  • SPモードはPPTP接続に対応していないということ

だったので、IPsec/L2TPトンネルにチャレンジしてみることとしました。ちなみにググってみると、設定の仕方は諸説ありますが…manファイル調べながらやってみて、以下としました。特にHeartBeatを使用してフローティングIPアドレスを使用してる人にはお役立ちだと思います。

Page Top

今回の目標 anchor.png

以下のようなネットワークでAndroidスマフォと内部LANに立てたIPsec/L2TPサーバとVPN確立を目指します。

IPsec.jpg
Page Top

設定 anchor.png

Page Top

OpenSwan/xl2tpdのインストール anchor.png

OpenSwanはIPsecを提供するツール、xl2tpdはL2TPトンネリングを提供するツールです。

さて、ココで問題。Android4.0(ICS)は、OS標準のIPsec-toolにバグがあり、そのままでは繋がってくれないとのこと。ですが、Portageのパッケージ管理内でなんとか事を済ませたい。このためにかなりイリーガルなやり方をしています。Gentooな方の参考になれば…

まず、OpenSwan2.6.38をAndroid4.0(ICS)で動作できるようにするために、Android4.0(ICS)のバグ回避用パッチをダウンロードしてきます。で、これを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 
Page Top

OpenSwanの設定 anchor.png

今回は、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
Page Top

xl2tpdの設定 anchor.png

/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と合わせます。

Page Top

pppdの設定 anchor.png

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アドレス

さて…サーバの設定は終了

Page Top

セキュリティの設定 anchor.png

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*1を受信するためのポートをオープンします。

更に、NAPTなブロードバンドルータに、UDP 4500 とUDP 500をサーバにNAT変換するアドレス変換テーブルを設定します。

Page Top

接続してみよう anchor.png

Page Top

サーバ群起動 anchor.png

# /etc/init.d/ipsec start
# /etc/init.d/xl2tpd start
Page Top

Android側設定 anchor.png

端末設定→その他→VPN→VPNの追加 選択

名前
適当につけて
種類
L2TP/IPSec PSK
サーバアドレス
IPsec/L2TPサーバのIPアドレス若しくはホスト名
IPsec事前共有鍵
/etc/ipsec.secretsに設定した事前共有鍵

んで、保存。接続するときは

ユーザー名
/etc/ppp/chap-secretsに設定したユーザ名
パスワード
/etc/ppp/chap-secretsに設定したパスワード

で接続をタップ。

Page Top

トラブルシューティング anchor.png

さて…つながりましたか??つながらない場合は…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 =”が一致してないとつながりませんでした。
Page Top

Android VPNでいろいろやってみよう anchor.png

Page Top

Androidから内部サーバへSSH anchor.png

AndroidアプリのConnectBot(SSHアプリ)+Hacker's Keyboardで、3G→サーバログインできました。

Page Top

AndroidからWindowsマシンにリモートデスクトップ anchor.png

おじさんは用途がないのでやってません。LAN内にWindowsを立ててる人は、便利かもね。リモートデスクトップアプリもあるようなので試してみて~

Page Top

DLNAアプリで、動画/音楽/写真をストリーミング anchor.png

Skiftaは、ダメでした。UPnPパケットを通過させてくれないみたい。PlugPlayerは、一度通信できたDLNAサーバを記憶してくれるので、VPNからもうまく閲覧できました。

Page Top

Windows共有ディスクの参照 anchor.png

ESファイルエクスプローラ使用したら意外に簡単にできました。実はDLNAよりも、音楽/写真/動画の共有はこっちのほうが楽かしら…??

Page Top

その他 anchor.png

アイディア募集中。VPNつないでも、できることってあんまりないんだよね…

Page Top

Atheros AR8161 Ethernetコントローラがイケてない? anchor.png

どうも最近の自作マザーに搭載されているEthernetコントローラ Atheros AR8161NICドライバがイケてない模様で、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をインスコすることで解決してしまいました。内蔵EtherはOFFで。なんか負けた気分だけど…安定動作が信条のサーバでは致し方なしですかね。

Page Top

OpenSwan→LibreSwanへ移行 anchor.png

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

Page Top

OpenSwanをアンインストール anchor.png

# emerge -C openswan

おわりです

Page Top

LibreSwanをインストール anchor.png

まず、dev-libs/nss にutilsフラグをつけろと要求してきますので、package.useに追加します

dev-libs/nss utils

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

# emerge --newuse -vuD libreswan

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

Page Top

Android7用に設定を変更する anchor.png

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

ike=3des-sha1,aes-sha1,aes256-sha2_512-sha2_256,aes256;modp1024
phase2alg=3des-sha1,aes-sha1,aes256-sha2_512,aes256-sha2_256;modp1024
sha2-truncbug=yes
Page Top

サービス再起動 anchor.png

# /etc/init.d/ipsec restart
# /etc/init.d/xl2tpd restart

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


*1 Encapseled Security Payload

Front page   Freeze 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: 17584, today: 1, yesterday: 0
Princeps date: 2013-02-18 (Mon) 13:34:09
Last-modified: 2017-08-01 (Tue) 23:56:55 (JST) (2733d) by maruo
ページ内検索

ログイン

ユーザー名:


パスワード:





パスワード紛失

メインメニュー

サブメニュー
自宅鯖計画

Gentoo Linuxな生活

玄箱HGにGentoo格闘記

航空ショーへ行こう

モータースポーツな世界

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

我思う ゆえに我あり



携帯用QRコード