Raspberry Pi L2TP/IPsec VPNサーバの構築

Raspberry Pi

はじめに

L2TP/IPsec VPNは、IPsecによる機密保持およびクライアント認証、L2TPによるネットワークトンネリング、pppdを通したユーザー認証を組み合わせたものです。
L2TP/IPsec VPNは、Windowsをはじめ、多くのオペレーティングシステムで一般的に使用されているVPNプロトコルです。
VPNクライアントは、Windows 2000以降のすべてのバージョンに組み込まれており、他のクライアントアプリケーションをインストールすることなく容易に利用できます。
一方、VPNサーバは、IPsec、L2TPおよびPPPの少なくとも3つのレイヤが関与しますので、やや複雑です。
ここでは、IPSecを実装したstrongSwanおよびL2TPを実装したxl2tpdを使用します。
xl2tpdは、他のL2TP サーバと異なり、DHCPを用いなくとも、IP アドレスプールの管理を行うことができます。

環境

  1. ボード
    Raspberry Pi 4 Model B
  2. OS
    Raspberry Pi OS (32-bit) Lite
    Minimal image based on Debian Buster
    Version: August 2020
    Release date: 2020-08-20
    Kernel version: 5.4
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 5.4.51-v7l+ #1333 SMP Mon Aug 10 16:51:40 BST 2020 armv7l GNU/Linux
pi@raspberrypi:~ $

L2TP/IPsec VPNサーバの構成

以下に、本文章で記載するL2TP/IPsec VPNサーバの構成を記載ます。

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

以下のコマンドを実行し、strongSwan及びxl2tpdをインストールします。

pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get install strongswan xl2tpd

strongswan及びxl2tpdのバージョンを確認します。

pi@raspberrypi:~ $ /usr/lib/ipsec/charon --version
Linux strongSwan 5.7.2
pi@raspberrypi:~ $ xl2tpd --version

xl2tpd version:  xl2tpd-1.3.12
pi@raspberrypi:~ $

L2TP/IPsecの設定

strongSwanの設定

1.IPsecの設定

「/etc/ipsec.conf」ファイルを以下のとおり編集し、strongSwanのIPsecの設定を行います。

pi@raspberrypi:~ $ sudo vi /etc/ipsec.conf
 # ipsec.conf - strongSwan IPsec configuration file
 
 # basic configuration
 
 config setup
         # strictcrlpolicy=yes
         # uniqueids = no
 
 # Add connections here.
 # connセクションにIPsecを使用したコネクションに関する定義を記載する。
 conn l2tp
         # NAT環境でない場合、ESPパケットをUDPカプセル化を行うか否かを
         # 指定する。(※1)
         forceencaps=no
         # 双方で使用する認証方式を指定する。(secret:事前共有鍵)
         authby=secret
         # IPsecが起動した時の動作を指定する。(add:ロードのみ)
         auto=add
         # 鍵交換で使用するプロトコルを指定する。
         keyexchange=ikev1
         # コネクションのネゴシエーションの試行回数を指定する。
         keyingtries=3
         # ikeで使用する暗号化及び認証方式を指定する。
         ike=aes128-sha1-modp3072
         # ESPで使用する暗号化及び認証方式を指定する。
         esp=aes128-sha1-modp3072
         # 有効期間が満了した場合に再度ネゴシエーションを行うかを指定する。
         rekey=no
         # コネクションで使用しているISAKMPあるいはIKE SAの有効期間を
         # 指定する。
         ikelifetime=28800
         # コネクションの種類を指定する。
         type=transport
         # サーバ側のIPアドレスを指定する。
         left=192.168.0.5
         # サーバ側のサブネットを指定する。
         leftsubnet=192.168.0.0/24
         # サーバ側で使用するプロトコルとポート番号を指定する。
         leftprotoport=17/1701
         # クライアント側のIPアドレスを指定する。(%any:不定)
         right=%any
         # クライアント側で使用するプロトコルとポート番号を指定する。
         # (%any:不定)
         rightprotoport=17/%any
         # キープアライブパケットの送信間隔秒数を指定する。(※1)
         dpddelay=30
         # コネクションが切断されたとみなすタイムアウト間隔秒数を指定する。
         # (※2)
         dpdtimeout=150
         # コネクション切断が検出された場合の動作を指定する。
         # (clear:コネクションを切断する。)(※2)
         dpdaction=clear
         # IPComp(RFC2393)を行うかを指定する。(※3)
         compress=no
         
 include /var/lib/strongswan/ipsec.conf.inc
 pi@raspberrypi:~ $
 
 ※1 strongSwan 5.0以降では、NATトラバーサルは自動になり、設定不要になっています。
 ※2 DPD(Dead Peer Detection、RFC3706)と呼ばれる機能に関する設定を行います。この機能の役割は、IPsecトンネルの通信断をリアルタイムに検出することです。
 ※3 IPComp(RFC2393)は、 IPパケットのトランスポート層を圧縮するプロトコルです。IPCompをIPsecのESPと組み合わせることによって、VPNのスループットを向上できる可能性があります。 特に低速な回線では、スループットに対するデータ量の影響が大きいためIPCompの効果を期待できます。

2.事前共有鍵の設定

「/etc/ipsec.secrets」ファイルを編集し、事前共有鍵を設定します。

pi@raspberrypi:~ $ sudo vi /etc/ipsec.secrets
# This file holds shared secrets or RSA private keys for authentication.

# 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

192.168.1.10 %any : PSK "pre-shared-key"

pi@raspberrypi:~ $

※192.168.1.10は、サーバ側のIPアドレスを記載します。
※%anyは、この事前共有鍵をすべてのクライアントで使用することを示しています。
※PSKは、事前共有鍵であることを示します。
※pre-shared-keyは、使用する事前共有鍵を記載します。
※スペースが必要ですので、注意してください。 

他のユーザー等が参照できないように、ファイルの所有権をroot、パーミッションを600に変更します。

pi@raspberrypi:~ $ sudo chown root:root /etc/ipsec.secrets
pi@raspberrypi:~ $ sudo chmod 600 /etc/ipsec.secrets
pi@raspberrypi:~ $

3.その他

「/etc/strongswan.conf」は、特に編集する必要はありません。

xl2tpdの設定

1.xl2tpdの設定

「/etc/xl2tpd/xl2tpd.conf」ファイルを編集し、xl2tpdの設定を行います。

pi@raspberrypi:~ $ sudo vi /etc/xl2tpd/xl2tpd.conf
 [global]                                ; Global parameters:
 ; 使用するポート番号を指定します。
 port = 1701                             ; * Bind to port 1701
 ; ユーザー認証で使用するファイルを指定します。
 auth file = /etc/ppp/chap-secrets
 ;
 [lns default]                           ; Our fallthrough LNS definition
 ; クライアント側に割り当てるIPアドレスの範囲を指定します。
 ip range = 192.168.1.10-192.168.1.19  ; * Allocate from this IP range
 ; サーバ側のIPアドレスを指定します。
 local ip = 192.168.0.5                  ; * Our local IP to use
 ; length bitを使用するか否かを指定します。
 length bit = yes                        ; * Use length bit in payload?
 ; pap認証を拒否するか否かを指定します。
 refuse pap = yes                        ; * Refuse PAP authentication
 ; chap認証を拒否するか否かを指定します。
 refuse chap = yes                       ; * Refuse CHAP authentication
 ; pppにおけるユーザー認証を行うか否かを指定します。
 require authentication = yes            ; * Require peer to authenticate
 ; クライアント側に通知するホスト名を指定します。
 name = l2tp                             ; * Report this as our hostname
 ; pppdで使用する設定ファイルを指定します。
 pppoptfile = /etc/ppp/options.l2tpd.lns ; * ppp options file
 
 pi@raspberrypi:~ $

2.ユーザー認証情報の設定

「/etc/ppp/chap-secrets」ファイルを編集し、接続時に使用するユーザー認証情報を設定します。

pi@raspberrypi:~ $ sudo vi /etc/ppp/chap-secrets
 # Secrets for authentication using CHAP
 # client        server  secret                  IP addresses
 testuser  *       password        *
 
 ここでは、ユーザーIDを「testuser」、パスワードを「password」としています。

他のユーザー等が参照できないように、ファイルの所有権をroot、パーミッションを600に変更します。

pi@raspberrypi:~ $ sudo chown root:root /etc/ppp/chap-secrets
pi@raspberrypi:~ $ sudo chmod 600 /etc/ppp/chap-secrets
pi@raspberrypi:~ $

3.pppdの設定

「/etc/ppp/options.l2tpd.lns」ファイルを編集し、pppdに関する設定を行います。

pi@raspberrypi:~ $ sudo vi /etc/ppp/options.l2tpd.lns
 # クライアント側に通知するホスト名を指定します。
 name l2tp
 ipcp-accept-local
 ipcp-accept-remote
 # PAP認証を拒否する。
 refuse-pap
 # PAP認証を拒否する。
 refuse-chap
 # MS-CHAP認証を拒否する。
 refuse-mschap
 # MS-CHAPv2認証を要求する。
 require-mschap-v2
 # デフォルトゲートウェイを設定しない。
 nodefaultroute
 # BSD-Compressを使用しない。
 nobsdcomp
 # MTU(Maximum Transmission Unit)を指定する。
 mtu 1416
 # MTU(Maximum Receive Unit)を指定する。
 mru 1416
 # ログファイルを指定する。
 logfile /var/log/xl2tpd.log
 # コネクションが切断された場合、再接続を行う。
 persist
 pi@raspberrypi:~ $

IPフォワーディングの設定

インターフェイス間で通信ができるようにIPv4フォワーディングを有効にします。

pi@raspberrypi:~ $ sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=1
pi@raspberrypi:~ $

NATの設定

VPNクライアントからローカルLANへ通信ができるように設定を行います。

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -m policy --dir out --pol ipsec -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

最初のルールは、IPsecポリシーにマッチするパケットのみ許可するルールです。
次のルールは、VPNクライアントのバーチャルIPアドレスをローカルLANのIPアドレスにNATするルールです。

サービスの起動

以下のコマンドを実行し、strongSwan及びxl2tpdのサービスを起動します。

pi@raspberrypi:~ $ sudo systemctl start strongswan.service
pi@raspberrypi:~ $ sudo systemctl start xl2tpd.service
pi@raspberrypi:~ $

起動確認

以下のコマンドを実行し、サービスが問題なく起動していることを確認します。

pi@raspberrypi:~ $ sudo systemctl status strongswan.service
pi@raspberrypi:~ $ sudo systemctl status xl2tpd.service
pi@raspberrypi:~ $ 

また、以下のログファイルを確認し、問題なく起動していることを確認します。

  • /var/log/syslog
  • /var/log/xl2tpd.log

Windows PC等を使用して、L2TP/IPsec VPN接続できるかどうかを確認します。
無事に接続できれば、L2TP/IPsec VPNサーバの設定は完了です。

ルータ等の設定

VPNサーバがルータの背後に接続されている場合、以下のポートを開く必要があります。
ご使用のルータでポートフォワード等の設定を行ってください。

  • UDPポート500番(ISAKMP)
  • UDPポート4500番(IPSec NAT Traversal)
  • UDPポート1701番(上記で設定したL2TPで使用するポート)
  • インターネットプロトコル50番(ESP)
  • インターネットプロトコル51番(AH)

その他

Windows7やWindows10からL2TP/IPsec接続する場合の注意事項
Windows端末とL2TP/IPsec VPNサーバ間にNATルータが存在する場合、Windows端末のレジストリ設定でNATトラバーサル機能を有効にする必要があります。
以下のURLに記載されている手順に従い、NATトラバーサル機能を有効にしてください。http://support.microsoft.com/kb/926179/ja
AssumeUDPEncapsulationContextOnSendRuleの値は「2」を設定してください。
※レジストリを誤って変更すると深刻な問題が発生することがありますので、設定変更は慎重に実施してください。

参考

タイトルとURLをコピーしました