Algo assustador está acontecendo aqui e eu não sei como consertar isso. Resumo: o tráfego que parece idêntico ao tcpdump está sendo tratado pelo iptables de forma diferente. Detalhes abaixo.
Configuração de teste:
-
device 0 - Uma máquina linux localizada no endereço IP 192.168.0.121
-
dispositivo 1 - um dispositivo mudo que apenas envia pacotes para a porta 4000 em 192.168.0.121. O endereço IP deste dispositivo é definido com o comando: sudo arp -s 192.168.0.27 MAC_ADDRESS, porque ele não faz solicitações DHCP e não pode fazer nada além de seu trabalho.
-
device 2 - Uma máquina linux enviando pacotes para a porta 4000 em 192.168.121 com o comando:
watch -n 1 "date | nc -4u -w1 -v 192.168.0.121 4000"
saída tcpdump da situação:
22:00:01.845359 IP 192.168.3.30.50705 > 192.168.0.121.4000: UDP, length 1
22:00:01.845391 IP 192.168.3.30.50705 > 192.168.0.121.4000: UDP, length 29
22:00:02.022257 IP 192.168.0.27.27 > 192.168.0.121.4000: UDP, length 12
22:00:03.022797 IP 192.168.0.27.27 > 192.168.0.121.4000: UDP, length 12
...
Nessa circunstância, a saída de socat udp-l:4000,fork stdout
é:
�����XX@�XWed Sep 2 22:02:18 PDT 2015
������XX��XWed Sep 2 22:02:22 PDT 201
...
E a saída de socat udp-l:2700,fork stdout
está vazia.
O lixo estranho é do sensor e a data é do comando acima. Observe que o IP / porta de destino desse tráfego é exatamente o mesmo de acordo com o tcpdump. Agora, se eu encaminhar todo o tráfego da porta UDP 4000 para 2700:
sudo iptables -t nat -A PREROUTING -p udp --dst 192.168.0.121 --dport 4000 -j DNAT --to-destination 192.168.0.121:2700
tcpdump parece exatamente o mesmo, mas agora, a saída de socat udp-l:4000,fork stdout
é:
���@�@�@�������@�@�@�������@������������@�@@����@��� ...
e a saída de socat udp-l:2700,fork stdout
é:
XXXWed Sep 2 22:05:42 PDT 2015
XXXWed Sep 2 22:05:46 PDT 2015
XXXWed Sep 2 22:05:50 PDT 2015
...
Como você pode ver, o tráfego do dispositivo 1 está sendo ignorado pelo iptables e continua no host na porta 4000, mas o tráfego do dispositivo 2 está sendo capturado pela regra e encaminhado para a porta 2700. Eu posso limpar o iptables e reemitir a regra durante todo o dia e apenas alterna entre esses dois estados.
Alguém tem alguma idéia do que pode estar acontecendo?