VPN(L2TP/IPsec)サーバの構築方法です。
以前紹介した手順(この記事)は libreswan を使った構築方法でしたが、VPNクライアントが複数台の場合、通信が不安定だったので、strongswan を使った手順を説明します。
OpenVPN の場合は、次の記事です。
OpenVPNで ID/パスワード認証する パソコン鳥のブログ
OpenVPNの設定(通信をVPNサーバ経由にする設定も) パソコン鳥のブログ
ここで構築するVPN
・VPNサーバは CentOS6/7
・VPNサーバのVPN側アドレスは 192.168.11.99
・VPNクライアントのアドレスは 192.168.11.128-192.168.11.254
・VPN接続後、クライアントの全ての通信は VPNサーバ経由で行われます。
・VPNの暗号化は事前共有鍵方式、ユーザ/パスワードは、サーバ内のファイルで指定
・VPNクライアント同士の相互アクセス可/不可は、いずれもファイアウォールの設定(記事中に説明あり)で対応できます。
・Windows,スマホ(Android)から接続可能(iOS10も可能なはずですが未確認です)
必要パッケージのインストール
初めにEPELリポジトリを使用できるようにします。
次の記事の手順をおこなってください。
CentOS6/7でEPELリポジトリを利用する設定 パソコン鳥のブログ
必要パッケージをインストールします。
yum --enablerepo=epel install strongswan xl2tpd
l2tpの設定
次の個所を修正します。
/etc/xl2tpd/xl2tpd.conf
ip range = 192.168.11.128-192.168.11.254 local ip = 192.168.11.99
ip range : VPNクライアントに割り振られるIPアドレス
local ip : VPNサーバに割り当てるIPアドレス
ここで設定するIPアドレスは、VPNサーバで使用しているアドレスとは異なるサブネットにする必要があります。
次の各パラメータの値を、次のように設定します。
/etc/ppp/options.xl2tpd
ms-dns 8.8.8.8 #crtscts #lock mtu 1358 mru 1358
ms-dns の行は、DNSサーバを指定します。
指定可能なDNSサーバがあれば、それを指定ます。
無い場合は、Google Public DNS である 8.8.8.8 を設定しておきます。
また、crtscts と lock をコメントアウトします。
コメントアウトしないと、xl2tpが起動に失敗します。
mtu , mru は、ここではとりあえず 1358 を指定します。
ネットワーク上を流れるパケットは、MTU と呼ばれる一定サイズに分割されています。
VPN では、このパケットに加えて、VPN用のヘッダー(IPsec等のヘッダー)が付加されます。
この VPN用のヘッダーが付いたパケットのサイズが MTU を超えると、通信効率が悪くなります。
そこで、大方のネットワークの MTU より 小さくなる値が、先の値 1358 です。
この値を指定しておけば、多くのネットワークで問題ないでしょう。
また、proxyarp の行があることを確認します。
これが無いと、Windows からの VPN接続が失敗します。
次の各パラメータを追加します。
/etc/ppp/options.xl2tpd
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 で指定した値を記述します。
最後の * は接続可能なアドレスを指定する個所ですが、どこからでも接続可能にするために * を指定しています。
管理者以外は見えないようにします。
chmod 600 /etc/ppp/chap-secrets
IPsec の設定
ipsec.conf を、次の内容にします。
/etc/strongswan/ipsec.conf
config setup conn L2TP-PSK-NAT dpddelay=10 dpdtimeout=20 dpdaction=clear rightsubnet=0.0.0.0/0 forceencaps=no also=L2TP-PSK-noNAT conn L2TP-PSK-noNAT authby=secret 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,3des-sha1-modp1024! esp=aes256-sha1,3des-sha1!
以下は ipsec.conf の設定の詳細ですが、読み飛ばしても構いません。
その場合は、後述の default.secrets の個所から進めて下さい。
パラメータに left~ と right~ がありますが、remote/local やサーバ/クライアントの設定というような位置づけです。
left~ と right~ をつなげる、という認識でOKです。
left,right のどちらが remote/local や サーバ/クライアント かは決まりはありません。
leftprotoport/rightprotoport でポート番号を記述した方が、サーバと考えて下さい。
今回の例では、left~ がサーバ側の設定、right~がクライアント側の設定です。
一部のパラメータについて以下に説明します。
conn の行は、conn セクション名 の書式です。セクション名は自由に決めてOKです。
conn L2TP-PSK-NAT rightsubnet=0.0.0.0/0 どこからでも接続できるようにする。right側(クライアント側)がNAT環境でも可。 forceencaps=no ESP プロトコルを強制的にカプセル化するかどうかの指定で、no にしておきます。 no にしておかないと、Windowsから接続出来ませんでした。 also=L2TP-PSK-noNAT also=セクション名 の書式で、指定されたセクション名のパラメータがセットされる。 この例では、conn L2TP-PSK-noNAT で記述されている内容をセットします。 conn L2TP-PSK-noNAT authby=secret 共有秘密鍵方式を指定する auto=add IPsec接続で、自動キーリングで接続待ちで起動する。 VPNサーバとして起動するので、addを指定。 type=transport IPsecのモードを指定する。ホスト間で接続するので transport を指定する。 left=%defaultroute サーバ側なので %defaultroute を指定する。%defaultroute で、サーバのデフォルトルートインタフェースのIPアドレスが指定される。 leftprotoport=17/1701 プロトコル番号17番(UDP)、ポート番号 1701 を指定する。 right=%any クライアント側なので、IPアドレスは何でもOKにするために %any を指定する。 rightprotoport=17/%any プロトコル番号17番(UDP)、クライアント側なので、ポート番号は何でもOKにするために %any を指定する。 ike=aes256-sha1-modp1024,3des-sha1-modp1024! esp=aes256-sha1,3des-sha1! これが無いと、スマホからのVPN接続が失敗しました。この設定で、Android6.0、Android8.1から接続OKでした。
VPN接続時に使用する、事前共有鍵を、ファイル ipsec.secrets に設定します。
下記の PSKで事前共有鍵方式であることを指定しています。
“test” の個所が事前共有鍵です。
/etc/strongswan/ipsec.secrets
: PSK "test"
管理者以外は見えないようにします。
chmod 600 /etc/strongswan/ipsec.secrets
Linuxカーネルパラメータの設定
VPN接続が可能になるように、ネットワークに関するカーネルパラメータを設定します。
/etc/sysctl.conf の末尾に以下の内容を追加します。
以下で enp0s3 や eth0 の個所は、各自の環境に合わせて下さい。
CentOS7の場合
net.ipv4.ip_forward = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.default.rp_filter = 0 net.ipv4.conf.enp0s3.accept_redirects = 0 net.ipv4.conf.enp0s3.send_redirects = 0 net.ipv4.conf.enp0s3.rp_filter = 0 net.ipv4.conf.lo.accept_redirects = 0 net.ipv4.conf.lo.send_redirects = 0 net.ipv4.conf.lo.rp_filter = 0 net.ipv4.conf.ip_vti0.rp_filter = 0
CentOS6の場合
net.ipv4.ip_forward = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.eth0.accept_redirects = 0 net.ipv4.conf.eth0.send_redirects = 0 net.ipv4.conf.lo.accept_redirects = 0 net.ipv4.conf.lo.send_redirects = 0
CentOS6/7 とも、次のコマンドで設定を反映します。
/sbin/sysctl -p
ファイアウォール設定
ファイアウォールの設定を行います。
CentOS7の場合
firewalld の設定を行います。iptables を使用している場合は、”CentOS6/iptablesの場合” の方の作業を行ってください。
なお、以下のルールは、VPNクライアント同士のアクセスができないようにしています。
出来るようにするには、「-j DROP」の行を削除して下さい。
firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 1 -i ppp+ -o ppp+ -j DROP firewall-cmd --permanent --add-service=ipsec firewall-cmd --permanent --add-port=1701/udp firewall-cmd --permanent --add-port=4500/udp firewall-cmd --permanent --add-masquerade firewall-cmd --reload
CentOS6/iptablesの場合
/etc/sysconfig/iptables の –dport 22 の次の行あたりに、以下の内容を追加します。
なお、以下のルールは、VPNクライアント同士のアクセスができないようにしています。
出来るようにするには、「-j DROP」の行を削除して下さい。
-A INPUT -p esp -j ACCEPT -A INPUT -p ah -j ACCEPT -A INPUT -p udp -m udp --dport 1701 -j ACCEPT -A INPUT -p udp -m udp --dport 500 -j ACCEPT -A INPUT -p udp -m udp --dport 4500 -j ACCEPT -I INPUT -i ppp+ -j ACCEPT -A FORWARD -i ppp+ -o ppp+ -j DROP -A FORWARD -i ppp+ -j ACCEPT -A FORWARD -o ppp+ -j ACCEPT
また、/etc/sysconfig/iptables の *nat ~ COMMIT の間で、COMMIT の直前に以下の内容を追加します。
-A POSTROUTING -s 192.168.11.128/25 -j MASQUERADE
設定を反映させます。
/etc/init.d/iptables restart
起動設定・確認
CentOS7の場合 systemctl enable xl2tpd systemctl enable ipsec systemctl restart strongswan systemctl restart xl2tpd CentOS6の場合 chkconfig --level 2345 strongswan on chkconfig --level 2345 xl2tpd on service strongswan restart service xl2tpd restart
2019.9.29
chkconfig の行を追加しました。
以上、VPNサーバの設定でした。
これで、Windows,スマホ(Android)から接続可能(iOS10も可能なはずですが未確認)です。
Windows/スマホからのVPN接続方法は、次の記事を参照して下さい。
VPN(L2TP/IPsec)クライアントの設定(Windows/Androidスマホ) パソコン鳥のブログ
参考
EZ-NET: CentOS 6.0 で L2TP-VPN サーバを構築する
CentOS 6.x で StrongSwan を使った L2TP over IPsec 環境を作る – らくがきちょう
19. VPNサーバの構築 – strongswan/xl2tpd/freeradius [さくらのVPS/CentOS7] – ma3ki’s memo
コメント