Desativa o processamento do kernel de pacotes TCP para soquete bruto

3

Estou trabalhando em uma implementação TCP / IP, para um dispositivo embarcado, que desejo testar de um processo de espaço de usuário do Linux usando soquetes brutos.

raw (7) diz que

Raw sockets may tap all IP protocols in Linux, even protocols like ICMP or TCP which have a protocol module in the kernel. In this case, the packets are passed to both the kernel module and the raw socket(s).

Eu preciso desabilitar esse processamento do kernel (pelo menos em uma porta de destino específica) para testar minha implementação. Eu acho que há alguma manipulação envolvendo o iptables que pode fazer isso, mas francamente eu não sou um guru do Linux. Agradeço qualquer ajuda.

    
por Peter Woo 08.05.2012 / 23:22

1 resposta

2

O kernel lida com o handshake TCP por padrão

Tente fazer uma conexão TCP

$ telnet localhost 8877
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused

Aqui, a conexão é recusada diretamente pelo kernel.

Para parar de lidar com conexões TCP do kernel, você pode adicionar regras do netfilter. O seguinte comando faz o kernel ignorar os pacotes TCP que chegam à porta 8877

sudo iptables -A INPUT -p tcp --destination-port 8877 -j DROP

Agora tente fazer uma conexão TCP novamente

$ telnet localhost 8877
Trying 127.0.0.1...
^C (Killed by me as it gets stuck here)

O kernel não faz o handshake TCP agora, e você deve ser capaz de implementar o TCP no userspace, pois você ainda verá os pacotes 1 .

Para limpar a regra do netfilter depois de terminar, use

sudo iptables -D INPUT -p tcp --destination-port 8877 -j DROP
    
por 24.07.2015 / 18:03