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 の癖さえ理解してしまえば、十分に実用的である。