Le partage de l'Internet dans MacOS se fait (en interne) en créant un périphérique de pont contenant deux interfaces ou plus, en activant un serveur DHCP, en configurant diverses règles pf et en activant le pf.
Pour imprimer toutes les règles, le shell script suivant doit être exécuté :
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
Par défaut pf est désactivé avec le dump pf suivant :
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
Après avoir activé le partage d'Internet pf est activé et un vidage ressemble à ceci :
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
Ici, en1 est l'interface externe (celle partageant à votre réseau interne) et 192.168.2.0/24 le réseau interne fourni par le serveur DHCP. Les deux peuvent être différents dans votre environnement.
Pour exposer un serveur interne au public avec le partage d'Internet activé, vous devez transférer un port de l'interface externe vers l'IP et le port de service du serveur :
Créez la règle rdr sur le routeur (votre Mac Pro) en entrant dans Terminal.app :
sudo nano /private/etc/pf-rdr.rule
et le contenu :
rdr on en1 inet proto tcp from any to 152.1.2.3 port = 9999 -> 192.168.2.3 port 80
en supposant que en1 est l'interface externe, 152.1.2.3:9999 son IP:port et 192.168.2.3:80 l'IP:port du serveur interne. Pour obtenir l'identifiant de périphérique (et l'IP) de votre interface externe, entrez ifconfig
sur votre Mac Pro.
Ensuite, créez un démon de lancement :
sudo nano /Library/LaunchDaemons/org.user.pfrdr.plist
avec le contenu :
<?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>
Lancez le démon avec :
sudo launchctl load /Library/LaunchDaemons/org.user.pfrdr.plist
Cela ajoutera une deuxième règle rdr dans l'ancre com.apple pour pf et de transférer le port externe vers l'hôte interne.
Comme DHCP attribue les adresses IP de manière dynamique, il est également utile de définir une IP fixe pour le serveur interne :
Créer un fichier bootptab sur le routeur (votre Mac Pro) :
sudo nano /etc/bootptab
avec le contenu :
# 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
Remplacez ici les adresses MAC (hwaddr) et les types de matériel (hwtype) par ceux que vous trouvez dans votre environnement. Vous pouvez obtenir les adresses MAC en entrant ifconfig
sur l'hôte respectif. Redémarrez ensuite votre routeur (Mac Pro).
Implications en matière de sécurité :
En utilisant votre Mac Pro comme routeur, il est exposé à l'Internet et vulnérable en tant que tel. Pf tel qu'il fonctionne après avoir activé le partage d'Internet a absolument aucune règle de blocage . Vous devez ajouter tout un tas de règles supplémentaires pour le rendre plus sûr (et plus fonctionnel).
L'IP que vous avez publiée appartient à 152.1.0.0/16 - un bloc d'IP attribué à l'Université d'État de Caroline du Nord (NCSU). Votre université a peut-être appliqué des mesures de sécurité dans ce réseau qui empêcheront l'accès à partir d'autres réseaux (ou de l'Internet "entier").