Asignar puertos 80 a 8080 pero mantener el acceso 8080 explícito

1

Seguí las instrucciones en esta respuesta para asignar el puerto 8080 a 80 en mi mac. Esto funciona muy bien, excepto por el hecho de que ya no puedo acceder a http://localhost:8080 explícitamente a través de Chrome (nunca responde).

Dicho de otra manera, puedo iniciar un servidor http en mi máquina escuchando en el puerto 8080, lo cual, habiendo reasignado mis puertos, funcionará cuando navegue a localhost en mi navegador, pero no trabajar si navego a localhost:8080 .

Esto causa problemas con ciertos códigos de biblioteca que incluyen explícitamente el puerto del servidor en sus solicitudes http.

¿Cómo configuro el reenvío de puertos de tal manera que ambos localhost:8080 y localhost enviarán solicitudes a mi servidor local?

    
pregunta Ed Hinchliffe 27.07.2018 - 10:39

1 respuesta

2

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
    
respondido por el jaume 01.08.2018 - 09:22

Lea otras preguntas en las etiquetas