Я пишу программу, которая подделывает TCP-запросы и собирает данные для хранения в локальном буфере. Для этого в системе, подключенной к клиенту, я настроил iptables для хранения всех входящих пакетов в очереди перед маршрутизацией. Затем я использую библиотеку netfilter для чтения пакетов из очереди. После этого, используя сокеты RAW, я отправляю клиенту поддельные TCP-пакеты. Благодаря этому я могу подделать пакет SYN/ACK в ответ на запрос SYN от клиента.
Но проблема возникает, когда я пытаюсь подделать ACK клиенту в ответ на входящие данные. В этом случае в пакете приходит настоящий 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
Также я попробовал команду «sendip», как показано ниже, чтобы отправить поддельный TCP ACK.
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 соответственно. Это также не сработало, как ожидалось, и показано, что оно исходит из 192.168.10.10 вместо 212.58.246.81. Но если я установлю оба флага (syn и ack) равными 1, тогда все будет работать нормально.
ОС - Убунту. Может кто-нибудь, пожалуйста, дайте мне знать, где я ошибаюсь. Спасибо большое за вашу помощь.