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