
Я работаю над стеком TCP/IP, который в настоящее время работает из пользовательского пространства Linux с использованием сырых сокетов.
Чтобы проверить это, мне нужно отключить TCP-код ядра Linux для определенного порта, чтобы ядро не вмешивалось в мою реализацию (например, чтобы ядро не реагировало на рукопожатие).
Я ссылалсяэтот, который говорит, что сырые сокеты обходят netfilter, но во время моего тестирования пакет не был получен сырым сокетом.
После дополнительных исследований я обнаружил, чтомой сокет AF_INET все еще находится в стеке TCP/IP, однако я не хочу реализовывать Ethernet-фреймы.
Можно ли как-то отключить обработку ядра на определенном порту без использования AF_PACKET?
РЕДАКТИРОВАТЬ:
Я создаю свой сокет следующим образом: socket(AF_INET, SOCK_RAW, IPPROTO_TCP)
Затем я устанавливаю HDRINCL:setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on))
решение1
Для этого можно использовать таблицу RAW в IPTables. Используйте правило типа:
iptables -t raw -A PREROUTING -p tcp --dport <your port> -j DROP
Это должно привести к тому, что ядро проигнорирует ваш пакет и не будет отвечать на рукопожатие.