Como evito que o kernel do Linux responda aos pacotes TCP recebidos?

1

Para meu aplicativo, preciso interceptar certos pacotes TCP / IP e encaminhá-los para um dispositivo diferente em um link de comunicação personalizado (não Ethernet). Eu preciso de todos os pacotes de controle TCP e os cabeçalhos completos. Eu descobri como obtê-los usando um soquete bruto usando soquete (PF_PACKET, SOCK_RAW, htons (ETH_P_IP). Isso funciona bem e permite-me anexar filtros para ver apenas a porta TCP que me interessa.

No entanto, o Linux também vê esses pacotes. Por padrão, ele envia um RST quando recebe um pacote para um número de porta que não conhece. Isso não é bom, já que planejo enviar uma resposta mais tarde. Se eu abrir um segundo soquete "normal" na mesma porta usando soquete (PF_INET, SOCK_STREAM, 0) e listen (), o Linux enviará o ACK para os pacotes TCP recebidos. Nenhuma dessas opções é o que eu quero. Eu quero que ele faça nada com esses pacotes para que eu possa lidar com tudo sozinho. Como posso conseguir isso?

    
por Jon 28.06.2013 / 08:59

1 resposta

1

iptables

Você pode descartar esses pacotes na cadeia OUTPUT da tabela FILTER.

O protocolo

RFC 793 (TCP) especifica o comportamento de envio de 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. 

E o Linux o implementa corretamente.

A interface sysctl

Parece que o comportamento também não é ajustável através da interface sysctl (veja tcp (7) ). De qualquer forma, essa página man é definitivamente uma boa leitura se você ainda não a encontrou.

Código do kernel

Dependendo do que você realmente deseja alcançar, alterar o código do kernel diretamente pode ser uma opção.

    
por 28.06.2013 / 10:39