3 votos

reglas de redireccionamiento pf no funcionan el registro

TL;DR: En Mojave (no he probado en otros), a la hora de crear rdr normas pf, las reglas de trabajo por un tiempo (con algunos problemas de acceso al puerto de destino directamente), pero después de un tiempo las reglas de dejar de trabajar, aunque yo no puedo hacer pfctl informe de cualquier cosa de manera diferente en una manera que hace que sea evidente que ya no se aplican.

He creado /Library/LaunchDaemons/dev.up.pfctl.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Disabled</key>
        <false/>
        <key>Label</key>
        <string>dev.up.pfctl</string>
        <key>WorkingDirectory</key>
        <string>/var/run</string>
        <key>Program</key>
        <string>/sbin/pfctl</string>
        <key>ProgramArguments</key>
        <array>
                <string>pfctl</string>
                <string>-e</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
</dict>
</plist>

...y /Library/LaunchDaemons/dev.up.loopbackalias.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>dev.up.loopbackalias.plist</string>
    <key>RunAtLoad</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
      <string>/sbin/ifconfig</string>
      <string>lo0</string>
      <string>alias</string>
      <string>127.0.0.42</string>
    </array>
</dict>
</plist>

He añadido lo siguiente a /etc/pf.conf:

# allow nginx to bind on :20080 instead of :80, and :20443 instead of :443.
# This allows us to run it as the non-root user, and thus not require
# auth to update/restart it.
rdr pass on lo0 inet proto tcp from any to 127.0.0.42 port 80  -> 127.0.0.42 port 20080
rdr pass on lo0 inet proto tcp from any to 127.0.0.42 port 443 -> 127.0.0.42 port 20443

...y me he nginx ejecución y obligado a 127.0.0.42:20080 y 127.0.0.42:20443.

Cuando voy a aplicar la configuración al reiniciar o ejecución pfctl -f /etc/pf.conf, las cosas funcionan:

$ curl http://127.0.0.42:80/services/ping
ok

Sin embargo...

Problema 1

Mientras que esta regla está activa, el acceso al puerto de destino (20080/20443) directamente tiene algunos problemas interesantes. Hay un retraso en el acceso a lo que parece crecer rápidamente con el número de la (reciente?) accesos:

$ time curl -s -o /dev/null http://127.0.0.42:20080/services/ping
(0.2 seconds)
$ time curl -s -o /dev/null http://127.0.0.42:20080/services/ping
(1.6 seconds)
$ time curl -s -o /dev/null http://127.0.0.42:20080/services/ping
(27 seconds)
$ time curl -s -o /dev/null http://127.0.0.42:20080/services/ping
(timeout)

(sin embargo, el recinto del hotel, el acceso a :80-el puerto redirige pf a :20080-trabajos y tarda <25ms.)

Problema 2

Después de un tiempo, la redirección de la regla se detiene por completo la aplicación, como si pf no se han habilitado en todos o la regla no cargan, sin embargo, que sigue pretende ser habilitado y sigo sin ver lo reportado por pf:

$ pfctl -s nat
No ALTQ support in kernel
ALTQ related functions disabled
nat-anchor "com.apple/*" all
rdr-anchor "com.apple/*" all
rdr pass on lo0 inet proto tcp from any to 127.0.0.42 port = 80 -> 127.0.0.42 port 20080
rdr pass on lo0 inet proto tcp from any to 127.0.0.42 port = 443 -> 127.0.0.42 port 20443
$ pfctl -s info | grep Enabled
No ALTQ support in kernel
ALTQ related functions disabled
Status: Enabled for 6 days 14:56:42           Debug: Urgent
$ curl -s http://127.0.0.42:80/services/ping
curl: (7) Failed to connect to 127.0.0.42 port 80: Connection refused
$ curl -s http://127.0.0.42:20080/services/ping
ok

Soy capaz de desencadenar esta bastante fiable por la desconexión de WiFi. Creo probable que esto sólo ocurre cuando los cambios en la red suceder.

0voto

Burke Libbey Puntos 16

Bueno, esta no es una gran solución, pero pude solucionarlo al:

  1. Observando cambios en la red usando algo como SCDynamicStoreKeyCreateNetworkInterfaceEntity(NULL, kSCDynamicStoreDomainState, kSCCompAnyRegex, kSCEntNetIPv4);
  2. Esperando aproximadamente un segundo para que macOS desincronice su estado de pf
  3. Comprobando si 127.0.0.42:80 es ECONNREFUSED
  4. Corriendo /sbin/pfctl -f /etc/pf.conf si fuera.

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