Te respondo con lo que he hecho hasta ahora, porque me ha costado un poco de trabajo y podría ser útil para alguien. Podrías hacer algo más complicado basado en esto, es sólo un comienzo. Si alguien publica algo mejor lo aceptaré, supongo.
Una solución más complicada guardaría los tokens y usaría '-E' y '-X' para retener y liberar las referencias al sistema de filtrado de paquetes, o permitir la descarga del servicio, pero no hago eso aquí. Tenga en cuenta que launchd no soporta realmente la ejecución de un comando cuando se descarga un servicio. Podría escribir un script para mantener un proceso vivo y manejar el apagado, o en la mayoría de los casos probablemente sólo manejaría las reglas de flushing para el anclaje al cerrar su proceso para su aplicación.
Configurar
Guarde todos los archivos de abajo en sus ubicaciones y haga lo siguiente:
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 desea que el reenvío de ip persista a través de las botas, cree (si es necesario) /etc/sysctl.conf
y fijar el contenido:
/etc/sysctl.conf
...
net.inet.ip.forwarding=1
...
De nuevo, esto sólo es necesario para que NAT funcione, como es el caso de este ejemplo concreto. Si estás haciendo otra cosa, no lo necesitas.
Archivos
/Library/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)