Redirección de puertos en macOS Sierra

Cambié a macOS Sierra y no puedo hacer que el reenvío de puertos funcione para localhost (http y https) usando la interfaz de bucle invertido lo0. Estoy usando pf y siguiendo las instrucciones existentes para El Capitan pero sin éxito:

https://apple.stackexchange.com/a/230331/81267 , http://blog.brianjohn.com/forwarding-ports-in-os-x-el-capitan.html

Básicamente, configuro ifconfig:

sudo ifconfig lo0 10.0.0.1 alias

Luego creo un pfarchivo de anclas:/etc/pf.anchors/myorganization

rdr pass on lo0 inet proto tcp from any to 10.0.0.1 port = 80 -> 127.0.0.1 port 3000
rdr pass on lo0 inet proto tcp from any to 10.0.0.1 port = 443 -> 127.0.0.1 port 7000

Agregue una referencia en pf.conf (tuvo que deshabilitar y luego volver a habilitar SIP para hacer esto):

rdr-anchor "myorganization"
...
load anchor "myorganization" from "/etc/pf.anchors/myorganization"

Pruebo los anclajes:

sudo pfctl -vnf /etc/pf.anchors/myorganization

y el resultado se ve bien:

...
TRANSLATION RULES:
nat-anchor "com.apple/*" all
rdr-anchor "com.apple/*" all
rdr-anchor "myorganization" all
...

Los he habilitado:

sudo pfctl -evf /etc/pf.conf

He agregado localhosta mi /etc/hosts

127.0.0.1   localhost

Pero cuando http://localhostbusco obtengo ERR_CONNECTION_REFUSED. Si navego al http://localhost:3000sitio está funcionando bien.

Actualización . Encendí el registro de pf y probé sin el alias 10.0.0.1:

rdr pass log (all) on lo0 inet proto tcp from any to any port 80 -> 127.0.0.1 port 3000
rdr pass log (all) on lo0 inet proto tcp from any to any port 443 -> 127.0.0.1 port 7000

Y la primera vez que presiono http://localhost , veo el registro:

00:00:00.000000 rule 4294967295/8(ip-option): pass in on en0: (tos 0x0, ttl 1, id 59674, offset 0, flags [none], proto IGMP (2), length 32, options (RA))
    192.168.0.106 > 224.0.1.60: igmp v2 report 224.0.1.60
00:00:00.204784 rule 4294967295/8(ip-option): pass in on en0: (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto IGMP (2), length 32, options (RA))
    192.168.0.3 > 224.0.0.252: igmp v2 report 224.0.0.252
00:00:00.093232 rule 4294967295/8(ip-option): pass out on en0: (tos 0x0, ttl 1, id 11047, offset 0, flags [none], proto IGMP (2), length 32, options (RA))
    192.168.0.77 > 224.0.0.251: igmp v2 report 224.0.0.251
00:00:00.111608 rule 4294967295/8(ip-option): pass in on en0: (tos 0x0, ttl 1, id 60629, offset 0, flags [none], proto IGMP (2), length 32, options (RA))
    192.168.0.106 > 239.255.255.250: igmp v2 report 239.255.255.250
00:00:00.102426 rule 4294967295/8(ip-option): pass in on en0: (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto IGMP (2), length 32, options (RA))
    192.168.0.3 > 224.0.0.251: igmp v2 report 224.0.0.251
00:00:00.000120 rule 4294967295/8(ip-option): pass in on en0: (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto IGMP (2), length 48, options (RA))
    192.168.0.3 > 224.0.0.22: igmp v3 report, 2 group record(s) [gaddr 224.0.0.251 is_ex, 0 source(s)] [gaddr 224.0.0.252 is_ex, 0 source(s)]

Los accesos posteriores a localhost no agregan nada a los registros y veo que la interfaz de bucle invertido lo0 no se muestra en ese registro, solo en0 (Ethernet), por lo que no estoy convencido de que esta salida de registro sea relevante para el problema. También intenté agregar en0 y en1 al /etc/pf.anchors/myorganizationarchivo pero con los mismos resultados.

Agregue algunos detalles porque tal como está la pregunta ahora no tiene mucho sentido. Agregar una segunda ip a lo0 no necesariamente resuelve localhost en esta ip. Entonces, ¿cuál es el propósito del alias 10.0.0.1? ¿Alguna cosita de Docker?
Esencialmente, esta pregunta es cómo hacer el reenvío de puertos. Estoy buscando respuestas sobre cómo hacer eso.
¡Ingresar 10.0.0.1:80/443 en el navegador redirigirá una solicitud a 127.0.0.1:3000/7000! Pero dudo que esto funcione con localhost: 80/443 ya que localhost está vinculado a 127.0.0.1 y no a 10.0.0.1.
¿Qué me sugieres que haga para que localhost funcione?
RE: 10.0.0.1: esa línea fue algo que encontré aquí serverfault.com/questions/102416/… y que supuse que era útil. He probado lo mismo sin el alias 10.0.01 pero con los mismos resultados

Respuestas (1)

Mi respuesta a la pregunta: ¿Cuál es la forma moderna de reenviar puertos en El Capitán? (reenviar puerto 80 a 8080) sigue siendo válido.

Sin embargo, tiene varias fricciones/configuraciones incorrectas en su configuración:

  • No es necesario establecer una dirección de red adicional (es decir, 10.0.0.1) para lo0 si no tiene un segundo servidor http/https.
  • Una redirección:

    rdr pass on lo0 inet proto tcp from any to 10.0.0.1 port = 80 -> 127.0.0.1 port 3000
    

    solo redirigirá una solicitud de 10.0.0.1:80 a 127.0.0.1:3000.

    Una solicitud de localhost:80 (que se traduce como 127.0.0.1:80 y no como 10.0.0.1:80) no se redirigirá porque no hay una rdr ...línea adecuada y obtendrá un error de conexión.

  • Incluso agregar la línea 10.0.0.1 localhosta /etc/hosts no solucionará su problema porque localhost parece estar codificado en 127.0.0.1.

Para que su redirección funcione, descargue pf.conf con sudo pfctl -d. Luego verifique su ancla y pf.conf:

rdr pass log (all) on lo0 inet proto tcp from any to any port 80 -> 127.0.0.1 port 3000
rdr pass log (all) on lo0 inet proto tcp from any to any port 443 -> 127.0.0.1 port 7000

y

...
scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
rdr-anchor "com.apple/*"
rdr-anchor "myorganization"
dummynet-anchor "com.apple/*"
anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"
load anchor "myorganization" from "/etc/pf.anchors/myorganization"

Luego analice/verifique myorganization con sudo pfctl -vnf /etc/pf.anchors/myorganizationy cargue pf.conf con sudo pfctl -evf /etc/pf.conf.

En algunos casos raros, es posible que deba agregar una línea adicional:

::1     127.0.0.1 

a su archivo /etc/hosts. Sin embargo, esto no parece lógico y puede aplicarse solo a versiones anteriores de Sierra. No he podido confirmar esto.

Gracias, eliminar el alias 10.0.0.1 solucionó el problema. (No estoy seguro de por qué inicialmente hacer eso no funcionó; consulte Actualización; es probable que haya algo más mal en ese momento. Agregar la línea adicional a /etc/hosts no fue necesario en mi caso.