¿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?

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


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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.