1

Для моего приложения мне нужно перехватить определенные пакеты TCP/IP и направить их на другое устройство через пользовательский канал связи (не Ethernet). Мне нужны все контрольные пакеты TCP и полные заголовки. Я выяснил, как получить их с помощью необработанного сокета с помощью сокета (PF_PACKET, SOCK_RAW, htons (ETH_P_IP). Это работает хорошо и позволяет мне прикреплять фильтры, чтобы просто увидеть интересующий меня порт TCP.

Тем не менее, Linux также видит эти пакеты. По умолчанию он отправляет RST при получении пакета на номер порта, о котором он не знает. Это не хорошо, так как я планирую отправить ответ сам позже. Если я открою второй "обычный" сокет на том же порту, используя сокет (PF_INET, SOCK_STREAM, 0) и listen () на нем, Linux затем отправит ACK на входящие TCP-пакеты. Ни один из этих вариантов не является тем, что я хочу. Я хочу, чтобы он ничего не делал с этими пакетами, чтобы я мог справиться со всем сам. Как я могу сделать это?

1 ответ1

1

Iptables

Вы можете отбросить эти пакеты в цепочке OUTPUT таблицы FILTER.

Протокол

RFC 793 (TCP) определяет поведение RST-отправки

SEGMENT ARRIVES

  If the state is CLOSED (i.e., TCB does not exist) then [...]:
  An incoming segment not containing a RST causes a RST to be sent in response. 

И linux явно реализует это правильно.

Интерфейс sysctl

Кажется, что поведение также не настраивается через интерфейс sysctl (см. Tcp (7)). В любом случае, эта справочная страница, безусловно, хорошо читается, если вы еще не сталкивались с ней.

Код ядра

В зависимости от того, что вы действительно хотите достичь, изменение кода ядра может быть возможным.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .