1 votes

Comment ajouter dynamiquement des ancres au démarrage pour apple pfctl sans modifier le système pf.conf

Il y a quelques réponses sur l'utilisation de pfctl sur os x, mais aucune ne donne vraiment un moyen propre et agréable de créer une ancre et de la charger au démarrage, ou de permettre aux programmes de s'y accrocher et de mettre à jour / remplacer dynamiquement les règles, ou de sorte qu'elle puisse également être supprimée sans altérer les règles du système si nécessaire.

Quelle est la meilleure façon de configurer un tel système pour que votre ordinateur puisse, par exemple, faire un SNAT lorsqu'il sort d'une interface ?

Certaines des autres questions sont :

pfctl - comment ajouter une ancre et la rendre active / la charger

pfctl pour ajouter des règles à l'exécution SANS modifier /etc/pf.conf ?

pf : Ajouter dynamiquement une règle à nat-anchor

2voto

xoryves Points 111

Il est très étrange qu'il n'y ait pas de documentation officielle sur la façon d'utiliser correctement pf avec MacOS. Je ne sais pas si je l'utilise comme prévu. Mais la solution fonctionne sous MacOS 11.6 et a survécu à la mise à jour vers MacOS 12.0.1.

J'utilise pf pour rediriger le port 80 vers 8080 et 443 vers 8443. Cela devrait également fonctionner pour les règles de nat. Mon site pfctl.plist est juste une copie de /System/Library/LaunchDaemons/com.apple.pfctl.plist avec des ProgramArguments modifiés.

/etc/pf.anchors/ves

ext_ip = "192.168.1.201"

rdr pass inet proto tcp from any to \$ext_ip port 80 -> \$ext_ip port 8080
rdr pass inet proto tcp from any to \$ext_ip port 443 -> \$ext_ip port 8443

Chargement dynamique et activation avec sudo pfctl -a 'com.apple/ves' -f /etc/pf.anchors/ves -e . Suppression dynamique avec sudo pfctl -a 'com.apple/ves' -F all .

Persistance entre les redémarrages avec un LaunchDaemon.

/Bibliothèque/LaunchDaemons/ves.pfctl.plist

<?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>ves.pfctl</string>
  <key>WorkingDirectory</key>
  <string>/var/run</string>
  <key>Program</key>
  <string>/sbin/pfctl</string>
  <key>ProgramArguments</key>
  <array>
    <string>pfctl</string>
    <string>-a</string>
    <string>com.apple/ves</string>
    <string>-f</string>
    <string>/etc/pf.anchors/ves</string>
    <string>-e</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

sudo launchctl load /Library/LaunchDaemons/ves.pfctl.plist

0voto

nate Points 11

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)

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X