ピリカでは開発環境へのアクセスを保護するための一環としてIP制限をしていますが、ピリカという会社は元々リモートで仕事をしている人が多く、またオフィスのIPアドレスは動的IPの時代が続いていました。
そこで、各自のIPアドレスを固定化するためにVPNやプロキシサーバーを構築していますが、その認証の管理をできるだけGoogle Workspaceの権限を元にやりたいと考えました。
この記事では、前回実装したRADIUSサーバーを使って、L2TP/IPsec VPNを設定し、VPNを使えるようにします。
使用環境
※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
接続の確認
iOSでは設定→一般→VPNを開き、「VPN構成を追加...」で以下のように設定します。
設定値 | 設定 |
---|---|
タイプ | L2TP |
説明 | 自由に名前を設定する |
サーバ | 設定したサーバーのグローバルIPアドレス |
アカウント | 認証ユーザー名(Google Workspaceのメールアドレス) |
パスワード | 前回作成したパスワード登録画面で作ったパスワード |
シークレット | 設定した事前共有シークレット |
すべての信号を送信 | ON |
Androidでは、設定を開き、ネットワークとインターネット→詳細設定のVPNを開きます。 その後、+ボタンを押してVPN プロファイルの編集を以下の通りに入力します。
項目名 | 設定値 |
---|---|
名前 | 自由に名前を設定する |
タイプ | L2TP/IPSec PSK |
サーバー アドレス | 設定したサーバーのグローバルIPアドレス |
IPSec事前共有鍵 | 設定した事前共有シークレット |
アカウント | 認証ユーザー名(Google Workspaceのメールアドレス) |
パスワード | 前回作成したパスワード登録画面で作ったパスワード |
作成した設定で接続ができ、IPアドレス確認サイト等でサーバーのグローバルIPアドレスになっていれば設定は完了です。
次回は認証プロキシの設定をしたいと思います。