Antes de responder a su pregunta, permítame proporcionar información de fondo para quienes no estén familiarizados con el reenvío de puertos en macOS : el reenvío de puertos implica el reemplazo de las direcciones de destino y los puertos de paquetes entrantes para redirigir las conexiones a diferentes hosts y / o puertos. macOS logra el reenvío de puertos aplicando las reglas rdr
(redirección) al dispositivo de filtro 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 entrantes IPv4 enviados a 213.32.64.5:80
a 10.4.1.2:8080
(la palabra clave pass
evita que los paquetes redireccionados sean bloqueados por reglas de filtro, consulte here para más información). Para aplicar la regla, puede usar pfctl
o modificar /etc/pf.conf
, como se explica here . Para obtener más información sobre las reglas de rdr
, consulte man pf.conf
.
Ahora a tu pregunta:
¿Cómo configuro el reenvío de puertos de tal manera que tanto
localhost: ¿8080 y localhost enviarán solicitudes a mi servidor local?
Para poder acceder de forma confiable tanto al puerto original como al redireccionado , debe excluir la dirección y el puerto de destino (127.0.0.1:8080) para que no sean redirigidos:
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 solo para las pruebas. Luego, puede volver a cargar las reglas de filtro de paquetes predeterminadas de su Mac con sudo pfctl -F all -ef /etc/pf.conf
y agregar 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 here .
Seguí las instrucciones en esta respuesta para asignar el puerto 8080 al 80 en
mi mac Esto funciona muy bien, excepto por el hecho de que ya no puedo
Acceda a enlace explícitamente a través de Chrome (nunca
responde).
Este comentario en el blog de Sal Ferrarello describe un comportamiento similar. Pude reproducirlo, pero en mis pruebas la conexión al puerto 8080 funcionó de manera intermitente, o más precisamente: pude cargar enlace , pero después Esa primera conexión, haciendo clic en cualquier enlace en el sitio web expiró el tiempo de espera. Sin embargo, un tiempo después, pude conectarme una vez más, solo para experimentar en las conexiones posteriores los mismos tiempos de espera que antes.
Tuve que hacer un poco de rastreo de paquetes, me gustaría compartir los comandos que utilicé para registrar paquetes que coincidan con la regla rdr
(eso es lo que el parámetro log
a continuación es para) usando el pseudo-dispositivo" pflog0 "(vea 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