Antes de responder a su pregunta, permítame proporcionarle algunos antecedentes para aquellos que no estén familiarizados con el reenvío de puertos en MacOS El reenvío de puertos implica la sustitución de las direcciones y puertos de destino de los paquetes entrantes para redirigir las conexiones a diferentes hosts y/o puertos. MacOS consigue el reenvío de puertos aplicando rdr
(redirección) al dispositivo de filtrado de paquetes /dev/pf
. Por ejemplo, esta regla:
rdr pass inet proto tcp from any to 213.32.64.5 port 80 -> 10.4.1.2 port 8080
reenvía los paquetes IPv4 entrantes enviados a 213.32.64.5:80
a 10.4.1.2:8080
(el pass
evita que los paquetes redirigidos sean bloqueados por las reglas de filtrado, véase aquí para más información). Para aplicar la regla, puede utilizar pfctl
o modificar /etc/pf.conf
como se explica aquí . Para más información sobre rdr
normas, véase man pf.conf
.
Ahora a su pregunta:
¿Cómo puedo configurar el reenvío de puertos de tal manera que tanto localhost:8080 y localhost envíen peticiones a mi servidor local?
Para poder acceder tanto al puerto original como al redirigido de forma fiable , debe excluir la dirección y el puerto de destino (127.0.0.1:8080) de la redirección:
echo 'no rdr inet proto tcp from 127.0.0.1 port 8080
rdr inet proto tcp from any to 127.0.0.1 port 80 -> 127.0.0.1 port 8080
' | sudo pfctl -ef -
(Probado en una instalación limpia de MacOS High Sierra 10.13.6.)
El comando anterior sobrescribirá todas las reglas existentes, por lo que lo recomiendo sólo para pruebas. A continuación, puede recargar las reglas de filtrado de paquetes por defecto de su Mac con sudo pfctl -F all -ef /etc/pf.conf
y añadir las reglas:
no rdr inet proto tcp from 127.0.0.1 port 8080
rdr inet proto tcp from any to 127.0.0.1 port 80 -> 127.0.0.1 port 8080
a pf.conf
como se explica aquí .
He seguido las instrucciones en esta respuesta para asignar el puerto 8080 a 80 en mi mac. Esto funciona de maravilla, excepto por el hecho de que ya no puedo acceder a http://localhost:8080 explícitamente a través de Chrome (nunca responde).
Este comentario en el blog de Sal Ferrarello describe un comportamiento similar. He podido reproducirlo, pero en mis pruebas la conexión al puerto 8080 funcionaba de forma intermitente, o más exactamente: Podía cargar http://127.0.0.1:8080 pero después de esa primera conexión, al hacer clic en cualquier enlace de la página web se agota el tiempo. Un tiempo después, sin embargo, pude conectarme una vez más, sólo para experimentar en cualquier conexión posterior los mismos tiempos de espera que antes.
Tuve que hacer un poco de sniffing de paquetes, me gustaría compartir los comandos que utilicé para registrar los paquetes que coinciden con el rdr
regla (eso es lo que la log
parámetro más abajo) utilizando el pseudodispositivo "pflog0" (véase man pflog
y man pf.conf
para más detalles):
echo 'no rdr log inet proto tcp from 127.0.0.1 port 8080
rdr inet log proto tcp from any to 127.0.0.1 port 80 -> 127.0.0.1 port 8080
' | sudo pfctl -ef -
sudo ifconfig pflog0 create
sudo tcpdump -X -n -e -i pflog0
0 votos
Si desactiva el reenvío de puertos hace la conexión a
localhost:8080
¿trabajar de nuevo?0 votos
@nohillside ¿hay un comando para desactivar el reenvío de puertos rápidamente sin desactivar el SIP, etc.?
1 votos
/private/etc/pf.anchors/org.user.forwarding
se puede editar con el SIP activado0 votos
@nohillside - gracias - he desactivado las reglas y
localhost:8080
funciona de nuevo (obviamentelocalhost
no lo hace).0 votos
Hmm, vale, interesante :-) No esperaba
pf
para comportarse así, en realidad.