IKEv2/IPSecのVPNサーバーをDockerを使って簡単に立てる記事。
なぜIKEv2なのか
現代的で安全とされる方式かつ、クライアント端末のOSの標準機能で対応していることが多く接続に追加のソフトのインストールが不要だから。
VPNと言えばOpenVPNが有名だったりするが、これは各クライアント端末に専用のソフトをインストールしないといけないので面倒だしなんか嫌だった。そこでこれまでずっとSoftether VPNによるL2TP/IPSecサーバを立てていた。L2TP/IPSecはAndoridやWindowsなど多くのOSの標準機能として対応しており、クライアントには追加のソフトのインストールが不要である。しかし最近(と言っても数年前だが)Androidでは新しくL2TP/IPSecのVPN接続が新規作成できなくなった。L2TP/IPSecはセキュリティー的にあまり良くはないという事らしい。ということで同じように多くのOSが標準で対応しているが、より現代的な方式であるIKEv2/IPSecのVPNサーバーを立てる。
前提
$ head -n1 /etc/os-release
NAME="Arch Linux"
$ docker --version
Docker version 24.0.7, build afdd53b4e3
UDPの500番と4500番ポートで待ち受けるので接続できるようにポート開放等しておく。
使用するサーバーソフトウェア
以下のDockerイメージを使う。ドキュメントが充実しているので、セットアップの詳細はドキュメントを読むのが良い。
サーバー起動
上をDocker Composeで起動させる。以下のcompose.yaml
ファイルを作成する。
services:
vpnserver:
image: hwdsl2/ipsec-vpn-server
ports:
- 500:500/udp
- 4500:4500/udp
volumes:
- ./ikev2-vpn-data:/etc/ipsec.d
- /lib/modules:/lib/modules:ro
privileged: true
environment:
- VPN_IKEV2_ONLY=yes
# - VPN_DNS_NAME=vpn.example.com # サーバーにDNS名でアクセスする場合は名前を必ず指定する。
# - VPN_DNS_SRV1=1.1.1.1 # 接続したクライアントが使うDNSサーバー名を指定できる。指定しないとGoogle Public DNSが使われる。
# - VPN_DNS_SRV2=1.0.0.1
restart: unless-stopped
$ docker compose up
で起動する。初回起動時は初期化の処理に少し時間がかかるので待つ。
初期化が完了するとマウントした./ikev2-vpn-data
ディレクトリの中に設定や証明書等のファイルが生成される。中でもvpnclient.p12
ファイルを使っていく。このファイルには秘密鍵が含まれているので扱いには注意。
クライアントセットアップ
OSごとのセットアップ方法は以下のドキュメントに書いてある。ここではAndroidの場合だけを紹介するが、他のほとんどのOSでも同様にOSの標準機能だけで接続できる。
- 前セクションで得た
vpnclient.p12
ファイルを安全な方法でAndoridに転送する。 - 設定アプリで「証明書」等で検索して「証明書のインストール」画面を開く
- 「VPNとアプリユーザー証明書」を選択
- 転送した
vpnclient.p12
ファイルを選択 - 好きな名前を付けてOKを押す
- 設定アプリで「VPN」等で検索してVPNの設定画面を開く
- 新しい接続を追加し以下の画像のように設定する
- 「サーバーアドレス」は立てたサーバーのIPアドレス(またはDNS名)を入れる
- 「IPSecユーザー証明書」と「IPSec CA証明書」は先ほどインストールしたものを選ぶ
- 「IPSec ID」は使用されないので何でもよい(でも入力必須になっているのはAndroidのバグらしい)
以上で追加したVPN接続を有効化すれば接続できるはず。