TCP рукопожатие с сокетом SOCK_RAW

Хорошо, я понимаю, что эта ситуация несколько необычна, но мне нужно установить TCP-соединение (трехстороннее рукопожатие), используя только необработанные сокеты (в C, в Linux) - т.е. мне нужно создавать заголовки IP и заголовки TCP самостоятельно , Я пишу сервер (поэтому я должен сначала ответить на входящий пакет SYN), и по какой-то причине я, кажется, не могу понять это правильно. Да, я понимаю, что SOCK_STREAM будет обрабатывать это для меня, но по причинам, которые я не хочу обсуждать, это не вариант.

Учебные руководства, которые я обнаружил в Интернете по использованию необработанных сокетов, все описывают, как создать флудер SYN, но это несколько проще, чем фактическое установление TCP-соединения, поскольку вам не нужно создавать ответ на основе исходного пакета. Я получил работающие примеры SYN-флудеров, и я могу прекрасно прочитать входящий пакет SYN из необработанного сокета, но у меня все еще возникают проблемы при создании действительного ответа SYN / ACK на входящий SYN от клиента.

Итак, кто-нибудь знает хороший учебник по использованию сырых сокетов, который выходит за рамки создания SYN-флудера, или у кого-нибудь есть код, который мог бы это сделать (используя SOCK_RAW, а не SOCK_STREAM)? Я был бы очень признателен.

MarkR абсолютно прав - проблема в том, что ядро отправляет пакеты сброса в ответ на начальный пакет, потому что считает, что порт закрыт. Ядро бьет меня в ответ и связь умирает. Я уже использовал tcpdump для мониторинга соединения - я должен был быть более наблюдательным и заметил, что есть ДВА ответа, один из которых был сбросом, который испортил все, а также ответ, созданный моей программой. D & APOS; ОН!

Решение, которое, кажется, работает лучше всего, состоит в том, чтобы использовать правило iptables, как предложено MarkR, для блокировки исходящих пакетов. Однако существует более простой способ сделать это, чем использование опции метки, как предлагается. Я просто сопоставляю, установлен ли флаг сброса TCP. В ходе нормального соединения это вряд ли понадобится, и для моего приложения не имеет значения, блокирую ли я все исходящие пакеты сброса с используемого порта. Это эффективно блокирует нежелательный ответ ядра, но не мои собственные пакеты. Если порт, который прослушивает моя программа, это 9999, тогда правило iptables выглядит следующим образом:

iptables -t filter -I OUTPUT -p tcp --sport 9999 --tcp-flags RST RST -j DROP

Ответы на вопрос(7)

Ваш ответ на вопрос