1

Linux libnetfilter_queuedelayed packet problemで説明されているように、TCP/UDP トラフィックのネットワーク遅延モデルを実装したいと考えています。そこで Andy の提案に従い、パケット全体をプログラムにコピーして優先キューに配置しました。時間が経過すると、プライオリティ キュー内のパケットが削除され、RAW ソケットを使用してディスパッチされます。

私が直面している問題は次のとおりです: libnetfilter_queue によるパケットの初期キャプチャは、ポートを照合することによって行われています (sudo iptables -A OUTPUT -p udp --dport 8000 -j NFQUEUE --queue-num 0)。これらのパケットが RAW ソケットによって再注入されると、libnetfilter_queue によって再度取得され (ポートが同じままであるため)、永久にループし続けます。

私は本当に混乱していて、抜け道が思い浮かびません。私を助けてください。

4

2 に答える 2

2

skb->markを使用します。これは、ホストのIPスタック内にのみ存在するマーキングです。ネットワークパケット自体には何の影響もありません。

'--mark'フィルターを使用してiptablesを使用してフィルター処理できます。再挿入されたパケットが再び遅延しないように、遅延チェーンから戻るために使用します。

iptables -A DELAY -m mark --mark 0xE -j RETURN
iptables -A DELAY -j DELAY

を使用して、マークを適用するようにrawソケットを構成できますsetsockopt(fd, SOL_SOCKET, SO_MARK, ...)。ソケットを開いた後、これを行う必要があるのは1回だけです。マーク値は、ソケットを介して送信する各パケットに自動的に適用されます。

于 2012-05-06T19:07:16.720 に答える
-1

これはおそらく最善の方法ではありませんが、考えられる解決策の 1 つを次に示します。IP ヘッダーの DSCP フィールドを使用して、新しいパケットと再注入するパケットを区別できます。DSCP が 0 のパケットのみをキューに入れるように iptables ルールを変更します ( http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#DSCPMATCHを参照)。これは、OS がパケットを送信するときに DSCP を 0 に設定することを前提としています。これで、OS によって生成されたすべての新しいパケットは、引き続き iptables ルールに一致するため、プログラムに送信されます。プログラムで RAW ソケットを使用して新しいパケットを作成する場合は、DSCP 値をゼロ以外の値に設定します。新しいパケットが再注入されると、iptables ルールと一致しなくなり、ネットワーク経由で送信されます。

DSCP 値が設定されたネットワーク経由でパケットを送信したくない場合は、別の iptables ルールを追加して、dscp 値を 0 に書き換えることができます。

于 2012-05-06T18:48:16.953 に答える