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 ログから、受信インターフェイスがまだtap0INPUT フックの後に残っていることを確認しました。
私が使用した iptables コマンドのこの動作の背後にある理由を理解したいと思いました。この問題の原因となっている、使用した iptables コマンドで何かを見逃したかどうかはわかりません。