リモートワークで固定IPするために: L2TP/IPsec VPNを設定する

ピリカでは開発環境へのアクセスを保護するための一環としてIP制限をしていますが、ピリカという会社は元々リモートで仕事をしている人が多く、またオフィスのIPアドレスは動的IPの時代が続いていました。

そこで、各自のIPアドレスを固定化するためにVPNやプロキシサーバーを構築していますが、その認証の管理をできるだけGoogle Workspaceの権限を元にやりたいと考えました。

この記事では、前回実装したRADIUSサーバーを使って、L2TP/IPsec VPNを設定し、VPNを使えるようにします。

使用環境

  • ConoHa VPS
  • CentOS 7
  • 使用ソフトウェア
    • strongswan
    • xl2tpd
    • radiusclient-ng

SSHのパスワード認証無効化、ファイアウォールの設定等の設定は終わっている前提で説明します。

パッケージのセットアップ

xl2tpd、strongswan、radiusclient-ng をインストールします。

$ sudo yum install -y xl2tpd strongswan radiusclient-ng

IPsec (strongswan) の設定

/etc/strongswan/ipsec.conf を以下のように編集しました。

config setup

conn %default
    dpdaction=clear
    dpddelay=300s
    rekey=no
    left=%defaultroute
    leftfirewall=yes
    right=%any
    ikelifetime=60m
    keylife=20m
    rekeymargin=3m
    keyingtries=1
    auto=add
conn L2TP-IKEv1-PSK
    type=transport
    keyexchange=ikev1
    authby=secret
    leftprotoport=udp/l2tp
    left=%any
    right=%any
    rekey=no
    forceencaps=yes
    ike=aes256-sha1-modp1024,3des-sha1-modp1024!
    esp=aes256-sha1,3des-sha1!

また、/etc/strongswan/ipsec.secretsに事前共有シークレットを書き込みます。<<$IPSEC_PSK$>>を設定するシークレットの値に書き換えてください。

: PSK "<<$IPSEC_PSK$>>"

L2TP (xl2tpd) の設定

/etc/xl2tpd/xl2tpd.conf を以下のように設定しました。<<$GLOBAL_IP$>>はサーバーのグローバルIPに置き換えてください。 また、ip range は接続した端末に払い出すIPアドレスの範囲、local ipはサーバー自体のVPN内のIPアドレスを指定します。

[global]
listen-addr = <<$GLOBAL_IP$>>
auth file = /etc/ppp/chap-secrets

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

次に、/etc/ppp/options.l2tpdを以下のように設定しました。

name xl2tpd
ipcp-accept-local
ipcp-accept-remote
ms-dns  8.8.8.8
ms-dns  1.1.1.1
require-pap
refuse-chap
refuse-mschap
refuse-mschap-v2
nodefaultroute
nobsdcomp
persist
mtu 1280
mru 1280
logfile /var/log/xl2tpd.log
plugin radius.so
plugin radattr.so

radiusclient-ng の設定

/etc/radiusclient-ng/etc/radiusclientとして参照できるようにシンボリックリンクを設定します。

sudo ln -s /etc/radiusclient-ng /etc/radiusclient

RADIUSクライアントが参照するRADIUSサーバーを設定します。前回作成したRADIUSサーバーをローカルで起動してそれを参照させます。/etc/radiusclient-ng/serversに以下の内容を追記します。

127.0.0.1 secret

RADIUSサーバーの設定

前回実装したradiusコマンドを/opt/radius/office_radiusとして配置しました。また、サービスアカウントキーファイルを/opt/radius/service_account.jsonとして配置し、起動コマンド/opt/radius/radius.shを以下の内容で作成しました。

#!/bin/sh
/opt/radius/office_radius -sa /opt/radius/service_account.json -client <<$CLIENT_ID$>> -group <<$GROUP$>> -radius

更に、これをsystemdで自動起動させるため、/etc/systemd/system/office_radius.serviceを作成します。

[Unit]
Description = Office Radius

[Service]
ExecStart = /opt/radius/radius
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

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

IPフォワードが使えるように、/etc/sysctl.confに以下の設定を追記します。

net.ipv4.ip_forward=1

変更後、sudo sysctl -p を指定することで再起動せずとも反映されます。

ファイアウォール設定

firewalldにIPsecのポート接続を許可させます。

$ sudo firewall-cmd --add-service=ipsec --zone=public --permanent
$ sudo firewall-cmd --add-masquerade --permanent
$ sudo firewall-cmd --reload

サービスの起動

サービスの自動起動設定をします。

$ sudo systemctl enable office_radius
$ sudo systemctl enable strongswan
$ sudo systemctl enable xl2tpd

そして起動させます。

$ sudo systemctl restart office_radius
$ sudo systemctl restart strongswan
$ sudo systemctl restart xl2tpd

接続の確認

スマートフォンからVPN設定をして接続を確認しましょう。

iOSでは設定→一般→VPNを開き、「VPN構成を追加...」で以下のように設定します。

設定値 設定
タイプ L2TP
説明 自由に名前を設定する
サーバ 設定したサーバーのグローバルIPアドレス
アカウント 認証ユーザー名(Google Workspaceのメールアドレス)
パスワード 前回作成したパスワード登録画面で作ったパスワード
シークレット 設定した事前共有シークレット
すべての信号を送信 ON

Androidでは、設定を開き、ネットワークとインターネット→詳細設定のVPNを開きます。 その後、+ボタンを押してVPN プロファイルの編集を以下の通りに入力します。

項目名 設定値
名前 自由に名前を設定する
タイプ L2TP/IPSec PSK
サーバー アドレス 設定したサーバーのグローバルIPアドレス
IPSec事前共有鍵 設定した事前共有シークレット
アカウント 認証ユーザー名(Google Workspaceのメールアドレス)
パスワード 前回作成したパスワード登録画面で作ったパスワード

作成した設定で接続ができ、IPアドレス確認サイト等でサーバーのグローバルIPアドレスになっていれば設定は完了です。

次回は認証プロキシの設定をしたいと思います。