In MacOS, come posso bypassare una VPN per un sito specifico usando il suo nome host?

0

Sto configurando una VPN IKEv2 in macOS 10.12.3. Funziona, ma mi piacerebbe configurare siti web specifici per aggirare il VPN.

Sono a conoscenza di un metodo che utilizza il comando route per aggiungere una route statica, ma funziona solo per uno specifico indirizzo IP. Se il sito a cui mi sto collegando cambia il suo IP (che è una possibilità distinta), il suo traffico inizierà nuovamente a passare attraverso la VPN.

Come posso bypassare la VPN usando il nome host del sito? per esempio. qualsiasi richiesta a www.somewebsite.com non utilizzerà la VPN, indipendentemente da quale indirizzo IP www.somewebsite.com risolve?

    
posta GuyGizmo 26.03.2017 - 05:57
fonte

1 risposta

1

Il modo più semplice per creare una route statica e persistente verso un host è la creazione di uno script addroute.sh (root: wheel 755) in / usr / local / bin. Tuttavia, sostituisci il nome host e il gateway.

#!/bin/bash

sleep 10
route -n add -host $(dig +short example.com) 192.168.0.1

e carica lo script con un demone di lancio usr.addroute.plist (root: wheel 644) in / 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>

Caricalo con: sudo launchctl load /Library/LaunchDaemon/usr.addroute.plist .

Se tutto funziona, rimuovi le chiavi / stringhe Standard * nel plist e i relativi file in / tmp.

La linea sleep 10 è un approccio matto - una rotta può essere aggiunta solo dopo un certo periodo di tempo: la rete deve essere attiva per l'interfaccia specifica - e può essere sostituita con qualcosa di più elegante delineato in questa risposta qui .

A seconda delle funzionalità DNS della VPN o dell'ambiente predefinito, potrebbe anche essere necessario aggiungere una route per un server DNS (ad esempio Google 8.8.8.8) e modificare il comando dig in dig @8.8.8.8 +short example.com .

Se riavvii raramente l'host e gli IP degli host remoti cambiano spesso, utilizza il seguente script (che può essere migliorato probabilmente):

#!/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

e 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>

È necessario un file proxy aggiuntivo:

sudo touch /usr/local/bin/addroute 

Regola il valore StartInterval (in secondi) del tuo plist come richiesto e inserisci un nome host e un IP gateway appropriati nello script della shell.

La prima routine if aggiunge una rotta a un host remoto dopo l'avvio dell'host e - in seguito - una nuova rotta se l'IP dell'host remoto cambia. La seconda routine if rimuove una route obsoleta.

    
risposta data 30.03.2017 - 23:31
fonte

Leggi altre domande sui tag