Назад | Перейти на главную страницу

Отключить ядро ​​обработки TCP-пакетов для сырого сокета

Я работаю над реализацией 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