2

iptables MARK および ip route コマンドを使用して、パケットの着信インターフェイスを変更しようとしていました。

ROUTE ターゲットの代わりに iptable Mark および iproute2 ユーティリティを使用することを提案するこのアプローチを試しましたが、受信パスでパケットの着信インターフェイスを変更することに成功することはありませんでした。

Linuxのインターフェイスにバインドするアプリケーション 'A' があります。intfAつまり、アプリケーションは 経由でのみパケットを送受信しますintfA

送信経路

トンネル ベースのセットアップでは、次のコマンドintfAtap0使用して から にパケットを送信できました。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 コマンドで何かを見逃したかどうかはわかりません。

4

1 に答える 1