TCP ACK подмена
Я пишу программу, которая подделывает TCP-запросы и собирает данные для хранения в локальном буфере. Для этого в системе, подключенной к клиенту, я настроил iptables для хранения всех входящих пакетов в очереди перед маршрутизацией. Затем я использую библиотеку netfilter для чтения пакетов из очереди. После этого с помощью сокетов RAW я отправляю поддельные TCP-пакеты клиенту. Благодаря этому я могу подделать пакет SYN/ACK в ответ на запрос SYN от клиента.
Но проблема возникает, когда я пытаюсь подделать ACK для клиента в ответ на входящие данные. В этом случае реальный ip источника приходит в пакете, а не в фальшивом. Пожалуйста, смотрите седьмой след ниже, отмеченный ">>>". При этом исходный 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, то он работает нормально.
ОС Ubuntu. Может кто-нибудь, пожалуйста, дайте мне знать, где я иду не так. Большое спасибо за вашу помощь.