Como posso eliminar silenciosamente alguns pacotes de saída?

8

Estou testando um aplicativo em que estou trabalhando e preciso poder eliminar silenciosamente pacotes UDP de saída por um curto período de tempo para replicar um possível modo de falha.

Há alguma maneira de fazer isso?

Nota: iptables DROP não é silencioso para mensagens enviadas! Quando uma send()chamada ou similar é descartada iptables, ela retorna EPERMpor algum motivo bizarro (veja aqui . Infelizmente, não posso usar essa resposta, pois meu destino fica a um único salto).

xtables-addons costumava ter um STEALverbo , mas foi removido há alguns anos atrás por nenhuma razão que eu possa encontrar.


Agora tentei usar rotas falsas na tabela de roteamento e, infelizmente, isso parece quebrar as duas direções do tráfego de comunicação.
Para o teste que preciso fazer, tenho que permitir o tráfego UDP de entrada e, assim que instalo a rota falsa, os pacotes recebidos de streaming são interrompidos imediatamente, embora a fonte ainda os esteja enviando.

Nome falso
fonte
1
Longe de uma solução completa / arrumada, mas eu precisava de condições de teste semelhantes no passado. No meu caso, adicionar uma rota estática falsa ao servidor que estou conectando funcionou bem.
steve
@ steve - Uma rota falsa parece quebrar as coisas em ambas as direções, e eu preciso manter a funcionalidade da direção do RX.
Fake Name

Respostas:

2

Que tal adicionar interface fictícia e definir a rota para essa interface?

# ip link add dummy0 type dummy
# ip link set dev dummy0 up
# ip route add 8.8.8.8/32 dev dummy0
# ping -c3 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2015ms

Ele sempre envia pacotes para qualquer endereço (vizinho ou remoto) dummy0.

# tshark -i dummy0
Running as user "root" and group "root". This could be dangerous.
Capturing on 'dummy0'
  1   0.000000   10.10.0.59 -> 8.8.8.8      ICMP 98 Echo (ping) request  id=0x1ce0, seq=1/256, ttl=64
  2   1.007348   10.10.0.59 -> 8.8.8.8      ICMP 98 Echo (ping) request  id=0x1ce0, seq=2/512, ttl=64
  3   2.015394   10.10.0.59 -> 8.8.8.8      ICMP 98 Echo (ping) request  id=0x1ce0, seq=3/768, ttl=64
yaegashi
fonte
Infelizmente, isso parece não permitir pacotes recebidos que correspondem à rota de outras interfaces. Como tal, ele realmente não funciona (ele interrompe o fluxo UDP rx aberto que preciso permitir para continuar).
Fake Name
2

Adicionar uma rota está interrompendo o tráfego de entrada devido à filtragem de caminho inverso. Solução simples: desative a filtragem de caminho reverso na interface:

echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter

(use sua interface de entrada no lugar eth0acima).

Você também pode usar o REDIRECTdestino (envie o pacote para, por exemplo, um netcat atendendo a ele nc -l -u -p 1234 > /dev/null). Uma versão mais complicada seria NFQUEUE.

derobert
fonte