手軽に VPN をサーバを立ててみようと思い、比較的サクッと作れそうな IPsec XAuth PSK を strongSwan で作ってみたのでメモ。
OS は Ubuntu 16.04 。
strongSwan を設定する
インストール
# apt install strongswan strongswan-plugin-xauth-generic
設定
config setup
nat_traversal=yes
conn %default
leftsubnet=0.0.0.0/0
auto=add
# クライアントに割り振られる IP の範囲
# サーバが所属するネットワークのアドレスと被らないようにする
rightsourceip=192.168.0.0/24
rightdns=8.8.8.8
dpdaction=clear
conn XAuth
leftauth=psk
rightauth=psk
rightauth2=xauth
共有鍵とユーザーの設定
: PSK "ABABABABA" # ここに共有鍵を入れる
foo : XAUTH "foo_user_password"
bar : XAUTH "bar_user_password"
ポートを開ける
- UDP 500 (IKE)
- UDP 4500 (IPsec NAT-T)
今回は XAuth なので必要ないが L2TP を使う場合は UDP 1701 も開ける必要がある。
Virtual IP の経路を設定する
この時点で VPN へ接続することはできるが、まだ VPN からインターネットに出ることができない。VPN クライアント(今回の場合 192.168.0.0/24)からのパケットをインターネットに繋がるネットワーク(今回の場合 eth0)に流すために NAT の設定をする。
Ubuntu の場合は ufw という iptables のラッパーが入っているのでそれを使う。
net/ipv4/ip_forward=1 # コメントアウトを外す
before.rules に NAT 設定を追加する。
今回の場合、VPN クライアントには 192.168.0.0/24
を割り当て、インターネットに繋がるインタフェースは eth0
だったので以下のように設定した。
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
COMMIT
ufw を使っていなかった場合
サーバーの手前にファイアウォールがあったり AWS でセキュリティグループを設定していたりして ufw は有効になっていない(有効にする必要がなかった)場合では、NAT の機能は使いたいが IP 制限などはかけてほしくないので以下のように設定を変更する。
DEFAULT_INPUT_POLICY="ACCEPT"
DEFAULT_FORWARD_POLICY="ACCEPT"
ufw を有効にする
ここで設定をミスっていると ssh できなくなったりするので注意
# ufw enable
クライアントを設定する
Mac の場合はこんな感じで。
補足: 他の認証方式について
実ははじめは IKEv2 (IPSec EAP MSCHAPv2) で作っていたのだが、クライアントの問題で XAuth で作り直すことにした。
Android は OS 標準で IKEv2 には対応しておらずクライアントアプリを入れる必要があったり、Mac OS X El Capitan では IKEv2 が使えないバグがあったりして、まだ「とりあえず IKEv2 にしておけば良い」という世界観ではなさそう。
ちなみに L2TP/IPsec もやってみたが、XAuth ほど簡単ではないもののそれほど難しくなかった。ググッて出てくる情報も多いし L2TP でも良いと思う。
[追記1] Windows 10 だと XAuth IPsec 使えんかった\(^o^)/
Windows 10 でテストしようと思ったら選択肢が「PPTP」「L2TP/IPsec RSA」「L2TP/IPsec PSK」「SSTP」「IKEv2」しかなく、見事に爆死。
幅広い OS に標準で対応している方式を選ぶなら結局 L2TP/IPsec にするしかないようだ。