Je réponds à cette question avec ce que j'ai fait jusqu'à présent, car il a fallu creuser un peu et pourrait être utile à quelqu'un. Vous pourriez faire quelque chose de plus compliqué basé sur ceci, c'est juste une sorte de début. Si quelqu'un poste quelque chose de mieux, je l'accepterai, je suppose.
Une solution plus compliquée consisterait à sauvegarder les jetons et à utiliser '-E' et '-X' pour conserver et libérer les références au système de filtrage de paquets, ou permettre de décharger le service, mais je ne le fais pas ici. Notez que launchd ne supporte pas vraiment l'exécution d'une commande lors du déchargement d'un service. Vous pourriez écrire un script pour maintenir un processus en vie et gérer l'arrêt, ou dans la plupart des cas, vous vous contenteriez probablement de gérer les règles de flushing pour l'ancre lors de l'arrêt de votre processus pour votre application.
Configuration
Enregistrez tous les fichiers ci-dessous à leur emplacement et procédez comme suit :
sudo launchctl load -w /Library/LaunchDaemons/org.myorg.mypf.plist
# Note: the next step turns on ip forwarding for your system.
# You only need to do this if you are doing actual NAT
# and not just referencing this answer for something else like packet
# filtering
sudo sysctl -w net.inet.ip.forwarding=1
Si vous souhaitez que la redirection d'ip persiste entre les bottes, créez (si nécessaire) /etc/sysctl.conf
et définir le contenu :
/etc/sysctl.conf
...
net.inet.ip.forwarding=1
...
Encore une fois, cela n'est nécessaire que pour faire fonctionner le NAT, comme nous le faisons dans cet exemple précis. Si vous faites autre chose, vous n'en avez pas besoin.
Fichiers
/Bibliothèque/LaunchDaemons/org.myorg.mypf.plist
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE plist PUBLIC "-//Apple Computer/DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.myorg.pfsettings</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/myorg-install-pf</string>
</array>
<key>LaunchOnlyOnce</key>
<true/>
</dict>
</plist>
/usr/local/bin/myorg-install-pf
#!/usr/bin/env zsh
/sbin/pfctl -f - <<EOF
scrub-anchor "org.myorg/*"
nat-anchor "org.myorg/*"
rdr-anchor "org.myorg/*"
dummynet-anchor "org.myorg/*"
anchor "org.myorg/*"
EOF
# Flush existing rules.
# Not that useful for our one-shot, but could be useful in more complicated setups
/sbin/pfctl -a org.myorg -F all
/sbin/pfctl -a org.myorg/system -F all
/sbin/pfctl -a org.myorg/system -f /usr/local/etc/pf.anchors/org.myorg/system
/usr/local/etc/pf.anchors/org.myorg/system
# Set 192.168.142.0/24 to your "inside" network, or see `man pf.conf` and
# use something else (you could use someif0:network, for example)
nat on en0 inet from 192.168.142.0/24 to any -> (en0)