UbuntuでのVPN(L2TP/IPsec)サーバの設定

ALL
スポンサーリンク

Ubuntu18.04 での VPN(L2TP/IPsec)サーバの構築方法です。

CentOSの場合は、次の記事を見てください。
VPN(L2TP/IPsec)サーバの設定 パソコン鳥のブログ

CentOS/OpenVPN の場合は、次の記事です。

OpenVPNの設定(通信をVPNサーバ経由にする設定も) パソコン鳥のブログ
OpenVPNで ID/パスワード認証する パソコン鳥のブログ

スポンサーリンク

ここで構築するVPN

・VPNサーバは Ubuntu18.04
・VPNサーバのVPN側アドレスは 192.168.11.99
・VPNクライアントのアドレスは 192.168.11.128-192.168.11.254
・VPN接続後、クライアントの全ての通信は VPNサーバ経由で行われます。
・VPNの暗号化は事前共有鍵方式、ユーザ/パスワードは、サーバ内のファイルで指定
・VPNクライアント同士は接続できません
・Windows,スマホ(Android)から接続可能(iOS10も可能なはずですが未確認です)

必要パッケージのインストール

apt-get install strongswan xl2tpd

l2tpの設定

xl2tpd.conf に以下の内容を追加します。

/etc/xl2tpd/xl2tpd.conf

[lns default]
ip range = 192.168.11.128-192.168.11.254
local ip = 192.168.11.99
pppoptfile=/etc/ppp/options.l2tpd

ip range : VPNクライアントに割り振られるIPアドレス
local ip : VPNサーバに割り当てるIPアドレス

ここで設定するIPアドレスは、VPNサーバで使用しているアドレスとは異なるサブネットにする必要があります。

次の各パラメータを設定します。

/etc/ppp/options.l2tpd

ms-dns  8.8.8.8
mtu 1358
mru 1358

ms-dns の行は、DNSサーバを指定します。
指定可能なDNSサーバがあれば、それを指定ます。
無い場合は、Google Public DNS である 8.8.8.8 を設定しておきます。

mtu , mru は、ここではとりあえず 1358 を指定します。

ネットワーク上を流れるパケットは、MTU と呼ばれる一定サイズに分割されています。
VPN では、このパケットに加えて、VPN用のヘッダー(IPsec等のヘッダー)が付加されます。

この VPN用のヘッダーが付いたパケットのサイズが MTU を超えると、通信効率が悪くなります。
そこで、大方のネットワークの MTU より 小さくなる値が、先の値 1358 です。
この値を指定しておけば、多くのネットワークで問題ないでしょう。

options.l2tpd に次の各パラメータも設定します。

/etc/ppp/options.l2tpd

refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
name xl2tpd

これらの設定は、認証方式 MSChap-v2 のみを許可しています。

name の値は、自由に設定してもOKです。
ここで指定した name の値は、後述の /etc/ppp/chap-secrets で使用します。

VPN接続時に要求されるユーザID、パスワードを次のファイルに設定します。
複数ユーザIDを用意する場合は、複数行記述します。

/etc/ppp/chap-secrets

"user"          xl2tpd        "pass"  *

user の個所にユーザ名、pass にダブルクォーテーションでくくったパスワードを指定します。
xl2tpd の個所は、先述の options.xl2tpd ファイルの name で指定した値を記述します。
最後の * は接続可能なアドレスを指定する個所ですが、どこからでも接続可能にするために * を指定しています。

chap-secrets ファイルは、管理者以外は見えないようにする必要があります。
デフォルトでは、所有者 root で -rw——- になっています。
このようになっていない場合、chmod 600 /etc/ppp/chap-secrets で権限を設定して下さい。

IPsec の設定

ipsec.conf を次の内容にします。
virtual_private で列挙されているネットワークアドレス以外を、xl2tpd.conf の ip range パラメータで指定していた場合は、ここの virtual_private に追加します。
今回の例では、xl2tpd.conf で記述した 192.168.11.128-192.168.11.254 は、192.168.0.0/16 内なので、このままにします。

/etc/ipsec.conf

config setup
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,%v4:100.64.0.0/10,%v6:fd00::/8,%v6:fe80::/10

conn L2TP-PSK-NAT
dpddelay=10
dpdtimeout=20
dpdaction=clear
rightsubnet=0.0.0.0/0
also=L2TP-PSK-noNAT

conn L2TP-PSK-noNAT
authby=secret
pfs=no
auto=add
keyingtries=3
rekey=no
ikelifetime=8h
keylife=1h
type=transport
left=%defaultroute
leftprotoport=17/1701
right=%any
rightprotoport=17/%any
ike=aes256-sha1-modp1024

各パラメータの意味については、VPN(L2TP/IPsec)サーバの設定 の「IPsec の設定」の個所を参照して下さい。
なお、このリンク先の個所はCentOS用の設定で forceencaps=yes にしていますが、Ubuntu ではこれを設定するとVPN接続できないので、この設定は記述しないでください。

2019.2.3
パラメータに
ike=aes256-sha1-modp1024
を追加しました。
これが無いと、スマホからのVPN接続が失敗しました

次にVPN接続時に使用する、事前共有鍵を、ファイル ipsec.secrets に設定します。
下記の PSKで事前共有鍵方式であることを指定しています。
“test” の個所が事前共有鍵です。

/etc/ipsec.secrets

: PSK "test"

ipsec.secrets ファイルは、管理者以外は見えないようにする必要があります。
デフォルトでは、所有者 root で -rw——- になっています。
このようになっていない場合、chmod 600 /etc/ipsec.secrets で権限を設定して下さい。

Linuxカーネルパラメータの設定

VPN接続が可能になるように、ネットワークに関するカーネルパラメータを設定します。

/etc/sysctl.conf の末尾に以下の内容を追加します。

/etc/sysctl.conf

net.ipv4.ip_forward = 1

次のコマンドで設定を反映します。

sysctl -p

ファイアウォール設定

ファイアウォールの設定を行います。

ufw enable
ufw allow to any port 1701
ufw allow to any port 4500
ufw allow to any port 500
ufw allow to any proto esp
ufw allow to any proto ah

/etc/ufw/before.rules

末尾に下記を追加します
*nat
-A POSTROUTING -s 192.168.11.128/25 -j MASQUERADE
COMMIT

/etc/default/ufw

DEFAULT_FORWARD_POLICY を ACCEPT にします。

設定を反映させます。

ufw reload

サービスを起動します。

systemctl restart strongswan
systemctl restart xl2tpd

以上、Ubuntu でのVPNサーバの設定でした。

これで、Windows,スマホ(Android)から接続可能(iOS10も可能なはずですが未確認)です。
接続方法は次の記事を参照してください。

VPN(L2TP/IPsec)クライアントの設定(Windows/Androidスマホ)

なお、上記記事中の 事前共有鍵、ユーザー名、パスワードは、本記事中の次のファイルで設定したものを指定して下さい。
事前共有鍵:/etc/ipsec.secrets
ユーザー名、パスワード:/etc/ppp/chap-secrets

参考

strongSwan + xl2tpd でVPN(L2TP/IPsec)を構築する – Qiita
L2TP/IPsec VPN – Tomorrow is always fresh with no mistake in it.@備忘録 – アットウィキ

コメント