Я пишу программу, которая подделывает 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. Может кто-нибудь, пожалуйста, дайте мне знать, где я иду не так. Большое спасибо за вашу помощь.