Usando iptables para cambiar un puerto de destino
Pregunta
¿Es posible cambiar el puerto de destino de un paquete UDP utilizando iptables?
Estoy intentando que un agente SNMP envíe capturas en 1620 en lugar de 162. Lamentablemente, hasta ahora solo he podido cambiar el puerto de origen:
iptables -t nat -A POSTROUTING -p udp --dport 162 -j SNAT --to: 1620
Solución
Este uso aparentemente no es compatible. Tomado de http://www.netfilter.org/documentation/HOWTO/NAT- HOWTO.txt :
6.3.7. Alterar el destino de las conexiones generadas localmente
El código NAT te permite insertar Reglas de DNAT en la cadena de SALIDA, pero
esto no es totalmente compatible en 2.4 ( Puede ser, pero requiere un nuevo
. Opción de configuración, algunas pruebas, y un poco de codificación, así que a menos que alguien contrata a Rusty para escribirlo, yo no lo esperaría pronto).La limitación actual es que tu solo se puede cambiar el destino a
la máquina local (por ejemplo, `j DNAT - para 127.0.0.1 '), no a ninguna otra máquina, de lo contrario las respuestas no traducirse correctamente.
Otros consejos
Suponiendo que sabe a qué máquina se está enviando:
iptables -t nat -A OUTPUT -p udp --dport 162 -j DNAT --to-destination <dest-ip>:1620
puedes redireccionar 162 a 1620
iptables -t nat -A PREROUTING -p UDP --dport 162 -j REDIRECT --to-port 1620
@PiedPiper tenía razón. Con DNAT debe especificar una dirección IP, pero solo queremos hacer redireccionamiento de puertos, por lo que -j REDIRECT puede funcionar en este caso.
Consulte http: //www.netfilter .org / documentation / HOWTO // NAT-HOWTO-6.html # ss6.2
En lugar de hacer SNAT, intente con DNAT. El puerto de origen cambia porque SNAT significa SourceNAT, por lo que DNAT funcionará para usted.
Puede configurar una regla de desvío y luego volver a inyectar el paquete con el puerto modificado.
He hecho esto hace un tiempo en Mac OS X, pero es el mismo principio en Linux: http: //blog.dv8. ro / 2006/08 / using-divert-sockets-on-mac-os-x.html
Básicamente necesitas crear un proxy transparente muy simple.