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,参考文献

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA