Redirección de puertos en Mac Pro con macOS Sierra

Me gustaría transferir desde mi computadora macOS Sierra con la dirección IP 152.1.2.3 a mi NAS, que es 192.168.2.3. Específicamente, me gustaría acceder al servidor web HTTP en mi NAS en 192.168.2.3/Fotos. El NAS tiene todo el tráfico que ingresa a través de HTTP dirigido a la carpeta correcta (Fotos).

Tengo Internet Sharing activado y comparto mi conexión Ethernet de mi computadora macOS (152.1.2.3 en Ethernet 2) con mi NAS (192.168.2.3 en Ethernet 1)

Mi NAS puede ver Internet y obtener actualizaciones.

Puedo acceder al servidor web localmente desde mi computadora ingresando 192.168.2.3 y me dirige a la página del servidor web en 192.168.2.3/Fotos.

Simplemente no puedo acceder desde fuera de la red local.

La solución fácil es conectar el NAS directamente a la red, pero no puedo debido a las políticas locales.

En resumen: me gustaría escribir lo siguiente y ser redirigido al servidor web en el NAS --> 152.1.2.3:9999

sería el comando terminal:

rdr pass on en2 inet proto tcp from any to any port 9999 -> 198.168.2.3 port 80
Voto para cerrar esta pregunta como fuera de tema porque se trata de un problema de red en lugar de un problema de Apple.
@Rob: el OP está usando MacPro como firewall / enrutador; definitivamente está en el tema.
Sin embargo, el reenvío de puertos se ha discutido aquí en AD, por lo que es un posible duplicado del reenvío de puertos en macOS Sierra.
@Allan No es un duplicado (exacto) porque está involucrado el uso compartido de Internet de Apple .

Respuestas (1)

El uso compartido de Internet en macOS se realiza (internamente) creando un dispositivo puente que contiene dos o más interfaces, activando un servidor DHCP, configurando varias reglas pf y habilitando pf.

Para imprimir todas las reglas, se debe ejecutar el siguiente script de shell:

pfdump.sh:

#!/bin/bash

function pfprint() {
  if [ -n "$1" ];then
    sudo pfctl -a "$2" -s"$1" 2>/dev/null
  else
    sudo pfctl -s"$1" 2>/dev/null
  fi
}

function print_all() {

  local p=$(printf "%-40s" $1)
  (
    pfprint r "$1" | sed "s,^,r     ,"
    pfprint n "$1" | sed "s,^,n     ,"
    pfprint A "$1" | sed "s,^,A     ,"
  ) | sed "s,^,$p,"

  for a in `pfprint A "$1"`; do
    print_all "$a"
  done
}

print_all

Por defecto, pf está deshabilitado con el siguiente volcado de pf:

                                        r     scrub-anchor "com.apple/*" all fragment reassemble
                                        r     anchor "com.apple/*" all
                                        n     nat-anchor "com.apple/*" all
                                        n     rdr-anchor "com.apple/*" all
                                        A       com.apple
com.apple                               r     anchor "200.AirDrop/*" all
com.apple                               r     anchor "250.ApplicationFirewall/*" all
com.apple                               A       com.apple/200.AirDrop
com.apple                               A       com.apple/250.ApplicationFirewall

Después de activar Internet Sharing pf está habilitado y un volcado se ve así:

                                        r     scrub-anchor "com.apple/*" all fragment reassemble
                                        r     scrub-anchor "com.apple.internet-sharing" all fragment reassemble
                                        r     anchor "com.apple/*" all
                                        r     anchor "com.apple.internet-sharing" all
                                        n     nat-anchor "com.apple/*" all
                                        n     nat-anchor "com.apple.internet-sharing" all
                                        n     rdr-anchor "com.apple/*" all
                                        n     rdr-anchor "com.apple.internet-sharing" all
                                        A       com.apple
                                        A       com.apple.internet-sharing
com.apple                               r     anchor "200.AirDrop/*" all
com.apple                               r     anchor "250.ApplicationFirewall/*" all
com.apple                               A       com.apple/200.AirDrop
com.apple                               A       com.apple/250.ApplicationFirewall
com.apple.internet-sharing              r     scrub-anchor "base_v4" all fragment reassemble
com.apple.internet-sharing              r     anchor "base_v4" all
com.apple.internet-sharing              n     nat-anchor "base_v4" all
com.apple.internet-sharing              n     rdr-anchor "base_v4" all
com.apple.internet-sharing              A       com.apple.internet-sharing/base_v4
com.apple.internet-sharing/base_v4      r     scrub on en1 all no-df fragment reassemble
com.apple.internet-sharing/base_v4      r     scrub on bridge100 all no-df max-mss 1460 fragment reassemble
com.apple.internet-sharing/base_v4      r     scrub on bridge100 proto esp all no-df fragment reassemble
com.apple.internet-sharing/base_v4      r     pass on en1 all flags any keep state
com.apple.internet-sharing/base_v4      r     pass on en1 proto esp all no state
com.apple.internet-sharing/base_v4      r     pass on bridge100 all flags any keep state rtable 6
com.apple.internet-sharing/base_v4      n     nat on en1 inet from 192.168.2.0/24 to any -> (en1:0) extfilter ei
com.apple.internet-sharing/base_v4      n     no nat on bridge100 inet from 192.168.2.1 to 192.168.2.0/24
com.apple.internet-sharing/base_v4      n     rdr on bridge100 inet proto tcp from 192.168.2.0/24 to any port = 21 -> 127.0.0.1 port 8021

Aquí en1 es la interfaz externa (la que comparte con su red interna) y 192.168.2.0/24 la red interna proporcionada por el servidor DHCP. Ambos podrían diferir en su entorno.

Para exponer un servidor interno al público con Internet Sharing habilitado, debe reenviar un puerto de la interfaz externa a la IP y el puerto de servicio del servidor:

Cree la regla rdr en el enrutador (su Mac Pro) ingresando en Terminal.app:

sudo nano /private/etc/pf-rdr.rule

y el contenido:

rdr on en1 inet proto tcp from any to 152.1.2.3 port = 9999 -> 192.168.2.3 port 80

asumiendo que en1 es la interfaz externa, 152.1.2.3:9999 su IP:puerto y 192.168.2.3:80 la IP:puerto del servidor interno. Para obtener el identificador de dispositivo (y la IP) de su interfaz externa, ingrese ifconfigen su Mac Pro.

Luego crea un demonio de lanzamiento:

sudo nano /Library/LaunchDaemons/org.user.pfrdr.plist

con el contenido:

<?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>org.user.pfrdr</string>
    <key>ProgramArguments</key>
    <array>
        <string>/sbin/pfctl</string>
        <string>-a</string>
        <string>com.apple/portforwarding</string>
        <string>-f</string>
        <string>/private/etc/pf-rdr.rule</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/Library/Logs/org.usr.pfrdr.log</string>
    <key>StandardOutPath</key>
    <string>/Library/Logs/org.usr.pfrdr.log</string>
</dict>
</plist>

Inicie el demonio con:

sudo launchctl load /Library/LaunchDaemons/org.user.pfrdr.plist

Esto agregará una segunda regla rdr en el ancla com.apple a pf y reenviará el puerto externo al host interno.

Dado que DHCP asigna direcciones IP dinámicamente, también es útil definir una IP fija para el servidor interno:

Cree un archivo bootptab en el enrutador (su Mac Pro):

sudo nano /etc/bootptab

con el contenido:

# Bootptab file
# Section 1 -- ignored
%%
# Section 2 -- used
# Hardware types: 1=Ethernet, 6=Wireless
#                 See http://www.ietf.org/rfc/rfc1700.txt
#
# machine entries have the following format:
#
# hostname         hwtype     hwaddr         ipaddr   bootfile
your-nas-ethernet     1 c4:2c:03:3a:7f:65 192.168.2.3 boot
a-wireless-machine    6 60:33:4b:27:6c:62 192.168.2.4 boot
another-ethernet      1 00:0d:93:72:e7:96 192.168.2.2 boot

Reemplace las direcciones MAC (hwaddr) y los tipos de hardware (hwtype) por los adecuados que se encuentran en su entorno aquí. Puede obtener las direcciones MAC ingresando ifconfigen el host respectivo. Reinicie su enrutador (Mac Pro) después.


Implicaciones de seguridad:

Al usar su Mac Pro como un enrutador, está expuesto a Internet y es vulnerable como tal. Pf, ya que se ejecuta después de habilitar Internet Sharing, no tiene absolutamente ninguna regla de bloqueo . Debe agregar un montón de reglas adicionales para que sea más seguro (y funcione).


La IP que ha publicado pertenece a 152.1.0.0/16, un bloque de IP asignado a la Universidad Estatal de Carolina del Norte (NCSU). Es posible que su universidad haya aplicado medidas de seguridad en esta red que impedirán el acceso desde otras redes (o "toda" Internet).