2023.10.22追記・2023.12.06修正
少なくともGL-MT300N-V2(Mango)については9月にバージョン4.xのβが取れ、stableリリースとなった(4.3.7)。GL.iNetのWebUIも新しくなり、VPNダッシュボードで「グローバルプロキシ(=スプリットトンネリングしない)」「ターゲットドメインまたはIP(=スプリットトンネリングする)」の設定が可能となったため、以下のような細工は不要となった。ただしopvnファイルにおけるredirect-gateway autolocalの設定は相変わらず無視するみたい。
一般的なOpenVPNのクライアント側の設定として、
redirect-gateway autolocal
と設定すると全てのトラフィックをVPN経由にするのだけど、使途によってそうさせたい場合とそうさせたくない(スプリットトンネリングさせたい)場合とがあると思うが、GL.iNetの機器(少なくともGL-MT300N-V2(Mango)およびGL-XE300(Puli)のいずれもバージョン3.215。以下「GL-MT300N-V2など」)はこの設定の有無を無視して、常に全てのトラフィックがVPN経由となり、スプリットトンネリングできない。
そもそもGL-MT300N-V2などは最初からOpenVPNがインストールされていて、GL.iNetのWebUIから(OpenWRTのLuCIでないという意味)簡単に設定できるようになっているが、簡単過ぎて設定できる項目がほぼない。
最初設定ファイル(ovpnファイル)に起因する問題だと思い込んでいたことと、この「スプリットトンネリング」という言葉を忘れていたために検索するのに難儀していたが、やっぱり同じことをやろうとしている人がいた。
この記事を書いた人がどうやって調べたかは記事を読んでもらうとして、結論的にはSSHとかでログインし、まず/etc/vpn.user
のovpn_main()
関数を以下のようにコメントアウトする(ip route
とipset
の計4行)。
ovpn_main() {
local ip
local host
local enable
eanble=$(uci get glconfig.openvpn.enable 2>/dev/null)
[ "$eanble" = "1" ] || return
# Load default rules
if [ "$INTERFACE" = "ovpn" ]; then
# add default rules and force to main table
[ -z "$(ip route list | grep -E "0.0.0.0/1 (.) $DEVICE" 2>/dev/null)" ] && {
# ip route add 0.0.0.0/1 dev $DEVICE 2>/dev/null
# ipset add mwan3_connected_v4 0.0.0.0/1 2>/dev/null
}
[ -z "$(ip route list | grep -E "128.0.0.0/1 (.) $DEVICE" 2>/dev/null)" ] && {
# ip route add 128.0.0.0/1 dev $DEVICE 2>/dev/null
# ipset add mwan3_connected_v4 128.0.0.0/1 2>/dev/null
}
fi
次に/etc/init.d/startvpn
のovpn_firewall_start()
関数のlan2wan_forwarding disable
をコメントアウトする。
ovpn_firewall_start() {
set_ovpn_config add
# lan2wan_forwarding disable
uci commit firewall
/etc/init.d/firewall reload
# flush old connecting
echo " " >/proc/net/nf_conntrack
}
元記事の人はローカル側をNATしたくないそうなので話の続きがあるが、私はこれで満足なのでここまで。
(2023.03.22 – 2023.12.06)