CentOS 7でL2TP/IPsecのVPNサーバを作った話

Linux / CentOS 7 / VPN

CentOS 7でL2TP/IPsecのVPNサーバを作った話
インフラ

前提

  • VPNサーバーの構築方法と、接続方法について解説しています
  • VPNの種類は「事前共有キーを使った L2TP/IPsec」です

サーバー

OS: CentOS 7

さくらのVPS を使って構築しました
512MBのプランで問題なく動いています

クライアント

OS: Windows10
(Android 9でも接続確認しました)

ざっくりL2TP/IPsecの解説

L2TP (Layer 2 Tunneling Protocol)

VPNでデータを送受信するために使われるプロトコルです。
「Tunneling」と入ってある通り、2つの拠点をトンネルで繋げるようなイメージです。

使用するポートのデフォルトはUDP1701です

IPsec (Security Architecture for IP)

暗号化して通信をするためのプロトコルです。
L2TPはトンネルを作ってくれましたが、通信内容は暗号化されていないので、
このIPsecと組み合わせて使われることが多いです。

使用するポートのデフォルトはUDP500,4500です

この組み合わせをL2TP/IPsecと呼びます。

事前準備

インストール

epelリポジトリが入っていなかったら追加してください

$ sudo yum install epel-release
$ sudo yum update

パッケージ

$ sudo yum install xl2tpd libreswan

バックアップ

これから

  • /etc/xl2tpd/xl2tpd.conf
  • /etc/ppp/options.xl2tpd
  • /etc/ppp/chap-secrets
  • /etc/ipsec.conf

を編集するので、これらのファイルのバックアップを取っておいてください。

L2TPの設定

/etc/xl2tpd/xl2tpd.conf

[global]
listen-addr = ●●●.●●●.●●●.●●● (サーバーのグローバルIP)

(略)

[lns default]
ip range = 192.168.1.128-192.168.1.254
local ip = 192.168.1.99
require chap = yes
refuse pap = yes
require authentication = yes
name = xl2tpd
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes

ip range: 接続したクライアントに割り振るローカルIPの幅を決めます
local ip: VPNサーバーに割り当てるIPです

複雑なネットワーク構成を作る必要がなければ、そこまで考える必要は無いです。
local ipがip rangeの中に入らないようにだけ気を付けましょう。

/etc/ppp/options.xl2tpd

noccp
auth
#crtscts     コメントアウト
idle 1800
mtu 1410
mru 1410
nodefaultroute
debug
#lock        コメントアウト
proxyarp
connect-delay 5000

#追加
name xl2tpd
logfile /var/log/xl2tpd.log

※最新のバージョンではcrtsctsとlockをコメントしないとうまく動作しません

mtuとmruはデフォルト値から変更していませんが、私は問題なく接続できています。
接続状況が不安定な場合(途中で切れるなど)はこの値を疑ってください

$ sudo touch /var/log/xl2tpd.log

ログファイルの作成もしておいてください

ユーザー名、パスワードの設定

/etc/ppp/chap-secrets

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
"ユーザー名" "xl2tpd" "パスワード" *

ユーザー名とパスワードは
Windowsの画面でいう

ここのユーザー名とパスワードにあたります。

IPsecの設定

/etc/ipsec.conf

include /etc/ipsec.d/*.conf

コメントアウトを外す(最初から外れているかも)

ipsec.d以下にconfファイルを作成します

touch /etc/ipsec.d/l2tp-ipsec.conf

/etc/ipsec.d/l2tp-ipsec.conf

conn L2TP-PSK-NAT
    rightsubnet=0.0.0.0/0
    dpddelay=10
    dpdtimeout=20
    dpdaction=clear
    forceencaps=yes
    also=L2TP-PSK-noNAT
conn L2TP-PSK-noNAT
    authby=secret
    pfs=no
    auto=add
    keyingtries=3
    rekey=no
    ikelifetime=8h
    keylife=1h
    type=transport
    left=●●●.●●●.●●●.●●● (サーバーのグローバルIP)
    leftprotoport=17/1701
    right=%any
    rightprotoport=17/%any

事前共有キーの作成

$ sudo touch /etc/ipsec.d/default.secrets

/etc/ipsec.d/default.secrets

: PSK "事前共有キー"

事前共有キーは

ここです。行頭のコロンはしっかり付けてください。

カーネルパラメータの設定

$ sudo touch /etc/sysctl.d/60-ipsec.conf

ipsecに関する変更を書くconfを作成

/etc/sysctl.d/60-ipsec.conf

net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.lo.send_redirects = 0

「eth0」はネットワークアダプタ名です。
環境によって名前が違う可能性があるのでifconfigとかで確認して変更してください

$ sudo sysctl --system

で変更を反映させます。

ファイアウォールの設定

$ sudo firewall-cmd --permanent --add-service=ipsec
$ sudo firewall-cmd --permanent --add-port=1701/udp
$ sudo firewall-cmd --permanent --add-port=4500/udp
$ sudo firewall-cmd --permanent --add-masquerade
$ sudo firewall-cmd --reload

起動

$ sudo systemctl enable ipsec
$ sudo systemctl enable xl2tpd
$ sudo systemctl restart ipsec
$ sudo systemctl restart xl2tpd

パケットフィルタの設定

パケットフィルタの設定をしている方は、新たにポートを追加する必要があります。

さくらVPSの管理画面から「パケットフィルタ」を選択します

UDPの500,1701,4500を追加して

「設定を保存する」をクリックしてください。

Windowsから接続

VPNの追加

「設定」→「ネットワークとインターネット」
もしくはタスクバーのネットワークアイコンを右クリック→「ネットワークとインターネットの設定を開く」

「VPN」→「VPNを追加する」
(画像ではもう追加されていますが、気にしないでください)

VPN プロバイダー:「Windows(ビルドイン)」に変更
接続名: 覚えやすい名前
サーバー名またはアドレス: 設定したサーバーのipアドレス
VPNの種類:「事前共有キーを使った L2TP/IPsec」に変更
事前共有キー: default.secretsで設定したキー
サインイン情報の種類: 「ユーザー名とパスワード」に変更
ユーザー名(オプション): chap-secretsで設定したもの
パスワード(オプション): chap-secretsで設定したもの

で保存します。

プロパティ

VPNが作成されるとネットワーク接続のところに表示されるので
そこからプロパティを開きます

「セキュリティ」タブの
「チャレンジ ハンドシェイク認証プロトコルにチェック」を付ける

で、設定は完了です。

繋がる

作成されたVPNを選択して「接続」をクリック
または、タスクバーのネットワークアイコンにVPNが追加されるので、そこから「接続」をクリック

で繋がるはずです。

接続に失敗する場合は
1.サーバーの設定(ポートの開放、ipsec、xl2tpdが正常に起動しているか)
2.自宅のルーターの設定(VPNに対応していない、もしくは設定が必要な機種があります)

を疑ってください

接続が不安定な場合は
1.MTU、MRUの数値があっていない
2.サーバーが物理的に遠い(海外のサーバーを使用している)

などが考えられます

それでは、よいVPNライフを!