Ubuntu
VPN
ipsec

strongSwan + xl2tpd でVPN(L2TP/IPsec)を構築する

More than 1 year has passed since last update.

執筆時点の環境

ここではstrongSwan, xl2tpdを使用してIPSec/L2TPなVPNを使用可能にします。

  • UbuntuServer 16.04.1 LTS (SELinux 無効化)
  • strongSwan v5.3.5
  • xl2tpd v1.3.6

やりたい事

外出先から自宅のマシンへアクセスできるようにしてみます。

┌─────────────────┐             ┌─────┐          ┌────────┐
│ Android,Windows │-(Internet)->│ NAT │--(LAN)-->│ Server │
└─────────────────┘             └─────┘          └────────┘

以下のOSで接続確認しています。

  • Windows 10: L2TP/IPSec PSK
  • Android 6.0.1: L2TP/IPSec PSK

手順

必要アプリの導入

$ sudo apt-get install -y strongswan xl2tpd

各種設定

strongSwan (IPSec)

/etc/ipsec.conf
# IPSec 接続設定
# 以下の記述をipsec.confへ追記する。細かい設定項目は公式資料を参照すること。
# https://wiki.strongswan.org/projects/strongswan/wiki/IpsecConf

config setup
    # 必須。VPNクライアントがNATの内側にある場合に必要。
    nat_traversal=yes
# デフォルト設定(全接続の共通設定が記述されます)
conn %default
    # 必須。strongSwan起動時に接続プロファイルを受信待機状態にする。
    auto=add
# L2TP/IPSec用接続設定
conn L2TP-NAT
    # 必須。IPSec/L2TPではIPSecはHost to Hostで繋ぐ。
    type=transport
    # 省略可。指定するならばVPNサーバーのIPアドレス。
    # (ex: 192.168.x.x)
    #left=%any 
    # 必須(default: pubkey)。認証方式。事前共有鍵を使用。
    leftauth=psk
    # 省略可。VPNクライアントのIPアドレス
    # (ex: 192.168.y.y)
    #right=%any
    # 必須。認証方式。事前共有鍵を使用。
    rightauth=psk
/etc/ipsec.secrets
# IPSec 認証用情報
# 以下の記述をAAAを埋めた上でipsec.secretsの先頭へ追記する。
# 細かい設定項目は公式資料のPSKの章を参照すること。
# https://wiki.strongswan.org/projects/strongswan/wiki/IpsecSecrets
# (ex:
#      : PSK "abcd")
: PSK "AAA" #事前共有鍵

xl2tpd (L2TP)

/etc/xl2tpd/xl2tpd.conf
; 以下の記述のzA-zZ,XXXを埋めたものを元ファイルへ追記する。
; 細かい設定項目はmanコマンドを参照すること。
; man xl2tpd.conf

[lns default]                               ; Our fallthrough LNS definition
  ; VPNクライアントへ振るIPアドレス範囲
  ; (ex: 192.168.z.1-192.168.z.254)
  ip range = zA-zZ                          ; * Allocate from this IP range
  ; VPNサーバーのIPアドレス
  ; (ex: 192.168.x.x)
  local ip = XXX                            ; * Our local IP to use
  length bit = yes                          ; * Use length bit in payload?
  refuse pap = yes                          ; * Refuse PAP authentication
  refuse chap = yes                         ; * Refuse CHAP authentication
  require authentication = yes              ; * Require peer to authenticate
  name = l2tp                               ; * Report this as our hostname
  pppoptfile = /etc/ppp/options.l2tpd.lns   ; * ppp options file
/etc/ppp/options.l2tpd.lns
name l2tp
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
nodefaultroute
lock
nobsdcomp
mtu 1280
mru 1280
logfile /var/log/xl2tpd.log
/etc/ppp/chap-secrets
# 以下の記述のUserName ,Passwordを埋めたものをchap-secretsへ追記する。
# (ex: "carol" * "abcd123" *)。

# Secrets for authentication using CHAP
# client    server  secret          IP addresses
"UserName" * "Password" *

sysctl

/etc/sysctl.conf
#サーバーがVPNクライアントと内部ネットワークを繋ぐルーター
#として機能できるよう以下の設定をsysctl.confへ追記する。
net.ipv4.ip_forward=1

その他の設定

  • NATのポート開放
    UDP 500,4500ポートの受信を許可する必要があります。
  • ルーターを設定変更
    VPNサーバーの所属ネットのルーターにはVPNクライアントへ振られるIPアドレスの経路設定を行う必要があります。
    192.168.z.0/24 → 192.168.x.x
  • クライアントの設定変更
    NATの内側にあるVPNサーバーへ外側のWindowsクライアントから接続する場合、Windowsはレジストリから設定変更する必要があります。
    https://support.microsoft.com/ja-jp/kb/926179

設定を適用

strongSwan, xl2tpdを再起動します。VPNクライアントから接続できれば成功。

#デーモンを再起動
sudo systemctl restart strongswan
sudo systemctl restart xl2tpd
sudo sysctl -p

参考資料