TCP リクエストを偽装し、データを収集してローカル バッファに格納するプログラムを作成しています。このために、クライアントに接続されたシステムで、ルーティングの前にすべての着信パケットをキューに保持するように iptables を構成しました。次に、netfilter ライブラリを使用して、キューからパケットを読み取ります。この後、RAW ソケットを使用して、偽の TCP パケットをクライアントに送信します。これにより、クライアントからの SYN 要求に応答して SYN/ACK パケットを偽造することができます。
しかし、着信データに応答してクライアントに ACK を偽造しようとすると問題が発生します。この場合、送信元の実際の IP がパケットに含まれており、偽の IP ではありません。以下の ">>>" でマークされた 7 番目のトレースを参照してください。このソース IP は 192.168.10.10 として示されていますが、212.58.246.81 である必要があります。4 番目のトレース (つまり、SYN/ACK パケット) では、問題なく表示されます。
3 0.073852000 192.168.10.100 212.58.246.81 TCP 38307 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=502233100 TSER=0 WS=6
4 0.103102000 212.58.246.81 192.168.10.100 TCP http > 38307 [SYN, ACK] Seq=0 Ack=1 Win=31744 Len=0
5 0.103147000 192.168.10.100 212.58.246.81 TCP 38307 > http [ACK] Seq=1 Ack=1 Win=5840 Len=0
6 0.103349000 192.168.10.100 212.58.246.81 HTTP GET /go/rss/int/news/-/sport2/hi/tennis/9519762.stm HTTP/1.1
>>> 7 1.118729000 192.168.10.10 192.168.10.100 TCP http > 38307 [ACK] Seq=1 Ack=1 Win=31744 Len=0
8 1.118788000 192.168.10.100 192.168.10.10 TCP 38307 > http [RST] Seq=1 Win=0 Len=0
9 3.102627000 192.168.10.100 212.58.246.81 HTTP [TCP Retransmission] GET /go/rss/int/news/-/sport2/hi/tennis/9519762.stm HTTP/1.1
10 3.148590000 192.168.10.10 192.168.10.100 TCP [TCP Dup ACK 7#1] http > 38307 [ACK] Seq=1 Ack=1 Win=31744 Len=0
11 3.148606000 192.168.10.100 192.168.10.10 TCP 38307 > http [RST] Seq=1 Win=0 Len=0
また、偽のTCP ACKを送信するために、以下のような「sendip」コマンドを試しました
sendip -p ipv4 -p tcp -is 212.58.246.81 -id 192.168.10.100 -ts 80 -td 4567 -tfa 1 -tfs 0 -d "Data" 192.168.10.100
ここで、tfa と tfs はそれぞれ ack フラグと syn フラグを表します。これも期待どおりに機能せず、212.58.246.81 ではなく 192.168.10.10 から発信されたものとして表示されます。しかし、両方のフラグ (syn と ack) を 1 に設定すると、正常に動作します。
OSはUbuntuです。誰でも私が間違っているところを教えてください。どうもありがとうございました。