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 de 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 parece a esto:
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. Ambos podrían diferir en su entorno.
Para exponer un servidor interno al público con Conexión compartida habilitada, debe reenviar un puerto de la interfaz externa a la IP y al 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 ifconfig
en 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>
Inicia 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 ifconfig
en el host respectivo. Reinicie su enrutador (Mac Pro) después.
Implicaciones de seguridad:
Al usar su Mac Pro como enrutador, está expuesto a Internet y es vulnerable como tal. Pf a medida que se ejecuta después de habilitar el uso compartido de Internet no tiene absolutamente ninguna regla de bloqueo . Tienes que 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 North Carolina State University (NCSU). Su universidad puede haber aplicado medidas de seguridad en esta red que impedirán el acceso desde otras redes (o la Internet "completa").