La façon la plus simple de créer une route statique et persistante vers un hôte est de créer un script. addroute.sh (Root:wheel 755) dans /usr/local/bin. Remplacez le nom de l'hôte et la passerelle.
#!/bin/bash
sleep 10
route -n add -host $(dig +short example.com) 192.168.0.1
et charger le script avec un démon de lancement usr.addroute.plist (Racine:roue 644) dans /Library/LaunchDaemon/ :
<?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>Label</key>
<string>usr.addroute</string>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
<string>-c</string>
<string>/usr/local/bin/addroute.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StandardErrorPath</key>
<string>/tmp/usr.addroute.err</string>
<key>StandardOutPath</key>
<string>/tmp/usr.addroute.out</string>
</dict>
</plist>
Chargez-le avec : sudo launchctl load /Library/LaunchDaemon/usr.addroute.plist
.
Si tout fonctionne, supprimez les clés/chaînes Standard* dans le plist et les fichiers associés dans /tmp.
El sleep 10
est une approche brutale - une route ne peut être ajoutée qu'après un certain temps : le réseau doit être en place pour l'interface spécifique - et peut être remplacée par quelque chose de plus élégant décrit dans cette réponse. aquí .
En fonction des capacités DNS du VPN ou de votre environnement par défaut, vous devrez peut-être ajouter une route pour un serveur DNS (par exemple, le 8.8.8.8 de Google) et modifier la commande dig de la manière suivante dig @8.8.8.8 +short example.com
.
Si vous redémarrez rarement votre hôte et que les IP des hôtes distants changent souvent, utilisez le script suivant (qui peut probablement être amélioré) :
#!/bin/bash
sleep 10
Hostname=hostname
GateWay=gateway_IP
IPHost=$(dig +short $Hostname)
RouteExist=$(netstat -nr -f inet | grep $IPHost | wc -l)
NewRoute=$(netstat -nr -f inet | grep $IPHost | awk '{print $1}')
OldHost=$(cat /usr/local/bin/addroute)
if [ $RouteExist -eq 0 ]
then
route -n add -host $IPHost $GateWay
RouteExist=1
NewRoute=$(netstat -nr -f inet | grep $IPHost | awk '{print $1}')
echo $NewRoute > /usr/local/bin/addroute
fi
if [ $IPHost != $OldHost ]
then
route -n delete -host $OldHost $GateWay
NewRoute=$(netstat -nr -f inet | grep $IPHost | awk '{print $1}')
echo $NewRoute > /usr/local/bin/addroute
fi
et 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>Label</key>
<string>usr.addroute</string>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
<string>-c</string>
<string>/usr/local/bin/addroute.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StandardErrorPath</key>
<string>/tmp/usr.addroute.err</string>
<key>StandardOutPath</key>
<string>/tmp/usr.addroute.out</string>
<key>StartInterval</key>
<integer>60</integer>
</dict>
</plist>
Un fichier proxy supplémentaire est nécessaire :
sudo touch /usr/local/bin/addroute
Veuillez ajuster le StartInterval (en secondes) dans votre plist comme requis et entrez un nom d'hôte et une IP de passerelle appropriés dans le shell script.
Le premier if
ajoute une route vers un hôte distant après le démarrage de votre hôte. et - plus tard - une nouvelle route si l'IP de l'hôte distant change. La deuxième if
supprime une route périmée.