La compartición de Internet en MacOS se hace (internamente) creando un dispositivo puente que contenga dos o más interfaces, activando un servidor DHCP, configurando varias reglas pf y habilitando pf.
Para imprimir todas las reglas hay que ejecutar el siguiente shell script:
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 se desactiva 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 Compartir Internet pf está activado y un volcado tiene el siguiente aspecto:
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 a su red interna) y 192.168.2.0/24 la red interna proporcionada por el servidor DHCP. Ambas pueden ser diferentes en su entorno.
Para exponer un servidor interno al público con la compartición de Internet activada, hay que reenviar un puerto de la interfaz externa a la IP y el puerto de servicio del servidor:
Crea la regla rdr en el router (tu Mac Pro) entrando 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 introduzca ifconfig
en tu Mac Pro.
A continuación, cree 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 añadirá una segunda regla rdr en el ancla com.apple para pf y reenviar el puerto externo al host interno.
Como el DHCP asigna las direcciones IP dinámicamente, también es útil definir una IP fija para el servidor interno:
Crear un archivo bootptab en el router (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
Sustituya aquí las direcciones MAC (hwaddr) y los tipos de hardware (hwtype) por los adecuados a su entorno. Puede obtener las direcciones MAC introduciendo ifconfig
en el host correspondiente. Reinicie su router (Mac Pro) después.
Implicaciones de seguridad:
Al utilizar su Mac Pro como router está expuesto a Internet y es vulnerable como tal. Pf como se ejecuta después de habilitar el uso compartido de Internet ha no hay ninguna regla de bloqueo . Hay que añadir un montón de reglas adicionales para que sea más seguro (y funcione).
La IP que has publicado pertenece a 152.1.0.0/16 - un bloque 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 impidan el acceso desde otras redes (o la "totalidad" de Internet).
0 votos
Voto por cerrar esta pregunta como off-topic porque se trata de un problema de red en lugar de un problema de Apple.
2 votos
@Rob - el OP está utilizando el MacPro como el firewall / router - es definitivamente en el tema.
0 votos
Sin embargo, el reenvío de puertos se ha discutido aquí en AD por lo que es un posible duplicado de Reenvío de puertos en MacOS Sierra
2 votos
@Allan No es un duplicado (exacto) porque Apple Compartir Internet está involucrado.