Подмена TCP ACK

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

ОС - Убунту. Может кто-нибудь, пожалуйста, дайте мне знать, где я ошибаюсь. Спасибо большое за вашу помощь.


person snibu    schedule 22.06.2011    source источник
comment
Какую проблему вы решаете, подделывая acks для http-клиента?   -  person This    schedule 22.06.2011
comment
Я пытаюсь разделить сквозное TCP-соединение на несколько соединений. Один разделен, как указано выше, а данные и сведения о соединении будут храниться в буфере. Затем используйте другой транспортный протокол, такой как SCTP, для передачи данных и сведений о соединении на другой компьютер, и, наконец, этот компьютер открывает TCP-соединение с реальным веб-сервером, получает данные и отправляет их обратно. Вид ниже TCP ‹---› SCTP ‹--› TCP   -  person snibu    schedule 22.06.2011
comment
Я не уверен, что это поле идентификации ip вызывает проблему. Выдержка из Википедии. В некоторых экспериментальных работах предлагалось использовать поле идентификатора для других целей, например, для добавления информации об отслеживании пакетов в дейтаграммы, чтобы помочь отследить дейтаграммы с поддельными адресами источника.   -  person snibu    schedule 22.06.2011
comment
Как проксирование через SCTP решает проблему? На каком языке вы писали свой код?   -  person This    schedule 22.06.2011
comment
У нас есть канал с высокой задержкой (коротковолновая радиосвязь), по которому планируется использовать SCTP, так как он лучше, чем TCP (надеюсь :))... программа написана на C..   -  person snibu    schedule 22.06.2011