Debian 9でL2TP/IPSecのVPNサーバーを構築する
1,初めに
本稿はDebian 9でL2TP/IPSecを用いたVPNサーバーを構築した際の実施記録である。
VPNサーバーを構築する際に、使用できるソフトウェアはいくつかある。
本件構築では、下記のソフトウェアを使用し、設定を行なった。
- strongswan
- xl2tpd
2,導入手順
(0)実行要件
本稿は、以下を実行要件とする。
- 異常事態が起きてもパニックにならないこと
- バックアップ取得済みであること(私は忘れてました)
(1)各種ソフトウェアのインストール
(A)strongswanのインストール
まず、Linux向けのIPsec実装である「strongswan」のインストールを行う。
下記のコマンドを実行する。
apt-get install strongswan
上記コマンドすると、下記が表示された。
root@TESTSPACE:~# apt-get install strongswan Reading package lists… Done Building dependency tree Reading state information… Done The following additional packages will be installed: libstrongswan libstrongswan-standard-plugins strongswan-charon strongswan-libcharon strongswan-starter Suggested packages: libstrongswan-extra-plugins libcharon-extra-plugins The following NEW packages will be installed: libstrongswan libstrongswan-standard-plugins strongswan strongswan-charon strongswan-libcharon strongswan-starter 0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. Need to get 1,205 kB of archives. After this operation, 3,409 kB of additional disk space will be used. Do you want to continue? [Y/n] y Get:1 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 libstrongswan amd64 5.5.1-4+deb9u4 [388 kB] Get:2 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 strongswan-starter amd64 5.5.1-4+deb9u4 [233 kB] Get:3 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 strongswan-libcharon amd64 5.5.1-4+deb9u4 [280 kB] Get:4 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 strongswan-charon amd64 5.5.1-4+deb9u4 [87.3 kB] Get:5 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 libstrongswan-standard-plugins amd64 5.5.1-4+deb9u4 [125 kB] Get:6 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 strongswan all 5.5.1-4+deb9u4 [92.7 kB] Fetched 1,205 kB in 1s (925 kB/s) Preconfiguring packages … Selecting previously unselected package libstrongswan. (Reading database … 30852 files and directories currently installed.) Preparing to unpack …/0-libstrongswan_5.5.1-4+deb9u4_amd64.deb … Unpacking libstrongswan (5.5.1-4+deb9u4) … Selecting previously unselected package strongswan-starter. Preparing to unpack …/1-strongswan-starter_5.5.1-4+deb9u4_amd64.deb … Unpacking strongswan-starter (5.5.1-4+deb9u4) … Selecting previously unselected package strongswan-libcharon. Preparing to unpack …/2-strongswan-libcharon_5.5.1-4+deb9u4_amd64.deb … Unpacking strongswan-libcharon (5.5.1-4+deb9u4) … Selecting previously unselected package strongswan-charon. Preparing to unpack …/3-strongswan-charon_5.5.1-4+deb9u4_amd64.deb … Unpacking strongswan-charon (5.5.1-4+deb9u4) … Selecting previously unselected package libstrongswan-standard-plugins. Preparing to unpack …/4-libstrongswan-standard-plugins_5.5.1-4+deb9u4_amd64.deb … Unpacking libstrongswan-standard-plugins (5.5.1-4+deb9u4) … Selecting previously unselected package strongswan. Preparing to unpack …/5-strongswan_5.5.1-4+deb9u4_all.deb … Unpacking strongswan (5.5.1-4+deb9u4) … Setting up libstrongswan (5.5.1-4+deb9u4) … Setting up strongswan-starter (5.5.1-4+deb9u4) …
(B)xl2tpdのインストール
今回構築するVPNサーバーは、Layer 2のトンネリングプロトコルを使用する。
そこで、L2TPのLinux実装である「xl2tpd」のインストールを行う。
下記のコマンドを実行する。
apt-get install xl2tpd
上記コマンドを実行すると、下記が表示された。
root@TESTSPACE:~# apt-get install xl2tpd Reading package lists… Done Building dependency tree Reading state information… Done The following additional packages will be installed: libpcap0.8 ppp The following NEW packages will be installed: libpcap0.8 ppp xl2tpd 0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. Need to get 563 kB of archives. After this operation, 1,507 kB of additional disk space will be used. Do you want to continue? [Y/n] y Get:1 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 libpcap0.8 amd64 1.8.1-3 [138 kB] Get:2 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 ppp amd64 2.4.7-1+4 [346 kB] Get:3 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 xl2tpd amd64 1.3.8+dfsg-1 [78.1 kB] Fetched 563 kB in 0s (816 kB/s) Selecting previously unselected package libpcap0.8:amd64. (Reading database … 31041 files and directories currently installed.) Preparing to unpack …/libpcap0.8_1.8.1-3_amd64.deb … Unpacking libpcap0.8:amd64 (1.8.1-3) … Selecting previously unselected package ppp. Preparing to unpack …/ppp_2.4.7-1+4_amd64.deb … Unpacking ppp (2.4.7-1+4) … Selecting previously unselected package xl2tpd. Preparing to unpack …/xl2tpd_1.3.8+dfsg-1_amd64.deb … Unpacking xl2tpd (1.3.8+dfsg-1) … Processing triggers for libc-bin (2.24-11+deb9u4) … Processing triggers for systemd (232-25+deb9u12) … Setting up libpcap0.8:amd64 (1.8.1-3) … Setting up ppp (2.4.7-1+4) … Created symlink /etc/systemd/system/multi-user.target.wants/pppd-dns.service → /lib/systemd/system/pppd-dns.service. Setting up xl2tpd (1.3.8+dfsg-1) … Processing triggers for libc-bin (2.24-11+deb9u4) … Processing triggers for systemd (232-25+deb9u12) …
(2)各種ファイルの設定
以上で、ソフトウェアの導入は完了した。
次に、導入したソフト及び、ネットワーク設定の変更を行う。
(A) VPN接続ユーザー情報
下記のファイルにVPN接続ユーザー情報を記載する。
/etc/ppp/chap-secrets
任意のIDとパスワードを記載し、ファイルを更新する。
この時「server」欄の設定値は後述の(C) ppp options fileで設定する「name」の値を使用する。
# Secrets for authentication using CHAP # client server secret IP addresses vpnuser l2tp password *
(B) xl2tpdの設定
下記のファイルにL2TPを使用するためのソフトウェアの設定を記載する。
/etc/xl2tpd/xl2tpd.conf
下記のように設定した。
[global] ; VPN接続ユーザーのIDとパスワード auth file = /etc/ppp/chap-secrets [lns default] ; VPN接続してきた端末に割り当てるIPアドレス領域 ip range = 192.168.0.10-192.168.0.19 ; VPNサーバーのローカルIPアドレス local ip = 192.168.0.130 ; * Use length bit in payload? length bit = yes ; * Refuse PAP authentication refuse pap = yes ; * Refuse CHAP authentication refuse chap = yes ; * Require peer to authenticate require authentication = yes ; * Report this as our hostname name = TESTSPACE ; * ppp options file pppoptfile = /etc/ppp/options.l2tpd.lns
(C) ppp options fileの設定
設定用ファイルの格納先を先ほど指定した(pppopfileのところ)。
/etc/ppp/options.l2tpd.lns
そのファイルを新規作成し、下記を記載した。
name l2tp ipcp-accept-local ipcp-accept-remote refuse-pap refuse-chap refuse-mschap require-mschap-v2 nodefaultroute # パケット圧縮を使用しない nobsdcomp mtu 1480 mru 1480 lock logfile /var/log/xl2tpd.log ms-dns 8.8.8.8 netmask 255.255.255.0 persist
ここで指定したログファイルについて、手動で新規作成を行なった。
また、登録する最適なMTU値の調査を下記のサイトを参考に行なった。
Linux – MTU 最適値の導出! – mk-mode BLOG
弊環境で調査をしたところ、下記の結果が得られた。
root@TESTSPACE:/etc/ppp# ping -c 1 -s 1452 -M do www.google.co.jp PING www.google.co.jp(nrt12s14-in-x03.1e100.net (2404:6800:4004:81b::2003)) 1452 data bytes 76 bytes from nrt12s14-in-x03.1e100.net (2404:6800:4004:81b::2003): icmp_seq=1 ttl=55 (truncated) --- www.google.co.jp ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 1.301/1.301/1.301/0.000 ms root@TESTSPACE:/etc/ppp# ping -c 1 -s 1453 -M do www.google.co.jp PING www.google.co.jp(nrt13s51-in-x03.1e100.net (2404:6800:4004:819::2003)) 1453 data bytes --- www.google.co.jp ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms
パケットサイズ1452では断片化をせずに通信ができていたが、1453ではできなくなっている。
つまり、弊環境では、MTU値は、1452にICMPヘッダー(28)を加えた1480が適正値と言える。
(D) IPsecの設定
IPsecの設定を行うため、下記のファイルを編集する。
/etc/ipsec.conf
以下を記載した。
# ipsec.conf - strongSwan IPsec configuration file # basic configuration config setup nat_traversal=yes conn %default auto=add conn L2TP-NAT rightsubnet=0.0.0.0/0 also=L2TP-noNAT conn L2TP-noNAT forceencaps=yes authby=secret auto=add keyexchange=ikev1 keyingtries=3 ike=aes128-sha1-modp3072 esp=aes128-sha1-modp3072 rekey=no ikelifetime=60m keylife=20m lifetime=1h type=transport # Server global IP addr left=AAA.BBB.CCC.DDD leftprotoport=17/1701 right=%any rightprotoport=17/%any # for iOS client dpddelay=40 dpdtimeout=130 dpdaction=clear
上記の「left」欄にはサーバーのグローバルIPアドレスを指定する。
この指定がないと、VPN接続の際にエラー(no IKE config found)が発生する。
また接続用のシークレットキーとして、以下のファイルの編集を行う。
/etc/ipsec.secrets
# This file holds shared secrets or RSA private keys for authentication. : PSK "testVpnPassWord_20191006" # RSA private key for this host, authenticating it to any other host which knows the public part. # this file is managed with debconf and will contain the automatically created private key include /var/lib/strongswan/ipsec.secrets.inc
(E) strongSwanの設定
以下のファイルを編集する。
/etc/strongswan.conf
DNSを設定する為に、以下の記述を追加する。
# strongswan.conf - strongSwan configuration file # # Refer to the strongswan.conf(5) manpage for details # Configuration changes should be made in the included files charon { load_modular = yes plugins { include strongswan.d/charon/*.conf } dns1 = 8.8.8.8 dns2 = 8.8.4.4 } include strongswan.d/*.conf
(F) カーネルパラメータの設定
Linuxのカーネルパラメータを設定する為に、以下のファイルを編集する。
/etc/sysctl.conf
以下の内容を追記する。
# 修正 net.ipv4.ip_forward = 1 # 以下は追記 net.core.xfrm_larval_drop = 1 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.eth0.send_redirects = 0 net.ipv4.conf.eth1.send_redirects = 0 net.ipv4.conf.lo.send_redirects = 0 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.eth0.accept_redirects = 0 net.ipv4.conf.eth1.accept_redirects = 0 net.ipv4.conf.lo.accept_redirects = 0 net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.default.rp_filter = 0 net.ipv4.conf.eth0.rp_filter = 0 net.ipv4.conf.lo.rp_filter = 0
上記の記載後、設定を反映させるの為以下のコマンドを実行する。
sysctl -p
正常に実行されると、以下の出力がでる。
root@TESTSPACE:/etc# sysctl -p net.ipv4.ip_forward = 1 net.core.xfrm_larval_drop = 1 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.eth0.send_redirects = 0 net.ipv4.conf.eth1.send_redirects = 0 net.ipv4.conf.lo.send_redirects = 0 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.eth0.accept_redirects = 0 net.ipv4.conf.eth1.accept_redirects = 0 net.ipv4.conf.lo.accept_redirects = 0 net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.default.rp_filter = 0 net.ipv4.conf.eth0.rp_filter = 0 net.ipv4.conf.lo.rp_filter = 0
(G) IPTABLESの設定
以上の手順で基本的なVPN関連のソフトウェアのインストールと設定が完了した。
ここでは、インストールしたVPNソフトウェアが行う通信が、ファイアウォールで弾かれないように設定をする。
通信種別 | ポート番号 |
TCP (ESP) | 50 |
UDP (ESP) | 50 |
UDP (IKE) | 500 |
UDP (L2TP) | 1701 |
UDP (IPsec) | 4500 |
上記のポート解放のため、以下の設定をファイアウォールに行う。
なお、弊環境では、ファイアウォールの設定永続化を行っており、
その設定ファイルを変更する(詳細についてはこの記事に記載した)。
/etc/iptables/rules.v4
# Allow VPN # L2TP over IPsec -A INPUT -p udp --dport 500 -j ACCEPT -A INPUT -p udp --dport 1701 -j ACCEPT -A INPUT -p udp --dport 4500 -j ACCEPT -A INPUT -p tcp --dport 50 -j ACCEPT -A INPUT -p udp --dport 50 -j ACCEPT -A FORWARD -i ppp+ -j ACCEPT -A FORWARD -o ppp+ -j ACCEPT -A FORWARD -j REJECT --reject-with icmp-host-prohibited
(3)サービスの起動
ここまでの手順でVPNサーバーの構築に必要な全てのソフトウェアの導入と、その設定が完了した。
そこで、VPNサーバーとして動作させるために、サービスを起動する。
以下のコマンドを実行する。
systemctl start strongswan systemctl start xl2tpd
3,おわりに
VPNサーバーの構築にあたり、ネット上の参考文献を大いに参考にした。
本稿を書きながらVPNサーバーを構築した際に、種々のトラブルに遭遇した。
- iptablesの設定ミス
- ppp用のオプションファイルの設定ミス
- ipsec.conf等の設定ミス
これらを乗り越えて、本稿を書き終えた。
大量の設定ファイルを相手にすることになるが、
ネットの神様たちの記事を参考に、
1つづつ手順を踏まえて行けば、なんとかなる、はずである。
読まれた方で、VPNサーバーの構築を行う方は、参考文献にも必ず目を通してほしい。
とりあえず、できて、よかった!
4,参考文献
- L2TP / IPSecでVPNサーバーを構築した。Linux Debian9 ( stretch ) – うえむ日記(仮)
- linuxでVPNサーバ – Qiita
- Debian GNU/Linux Wheezy で StrongSwan にてL2TP / IPsec サーバ設定の備忘録 | Open the Next
- IPsec 、ややこしくてわかりにくい・・・ | Open the Next
- Test ikev2/alg-sha256
- strongSwan – ArchWiki
最近のコメント