IPsec / XAuth でサクッと VPN サーバを立てる


手軽に VPN をサーバを立ててみようと思い、比較的サクッと作れそうな IPsec XAuth PSK を strongSwan で作ってみたのでメモ。

OS は Ubuntu 16.04 。

strongSwan を設定する

インストール

# apt install strongswan strongswan-plugin-xauth-generic

設定

/etc/ipsec.conf
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

共有鍵とユーザーの設定

/etc/ipsec.secret
: 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 のラッパーが入っているのでそれを使う。

/etc/ufw/sysctl.conf
net/ipv4/ip_forward=1 # コメントアウトを外す

before.rules に NAT 設定を追加する。
今回の場合、VPN クライアントには 192.168.0.0/24 を割り当て、インターネットに繋がるインタフェースは eth0 だったので以下のように設定した。

/etc/ufw/before.rules
# 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 制限などはかけてほしくないので以下のように設定を変更する。

/etc/default/ufw
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 にするしかないようだ。

[追記2] ついでに各 OS の対応状況をまとめた

IPsec 認証方式の各 OS の対応状況 - Qiita