Eu quero interceptar todo o tráfego UDP, deixando tap1. E possivelmente responder a, e. Solicitações de DNS. Para conseguir isso eu escrevi alguns códigos Python ouvindo o localhost e use iptables com um conjunto de regras como este:
Chain PREROUTING (policy ACCEPT 2 packets, 333 bytes) pkts bytes target prot opt in out source destination 0 0 DIVERT udp -- tap1 any anywhere anywhere socket 0 0 TPROXY udp -- tap1 any anywhere anywhere TPROXY redirect 127.0.0.1:5001 mark 0x1/0x1 Chain DIVERT (1 references) pkts bytes target prot opt in out source destination 0 0 MARK udp -- any any anywhere anywhere MARK set 0x1 0 0 ACCEPT udp -- any any anywhere anywhere
O encaminhamento de políticas é feito com:
ip rule add fwmark 1 lookup 100 ip route add local 0.0.0.0/0 dev lo table 100
Esta configuração foi adaptada do Documentation / networking / tproxy.txt do kernel. Isso funciona perfeitamente para um soquete TCP aberto com a opção IP_TRANSPARENT.
Infelizmente, os soquetes UDP não parecem conseguir manipular conexões. Por exemplo, se eu fizer um ncat -u localhost 1234
, o soquete receberá dados, mas não poderá enviar nada de volta. O Wireshark mostrará exatamente três pacotes para:
Para que portas arbitrárias funcionem, acho que não é viável configurar regras NAT (S) apropriadas.
Então, qual é a configuração necessária para que isso funcione para portas de entrada arbitrárias ?