VPN(L2TP/IPsec)サーバの設定(strongswan使用)

ALL
スポンサーリンク

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

コメント