Condivisione Internet in macOS è (internamente) fatto creando un dispositivo bridge contenente due o più interfacce, attivando un server DHCP, impostando varie regole pf e abilitando pf.
Per stampare tutte le regole, è necessario eseguire lo script della shell seguente:
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
Di default pf è disabilitato con il seguente pf dump:
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
Dopo l'attivazione di Condivisione Internet pf è abilitato e il dump è simile al seguente:
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
Qui en1 è l'interfaccia esterna (quella che condivide con la tua rete interna) e 192.168.2.0/24 la rete interna fornita dal server DHCP. Entrambi potrebbero differire nel tuo ambiente.
Per esporre al pubblico un server interno con Condivisione Internet abilitata, devi inoltrare una porta dell'interfaccia esterna all'IP e alla porta di servizio del server:
Crea una regola rdr sul router (il tuo Mac Pro) inserendo in Terminal.app:
sudo nano /private/etc/pf-rdr.rule
e il contenuto:
rdr on en1 inet proto tcp from any to 152.1.2.3 port = 9999 -> 192.168.2.3 port 80
assumendo en1 è l'interfaccia esterna, 152.1.2.3:9999 il suo IP: porta e 192.168.2.3:80 l'IP: porta del server interno. Per ottenere l'identificativo del dispositivo (e l'IP) dell'interfaccia esterna, inserisci ifconfig
su Mac Pro.
Quindi crea un demone di lancio:
sudo nano /Library/LaunchDaemons/org.user.pfrdr.plist
con il contenuto:
<?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>
Avvia il daemon con:
sudo launchctl load /Library/LaunchDaemons/org.user.pfrdr.plist
Questo aggiungerà una seconda regola rdr nell'ancora com.apple a pf e inoltrerà la porta esterna all'host interno.
Poiché DHCP assegna dinamicamente gli indirizzi IP è anche utile definire un IP fisso per il server interno:
Crea un file bootptab sul router (il tuo Mac Pro):
sudo nano /etc/bootptab
con il contenuto:
# 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
Sostituisci gli indirizzi MAC (hwaddr) e i tipi di hardware (hwtype) con quelli giusti trovati nel tuo ambiente qui. Puoi ottenere gli indirizzi MAC inserendo ifconfig
sul rispettivo host. Riavvia il router (Mac Pro) in seguito.
Implicazioni sulla sicurezza:
Usando il tuo Mac Pro come router è esposto a Internet e vulnerabile in quanto tale. Pf che viene eseguito dopo aver abilitato la Condivisione in Internet ha assolutamente nessuna regola di blocco . Devi aggiungere un sacco di regole aggiuntive per renderlo più sicuro (e funzionante).
L'IP che hai pubblicato appartiene a 152.1.0.0/16 - un blocco IP assegnato alla North Carolina State University (NCSU). La tua università potrebbe aver applicato misure di sicurezza in questa rete che impediranno l'accesso da altre reti (o dall'intera "Internet").