GL.iNet機器におけるOpenVPNの話

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ファイル)に起因する問題だと思い込んでいたことと、この「スプリットトンネリング」という言葉を忘れていたために検索するのに難儀していたが、やっぱり同じことをやろうとしている人がいた。

GL-MT300N-V2 as OpenVPN client need for Split Tunneling

この記事を書いた人がどうやって調べたかは記事を読んでもらうとして、結論的にはSSHとかでログインし、まず/etc/vpn.userovpn_main()関数を以下のようにコメントアウトする(ip routeipsetの計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/startvpnovpn_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)


投稿日

カテゴリー:

投稿者:

タグ: