Я тут озадачился перехватом TCP соединений.
Исходные данные: Linux-машина с сетевым интерфейсом, слушающим зеркалируемый порт свича + 1 интерфейс для того, чтобы посылать сгенерированные пакеты в сеть.
На первом интерфейсе мы ловим TCP пакеты с сегментом SYN, сразу как только такой пакет приходит, отсылаем SYN,ACK "якобы от получателя" в сеть. Сразу после этого шлем RST настоящему получателю пакета. После чего связываемся с настоящим получателем. Принцип именно в том, чтобы "встать в середину". Проблема в том, что получатель не реагирует на наш RST и шлет свой SYN,ACK. Вот вывод ethereal:
3 2.857378 192.168.133.200 -> 192.168.132.6 TCP 2410 > http [SYN] Seq=0 Ack=0 Win=65535 Len=0 MSS=1460 - перехваченный SYN
4 2.857455 192.168.132.6 -> 192.168.133.200 TCP http > 2410 [SYN, ACK] Seq=0 Ack=1 Win=1500 Len=0 - поддельный SYN,ACK
5 2.857463 192.168.133.200 -> 192.168.132.6 TCP [TCP keep alive] 2410 > http [RST] Seq=16777216 Ack=656072754 Win=1500 Len=0 - наш RST, который неправильно интерпретируется
6 2.857796 192.168.132.6 -> 192.168.133.200 TCP http > 2410 [SYN, ACK] Seq=0 Ack=1 Win=1500 Len=0 - а вот и ответ от сервера
Вопрос: как правильно "отменить" посылку SYN?