Я работаю над реализацией TCP / IP для встроенного устройства, которое хочу протестировать из процесса пользовательского пространства Linux с использованием сырых сокетов.
raw (7) говорит, что
Необработанные сокеты могут задействовать все IP-протоколы в Linux, даже такие протоколы, как ICMP или TCP, которые имеют модуль протокола в ядре. В этом случае пакеты передаются как модулю ядра, так и необработанному сокету (сокетам).
Мне нужно отключить эту обработку ядра (по крайней мере, на определенном порту назначения), чтобы протестировать мою реализацию. Я думаю, что есть некоторые манипуляции с iptables, которые могут это сделать, но, честно говоря, я не гуру Linux. Я ценю любую помощь.
Ядро по умолчанию обрабатывает квитирование TCP
Попробуйте установить TCP-соединение
$ telnet localhost 8877
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
Здесь ядро напрямую отказывает в подключении.
Чтобы ядро перестало обрабатывать TCP-соединения, вы можете добавить правила netfilter. Следующая команда заставляет ядро игнорировать TCP-пакеты, поступающие на порт. 8877
sudo iptables -A INPUT -p tcp --destination-port 8877 -j DROP
Теперь попробуйте снова установить TCP-соединение
$ telnet localhost 8877
Trying 127.0.0.1...
^C (Killed by me as it gets stuck here)
Ядро сейчас не выполняет квитирование TCP, и вы должны иметь возможность реализовать TCP в пользовательском пространстве, так как вы все равно будете видеть пакеты. 1.
Чтобы очистить правило netfilter после того, как вы закончите, используйте
sudo iptables -D INPUT -p tcp --destination-port 8877 -j DROP