ルーティング/iptables パイプラインでのイベントの順序について質問があります。最初に私の設定を説明します。質問はこの記事の最後にあります。
Linux 4.4 でポリシー ルーティングと iptables を使用しています。
2 つのインターフェイスがあります: wan0 (ISP 向け) と vpn-crypto (vpn プロバイダー向けの tun デバイス)
一部のトラフィックを選択的に vpn にルーティングし、それ以外はすべて wan0 にルーティングしたい
ポリシー ルーティングを次のように実装します。
mangle の OUTPUT テーブルで、パターンに一致する NEW トラフィックにマーク 0xC を設定しました。テスト目的で、特定の IP アドレス (37.9.239.33) に向けられたトラフィックをマークします。もちろん、MASQUEARADE のような他の iptables も持っていますが、それはこの質問には関係ありません。
すべての「マークされた」パケットを vpn にディスパッチする iproute2 ルールがあります。
0: from all lookup local 190: from all fwmark 0x4/0x4 lookup vpn 400: from all fwmark 0x8/0x8 oif wan0 unreachable 32766: from all lookup main 32767: from all lookup default
vpn テーブルには 1 つのルールのみが含まれ、vpn 経由ですべてが送信されます。
default via 10.33.0.1 dev vpn-crypto proto static src 10.33.148.125
ping -c3 37.9.239.33
37.9.239.33 が vpn 用にマークされた IP アドレスであるコマンドを使用してテストします。wan0 と vpn-crypto に接続された 2 つの tcpdump セッションは、予想どおり、パケットが効果的に出て vpn-crypto 経由で戻ってくることを示しています! これまでのところ、すべてがうまくいっています。
しかし、iptables を通過するパケット フローをログに記録しているときに、理解できない奇妙な動作が見られます。ログ トレースを FILTER.OUTPUT テーブルと MANGLE.POSTROUTING テーブルに挿入します。
この一連のイベントを観察します。
FILTER.OUTPUT: IN= OUT=wan0 SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=26960 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=1 MARK=0xc
MANGLE.POSTROUTING: IN= OUT=vpn-crypto SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=26960 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=1 MARK=0xc
MANGLE.POSTROUTING: IN= OUT=wan0 SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=27049 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=2
FILTER.OUTPUT: IN= OUT=wan0 SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=27100 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=2 MARK=0xc
MANGLE.POSTROUTING: IN= OUT=vpn-crypto SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=27100 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=2 MARK=0xc
MANGLE.POSTROUTING: IN= OUT=wan0 SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=27193 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=3
FILTER.OUTPUT: IN= OUT=wan0 SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=27237 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=3 MARK=0xc
MANGLE.POSTROUTING: IN= OUT=vpn-crypto SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=27237 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=3 MARK=0xc
MANGLE.OUTPUT のマークによる再ルーティングの決定は、FILTER.OUTPUT の前に発生すると予想していますが、後で発生するようです! 実際、すべての FILTER.OUTPUT パケットはまだ wan0 経由でルーティングされており、再ルーティングの決定がまだ行われていないことを示しています。Web で入手できるドキュメントは、この点に関して 50/50 に分かれています。例えば:
https://www.frozentux.net/iptables-tutorial/iptables-tutorial.htmlの第 6 章、表 6-2 には、filter.output の前に再ルーティングの決定が行われると記載されています。
http://www.aptalaska.net/~jclive/IPTablesFlowChart.pdfでは、filter.output の後に再ルーティングの決定が行われると述べています。
どちらが正しいですか?誰かがこれに光を当てることができますか?
3 つの ping のコンテキストで、 MANGLE.POSTROUTING テーブルに、 wan0 経由でルーティングされた 2 つの予期しないパケットが表示されます。これらは「マークされていない」ものであり、vpn-crypto経由でルーティングされたものと重複しているようです。どうしてこれなの?また、tcpdump によると、このパケットはインターフェイスに到達しません (これは正しいです)。
誰かがこの行動に光を当てることができますか?