¿Cómo puedo redirigir el tráfico saliente al puerto 80 usando iptables localmente?

19

Estoy tratando de redirigir localmente los puertos en mi máquina Ubuntu usando iptables. Similar al proxy transparente. Quiero atrapar cualquier cosa que intente dejar mi sistema en el puerto 80 y redirigirlo a un host y puerto remotos.

¿Puedo lograr esto usando las funciones NAT y de enrutamiento previo de iptables?

pjf
fuente

Respuestas:

30

Prueba esta iptablesregla:

$ sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination IP:80

Lo anterior dice a:

  • Agregue la siguiente regla a la tabla NAT ( -t nat).
  • Esta regla se agregará ( -A) al tráfico saliente ( OUTPUT).
  • Solo nos interesa el tráfico TCP ( -p tcp).
  • Solo nos interesa el tráfico cuyo puerto de destino es 80 ( --dport 80).
  • Cuando tengamos una coincidencia, salte a DNAT ( -j DNAT).
  • Dirija este tráfico al puerto IP @ de algún otro servidor 80 ( --to-destination IP:80).

¿Qué es DNAT?

DNAT
    This target is only valid in the nat table, in the PREROUTING and OUTPUT 
    chains, and user-defined chains which are only called from those chains.
    It specifies that the destination address of the packet should be modified 
    (and all future packets in  this  connection will also be mangled), and
     rules should cease being examined.

Referencias

slm
fuente
gracias por eso pero no parece funcionar. Sin embargo, desde entonces he encontrado esto que funciona.
pjf
sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination xx.xx.xx.xx: 3128
pjf
¿Es porque esto es localmente y no a través de una puerta de enlace? Tu SNAT funcionaría a través de una puerta de enlace?
pjf
@pjf: eso creo. He actualizado mi respuesta.
slm
@pjf: encontré ambas reglas y estaba en el proceso de actualizar mi respuesta con ambas. Sin embargo, no estaba seguro de en qué situación estabas.
slm
6

Esto puede hacerse más específico para operar solo en el tráfico a un host de destino particular. Por ejemplo, cuando Postfix cometió un error y los correos en cola quieren ser enviados a una antigua dirección IP.

iptables -t nat -A OUTPUT -p tcp -d {ONLY_TO_THIS_DESTINATION} --dport 25 -j DNAT --to-destination {NEW_IP}:25
Widmo
fuente
4

Esto puede permitirle traducir puertos a todas las direcciones IP. La principal diferencia aquí es la ausencia de una dirección IP en el --to-destinationcampo.

iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination :80
Felipe Alvarez
fuente
Consejo muy útil; exactamente lo que necesitaba ¿Hay alguna manera de incrementar el número de puerto? Digamos que tengo un rango de 100 puertos y quiero aumentarlos a todos en una cantidad específica.
Zdenek,
No estoy seguro de lo que quieres decir. ¿Podrías escribir un bucle for en Bash?
Felipe Alvarez
Un bucle que agrega 100 reglas de iptables funcionaría, pero lo ralentizaría. Prefiero poder decirle que incremente muchos puertos sucesivos en una sola regla.
Zdenek
@ Zdenek No sé si eso es posible con iptables. ¿Has mirado firewalld?
Felipe Alvarez