これまで過去に OpenWRT に OpenConnect VPN Server を構築してきた時と異なり、 現行の OpenWRT v22.03 ではファイアウォールベースのルーティングを使って、簡易的にVPNトラフィックを処理する手法が使えないので、オーソドックスにVPN用のインターフェイスとゾーンを定義して対応しました。
ocservのインストールと設定
仮想マシンとして構築したOpenWRT v22.03.3ルータに、公式レポジトリからOpenConnect VPN Serverパッケージ ocserv をインストールします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
_______ ________ __ | |.-----.-----.-----.| | | |.----.| |_ | - || _ | -__| || | | || _|| _| |_______|| __|_____|__|__||________||__| |____| |__| W I R E L E S S F R E E D O M ----------------------------------------------------- OpenWrt 22.03.3, r20028-43d71ad93e ----------------------------------------------------- ~# opkg update ~# opkg install luci-app-ocserv Installing luci-app-ocserv (git-20.110.55046-74da73b) to root... Downloading https://downloads.openwrt.org/releases/22.03.3/packages/x86_64/luci/luci-app-ocserv_git-20.110.55046-74da73b_all.ipk Installing luci-compat (git-22.069.45071-03bb0e2) to root... Downloading https://downloads.openwrt.org/releases/22.03.3/packages/x86_64/luci/luci-compat_git-22.069.45071-03bb0e2_all.ipk Installing libhttp-parser (2.9.4-1) to root... Downloading https://downloads.openwrt.org/releases/22.03.3/packages/x86_64/packages/libhttp-parser_2.9.4-1_x86_64.ipkInstalling libhttp-parser (2.9.4-1) to root... Downloading https://downloads.openwrt.org/releases/22.03.3/packages/x86_64/packages/libhttp-parser_2.9.4-1_x86_64.ipk Installing libgmp10 (6.2.1-1) to root... Downloading https://downloads.openwrt.org/releases/22.03.3/packages/x86_64/base/libgmp10_6.2.1-1_x86_64.ipk Installing libnettle8 (3.7.3-2) to root... Downloading https://downloads.openwrt.org/releases/22.03.3/packages/x86_64/base/libnettle8_3.7.3-2_x86_64.ipk Installing libgnutls (3.7.1-2) to root... Downloading https://downloads.openwrt.org/releases/22.03.3/packages/x86_64/packages/libgnutls_3.7.1-2_x86_64.ipk Installing certtool (3.7.1-2) to root... Downloading https://downloads.openwrt.org/releases/22.03.3/packages/x86_64/packages/certtool_3.7.1-2_x86_64.ipk Installing libprotobuf-c (1.4.0-2) to root... Downloading https://downloads.openwrt.org/releases/22.03.3/packages/x86_64/packages/libprotobuf-c_1.4.0-2_x86_64.ipk Installing libev (4.33-1) to root... Downloading https://downloads.openwrt.org/releases/22.03.3/packages/x86_64/packages/libev_4.33-1_x86_64.ipk Installing kmod-tun (5.10.161-1) to root... Downloading https://downloads.openwrt.org/releases/22.03.3/targets/x86/64/packages/kmod-tun_5.10.161-1_x86_64.ipk Installing ocserv (1.1.6-2) to root... Downloading https://downloads.openwrt.org/releases/22.03.3/packages/x86_64/packages/ocserv_1.1.6-2_x86_64.ipk Configuring kmod-tun. Configuring libev. Configuring libprotobuf-c. Configuring libhttp-parser. Configuring libgmp10. Configuring libnettle8. Configuring libgnutls. Configuring certtool. Configuring ocserv. Configuring luci-compat. Configuring luci-app-ocserv. |
これまでにOpenConnect VPN Serverを構築した、GL-iNet GL-AR750SやFriendlyElec Nano Pi R2Sでの設定を元に、
以下のように設定ファイルを編集します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
config ocserv 'config' option port '4443' option dpd '180' option max_clients '8' option zone 'lan' option auth 'plain' option max_same '4' option compression '1' option udp '0' option ipaddr '192.168.102.1' option netmask '255.255.255.0' option enable '1' config dns option ip '192.168.51.5' config dns option ip '192.168.51.2' config dns option ip '1.1.1.1' config ocservusers option name 'XXXXXXXX' option password 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' config ocservusers option name 'YYYYYYYY' option password 'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY' config ocservusers option name 'ZZZZZZZZ' option password 'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ' |
次のコマンドで設定を反映させます。
1 |
~# /etc/init.d/ocserv reload |
ファイアウォールの穴開け
1 |
INET --> [tcp443]:WAN--OpenWrt--LAN:[tcp4443](192.168.51.5) |
次に、以下の要領で外からのアクセスに対し、ファイアウォールに穴を開けてNATを設定します。
1 2 3 4 5 6 7 8 9 |
config redirect option target 'DNAT' option src 'wan' option dest 'lan' option src_dport '443' option dest_port '4443' option name 'OpenConnect' option proto 'tcp udp' option dest_ip '192.168.51.5' |
ファイアウォールベースのルーティングが使えない
VPNのトンネルを通ってやって来たトラフィックは、これまでは以下のようなカスタムルールを記述することによる、ファイアウォールベースのルーティングで処理していました(Nano Pi R2S OpenWRT v21.02での設定例)。
1 2 3 |
iptables -t nat -I POSTROUTING -s 192.168.101.0/24 -j MASQUERADE iptables -I FORWARD -i vpns+ -s 192.168.101.0/24 -j ACCEPT iptables -I INPUT -i vpns+ -s 192.168.101.0/24 -j ACCEPT |
ところがOpenWRT v22.03で従来のiptables (fw3)からnftables (fw4)へ変わったことで、こうしたカスタムルールをそのまま使えなくなってしまいました。
また、LuCIの Firewall ページ上でも、 カスタムルール タブは廃されています。
VPNインターフェイスを作って交通管理
複雑怪奇なファイアウォール実装を一から学ぶより、ここはocservパッケージ公式のREADMEに従って、VPN用の論理インターフェイスを作り、専用のファイアウォールゾーンを定義する方法で進めます。
まず始めに、VPN用の論理インターフェイスを追加します。
1 2 3 |
config interface 'vpn' option proto 'none' option ifname 'vpns+' |
そのインターフェイスを vpn という新しいファイアウォールゾーンへ割り当てて、各ゾーンとのトラフィックルールを次の通りに定義します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
config zone option input 'ACCEPT' option forward 'ACCEPT' option output 'ACCEPT' option name 'vpn' option device 'vpns+' option network 'vpn' config forwarding option src 'vpn' option dest 'lan' config forwarding option src 'lan' option dest 'vpn' config forwarding option src 'vpn' option dest 'wan' |
ネットワークとファイアウォールの設定を反映します。
1 2 |
~# /etc/init.d/network reload ~# /etc/init.d/firewall reload |
サーバ側の構築は以上で終わり。試しにテスト環境でAndroidスマートフォンからCisco AnyConnect Client を使って接続し、LANサブネット側へ疎通できることを確認しました。
終わってみるとVPN用のインターフェイスやゾーンを作ってルーティング設定する方が、見た目にも分かりやすいことから、他のルータへも機会を見つけて適用してみようと思います。