Хорошо, я понимаю, что эта ситуация несколько необычна, но мне нужно установить TCP-соединение (трехстороннее рукопожатие), используя только сырые сокеты (в C, в Linux) - т.е. мне нужно самостоятельно создавайте заголовки IP и заголовки TCP. Я пишу сервер (поэтому я должен сначала ответить на входящий пакет SYN), и по какой-то причине я не могу понять, что это правильно. Да, я понимаю, что SOCK_STREAM справится с этим для меня, но по причинам, которые я не хочу вдаваться в это, это не вариант.TCP-соединение с гнездом SOCK_RAW
В учебниках, которые я нашел в Интернете, используя исходные сокеты, все описывают, как создать SYN-флудер, но это несколько проще, чем фактически устанавливать TCP-соединение, поскольку вам не нужно создавать ответ на основе оригинала пакет. Я получил примеры сценариев SYN, и я могу читать входящий SYN-пакет просто отлично от сырого сокета, но мне все еще не удается создать корректный ответ SYN/ACK на входящий SYN от клиента.
Итак, кто-нибудь знает хороший учебник по использованию сырых сокетов, который выходит за рамки создания SYN-флудера, или у кого-нибудь есть код, который мог бы это сделать (используя SOCK_RAW, а не SOCK_STREAM)? Я буду очень признателен.
MarkR абсолютно правы - проблема в том, что ядро посылает пакеты сброса в ответ на начальный пакет, потому что он считает, что порт закрыт. Ядро отбивает меня от ответа, и соединение умирает. Я использовал tcpdump для мониторинга соединения уже - я должен был быть более наблюдательным и заметил, что были ответы TWO, один из которых был сбросом, который искажал вещи, а также ответ, который моя программа создала. D'OH!
Решение, которое, как представляется, лучше всего работает с использованием правила iptables, как это было предложено MarkR, для блокировки исходящих пакетов. Однако есть более простой способ сделать это, чем использовать параметр метки, как это было предложено. Я просто сопоставляю, установлен ли флаг сброса TCP. В ходе обычного подключения это вряд ли понадобится, и это не имеет большого значения для моего приложения, если я блокирую все исходящие пакеты сброса из используемого порта. Это эффективно блокирует нежелательный ответ ядра, но не мои собственные пакеты. Если порт моя программа прослушивает 9999, то правило Iptables выглядит следующим образом:
iptables -t filter -I OUTPUT -p tcp --sport 9999 --tcp-flags RST RST -j DROP
Я знаю, что это вопрос 4 года, но ваше предложение выглядит довольно интересно, поэтому я решил попросить вас разъяснить. Возникает вопрос: есть ли какие-либо проблемы с маршрутизатором при передаче пакета ответа на определенную машину с MAC-адресом неправильного устройства? Будет ли пакет фильтроваться через брандмауэр или антивирус? – 2016-01-10 10:44:58