4 votos

¿Cómo reenviar el tráfico de una máquina a otra con `pfctl`?

Estoy tratando de reenviar el tráfico así:

Internal Network Computer (192.168.1.*)  Server (192.168.186:1234)  Internal Network Computer (192.168.1.198:80)
  • El servidor está conectado al router a través de ethernet en la interfaz en0

  • El ordenador interno está conectado al router por wifi

  • El servidor puede acceder a 192.168.1.198:80 sin problemas

Según varios otra pregunta relacionada s, he obtenido las siguientes reglas

nat on en0 from any to en0 -> (en0)
rdr pass inet proto tcp from any to any port 1234 -> 192.168.1.198 port 80

Sin embargo, me aparece lo siguiente cuando telnet en:

$ telnet 192.168.1.186 1234
Trying 192.168.1.186...
telnet: connect to address 192.168.1.186: Operation timed out
telnet: Unable to connect to remote host

Usando Wireshark en el 192.168.1.198 he confirmado que la conexión de telenet se recibe sin embargo no parece conectarse.


Más información:

  • rdr 's de 127.0.0.1 a 127.0.0.1 funcionan bien, por ejemplo:

    rdr pass inet proto tcp from any to any port 1234 -> 127.0.0.1 port 80

  • He confirmado que el puerto 80 está abierto en 192.168.1.198, y que es accesible desde el servidor

  • El cortafuegos (en Preferencias del Sistema) está desactivado en ambos ordenadores

  • He habilitado el reenvío de tráfico entre interfaces con

    sudo sysctl -w net.inet.ip.forwarding=1

  • Creo que puede ser algo con NAT (ver los posts de abajo) pero no estoy seguro

El mismo tema se discute en GitHub . @ctgreybeard, @dandriana, @snimavat y @sergeyzwezdin han informado del mismo problema. ¿Alguien tiene una solución?


Tenga en cuenta: Me gustaría utilizar pfctl y no SSH u otro servicio.


Aquí hay otros posts relacionados:

https://serverfault.com/questions/791181/redirecting-traffic-to-a-specific-address-and-port-using-pf-on-MacOS

¿Cómo puedo configurar mi mac (OS X Yosemite) como puerta de enlace a Internet?

7voto

H-man Puntos 1158

Así es como conseguí que funcionara.

Mi ejemplo utiliza tres hosts en mi red (10.10.0.0/16):

10.10.10.10 = Cliente Linux
10.10.6.237 = Mac "servidor real" que proporciona un servicio en el puerto 3000
10.10.1.200 = Mac "servidor" que realiza la redirección pf, escucha en el puerto 2004, interfaz vlan0

natrdr.pf

rdr on vlan0 inet proto tcp from 10.10.0.0/16 to 10.10.1.200 port 2004 -> 10.10.6.237 port 3000
nat on vlan0 inet proto tcp from 10.10.0.0/16 to 10.10.6.237 port 3000 -> 10.10.1.200

La especificidad asegura que su servidor no está NATting tráfico que no debería.

Para aquellos que hacen esto desde cero, después de crear su natrdr.pf anterior, ejecute los siguientes comandos desde la línea de comandos o un shell script, sudo o como Root. Integrando el pf normas con la de Apple pf.conf es un ejercicio que se deja al lector.

# Enable packet forwarding

sysctl -w net.inet.ip.forwarding=1

# Unless you have any rules you want to keep, let's flush existing NAT rules
pfctl -F nat

# Enable packet filtering
pfctl -e

# Load rules from our file
pfctl -f natrdr.pf

# Confirm rules are loaded
pfctl -s nat

# Check to see connections 
pfctl -s states

A continuación, utilicé telnet 10.10.1.200 2004 y fue inmediatamente reenviado al servidor Node/express que se ejecuta en el puerto 3000 en 10.10.6.237.

Ejemplo de salida de pfctl -s states para verificar que funciona:

ALL tcp 10.10.6.237:3000 <- 10.10.1.200:2004 <- 10.10.10.10:40744       ESTABLISHED:ESTABLISHED
ALL tcp 10.10.10.10:40744 -> 10.10.1.200:35947 -> 10.10.6.237:3000       ESTABLISHED:ESTABLISHED

Así que, para que coincida con su configuración:

rdr on en0 inet proto tcp from 192.168.1.0/24 to 192.168.1.186 port 1234 -> 192.168.1.198 port 80
nat on en0 inet proto tcp from 192.168.1.0/24 to 192.168.1.198 port 80 -> 192.168.1.186

El orden de las normas es importante.

La regla de redirección hace lo que se espera: reenvía todo el tráfico que llega al servidor al servidor real.

La regla NAT cambia los paquetes (ahora redirigidos) para que tengan una dirección IP de origen del servidor de redirección en lugar del cliente original.

La combinación de estas reglas garantiza la creación automática de una ruta inversa para los paquetes de retorno.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X