iptables MARK および ip route コマンドを使用して、パケットの着信インターフェイスを変更しようとしていました。
ROUTE ターゲットの代わりに iptable Mark および iproute2 ユーティリティを使用することを提案するこのアプローチを試しましたが、受信パスでパケットの着信インターフェイスを変更することに成功することはありませんでした。
Linuxのインターフェイスにバインドするアプリケーション 'A' があります。intfA
つまり、アプリケーションは 経由でのみパケットを送受信しますintfA
。
送信経路
トンネル ベースのセットアップでは、次のコマンドintfA
をtap0
使用して から にパケットを送信できました。iptable
iptables -t mangle -A OUTPUT -d 8.9.10.11/32 -j MARK --set-mark 1
ip rule add fwmark 1 priority 9000 table 1
メイン テーブルのデフォルト ルーティング エントリは次を指していますintfA
テーブル '1' では、デフォルトのルーティング テーブル エントリ ポイントをtap0
:
route add default dev tap0 table 1
カーネル dmesg ログから、パケットの送信インターフェイスが から に正常に変更されたことを確認できintfA
ましたtap0
。
復路では
トンネルから暗号化されたパケットを取得した後tap0
、それを復号化し、宛先が「abcd」のプレーン テキスト パケットをtap0
インターフェイス経由で Linux カーネルに挿入します。
そのため、カーネルの事前ルーティング フックで、パケットが IP = 'abcd' および incoming で送信されていることがわかりますtap0
。
次の iptable ルールを使用して、着信インターフェイスを変更しました。
iptables -t mangle -A PREROUTING -d a.b.c.d/32 -j MARK --set-mark 2
ip rule add fwmark 2 priority 8000 table 2
テーブル '2' では、デフォルトのルーティング テーブル エントリ ポイントをintfA
:
route add default dev intfA table 2
次の iptable コマンドを使用して、PREROUTING フックと INPUT フックでパケットをログに記録しようとしました。
iptables -t mangle -A PREROUTING -d a.b.c.d/32 -j LOG --log-level 0 --log-prefix "VPN PREOUTING: "
iptables -t mangle -A INPUT -d a.b.c.d/32 -j LOG --log-level 0 --log-prefix "VPN INPUT: "
パケットの着信インターフェイスがPREROUTING フックと INPUT フックの間で変更さtap0
れることを望んでいました。intfA
しかし驚くべきことに、両方のカーネル ログ トレースでインターフェイスが変更されていません。マーク 2 でマークされた着信パケットも確認できました。
dmesg ログから、受信インターフェイスがまだtap0
INPUT フックの後に残っていることを確認しました。
私が使用した iptables コマンドのこの動作の背後にある理由を理解したいと思いました。この問題の原因となっている、使用した iptables コマンドで何かを見逃したかどうかはわかりません。