VPNクライアントルーター無線化
実家に設置してある VPN クライアントルーターを無線化。
「can’t add wlan0 to bridge」 の記事にある通り、当初はリモート側をブリッジ構成にして、無線 LAN と有線 LAN を同一セグメントにぶら下げる構想だった。
しかし、RTL8188EU を搭載した USB 無線 LAN ドングルを STA(クライアント)モードで使用する場合、L2 ブリッジが成立せず、この構成は断念することになった。
これは wpa_supplicant 自体の問題というより、RTL8188EU を含む多くの USB 無線 NIC が STA モードでのブリッジ(4addr / WDS)をサポートしていないことによる制約である。
その後の検証で、ブリッジを使用せず wlan0 を L3 インターフェースとして直接利用するルーティング構成で目途が立ったため、朝一番で無線構成へ移行した。
LAN ケーブルが不要になり、設置場所の自由度が大幅に向上した。
リモート側 VPN クライアントルーターの経路情報
pi@gw2:~ $ ip ro
default via 192.168.0.1 dev wlan0 onlink
192.168.0.0/22 dev wlan0 proto kernel scope link src 192.168.7.252
192.168.1.0/24 dev vpn_vpn proto kernel scope link src 192.168.1.251 metric 204
DHCPCD でゲートウェイを設定すると、
default via 192.168.0.1 dev wlan0 src 192.168.2.252 metric 202
のような経路になるのだが、通信開始後しばらくすると、何故か VPN のリンクが切断されてしまう状況が続いた。
原因は一つではなく、
・dhcpcd による default route や metric の動的再設定
・RTL8188EU ドライバのリンク状態変動(再関連付け・省電力制御)
・VPN デーモン側の keepalive 判定
これらが重なった結果と考えられる。
結果として、VPN 側がリンク断と判断してしまうようだ。
●静的設定への切り替え
対策として、DHCPCD の設定で denyinterfaces wlan0 を指定し、以下のように従来型のネットワーク設定(/etc/network/interfaces)で wlan0 を静的に設定した。
auto wlan0
iface wlan0 inet static
address 192.168.2.252
netmask 192.168.0.0/22
network 192.168.0.0
broadcast 192.168.2.255
gateway 192.168.0.1
この構成により、冒頭の経路状態となり、VPN のリンクも安定して維持されるようになった。
RTL8188EU の小型 USB ドングルはアンテナが 1 本しかないため、1x1 MIMO 構成となり、チャンネルボンディングも利用できない。その結果、リンク速度は最大 72.2 Mb/s に留まる。
wlan0 IEEE 802.11bgn ESSID:“xxxyyyyyzzzz” Nickname:"WIFI@REALTEK"
Mode:Managed Frequency:2.412 GHz Access Point: XX:YY:ZZ:AA:BB:CC
Bit Rate:72.2 Mb/s
Link Quality=95/100 Signal level=48/100
しかし、CIFS(SMB)によるファイル転送速度は有線接続時とほとんど変わらず、想像以上に良好な結果となった。
シングルコアの Raspberry Pi B+ がベースではあるが、10Mbps 程度の SMB ファイルコピー/ムーブでこの負荷率なら、実用上は十分である。
Wi-Fi 接続も安定しており、現時点で特に不満はない。
あとは電源さえ無くせれば、完全に無線化できるのだが(笑)。
●iptables 設定
VPN 内部で使用するルーターのため、基本的に通信はすべて許可する方針とした。iptables の設定は以下の通り。
#! /bin/sh
local_net=‘192.168.1.0/24’
remote_net=‘192.168.0.0/22’
AIR=‘wlan0’
WIRE=‘eth0’
LAN=‘vpn_vpn’
##############
Flush & Reset
##############
iptables -F
iptables -t nat -F
iptables -X
##############
Default Rule
##############
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
#########
INPUT
#########
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -i $AIR --dport 22 -j ACCEPT
iptables -A INPUT -i $WIRE -j ACCEPT
iptables -A INPUT -i $LAN -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
#########
FORWARD
#########
iptables -A FORWARD -i $LAN -o $AIR -j ACCEPT
iptables -A FORWARD -i $AIR -o $LAN -j ACCEPT
##########################
SNAT (masquerade) 双方向 NAT
##########################
iptables -t nat -A POSTROUTING -o $AIR -s $local_net -j MASQUERADE
iptables -t nat -A POSTROUTING -o $LAN -s $remote_net -j MASQUERADE
まとめ
無線化による制約は当初想定していたほど大きくなく、結果として非常に扱いやすい VPN クライアントルーター構成になった。
RTL8188EU の癖さえ理解してしまえば、十分に実用的である。