Problema di routing
Il problema qui è che entrambi i profili di connessione VPN sono in una rete 10, che ufficialmente ha un /8
a.k.a. 255.0.0.0
a.k.a. 0xff000000
netmask. Quindi, quando si stabiliscono entrambe le connessioni VPN contemporaneamente, si finisce con una sola destinazione nella tabella di instradamento per 10-network . E quella voce di routing indirizzerà tutto il traffico 10.x.x.x alla prima connessione ppp stabilita, eccetto per gli indirizzi IP locali e remoti nella seconda connessione ppp.
$ netstat -nr -f inet
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 192.168.0.1 UGSc 10 0 en0
default 10.0.1.1 UGScI 0 0 ppp0
default 10.0.0.1 UGScI 0 0 ppp1
10 ppp0 USc 1 0 ppp0
10.0.0.1 10.0.0.12 UHr 2 0 ppp1
10.0.1.1 10.0.1.200 UHr 1 0 ppp0
Soluzione di routing
La correzione è di estendere manualmente la tabella di routing con le voci desiderate. Non è necessario rimuovere la voce 10, aggiungere solo nuove voci di percorso. Finché le voci di instradamento appena aggiunte indirizzano una sottorete più piccola, la voce avrà una preferenza. Leggi questo come: quando la sottorete ha un numero maggiore di /X
. Ad esempio /24
è maggiore di /8
quindi una voce 10/24
avrà una preferenza su una voce di routing 10/8
. In sostanza aggiungi una nuova voce di routing dopo aver stabilito la seconda connessione VPN, ad esempio: $ sudo /sbin/route -n add -net 10.0.2.0/24 -interface ppp1
Soluzione di automazione
È ingombrante e può introdurre errori quando si deve inserire manualmente il percorso dopo aver stabilito la connessione VPN secondaria. Fortunatamente esiste una soluzione integrata nel demone ppp usando if-up
, come puoi leggere in $ man pppd
. Ogni volta che viene stabilita una connessione ppp (VPN) che utilizza l'indirizzamento IPv4, viene chiamato uno script ( /etc/ppp/if-up
) in cui è possibile eseguire le regole personalizzate / i comandi a.k.a. hook.
Lo script sotto è ampiamente commentato e dovrebbe essere auto esplicativo.
Il tuo Mac potrebbe non avere questo script ( $ ls /etc/ppp
). In tal caso, crealo ( $ sudo touch /etc/ppp/ip-up
) con e x permessi ecutable ( $ sudo chmod +x /etc/ppp/ip-up
).
#!/bin/sh
#
# This script is run by the pppd after the link is established.
# It should be used to add routes, set IP address, etc.
#
# Tested with Mavericks (Mac OS X 10.9)
#
# This script is called with the following arguments:
# Arg Name Example
# $0 Script full location /etc/ppp/ip-up
# $1 Interface name ppp0
# $2 TTY device <blank>
# $3 Speed 0
# $4 Local IP address 10.0.0.200
# $5 Remote IP address 10.0.0.1
# $6 LAN gateway 192.168.0.1
# source for $1-$6 is $ man -P 'less -p " /etc/ppp/ip-up"' pppd
# ppp.log for non english systems do still have an english timestamp
export LC_TIME="C";
# Note: there is no static assignment for ppp0 to PPTP and ppp1 to L2TP
# therefore $1 isn't useful to differentiate VPN networks
# To debug, uncomment the line below
#echo "$(date +%c) : \=$5" >> /var/log/ppp.log
# Add your routing table corrections here
# note: 2>&1 will redirect errors to the standard output
case "$5" in
10.0.0.1) OUT=$(exec /sbin/route -n add -net 10.0.0.0/24 -interface "$1" 2>&1) ;;
10.0.1.1) OUT=$(exec /sbin/route -n add -net 10.0.1.0/24 -interface "$1" 2>&1) ;;
esac
# If standard output is not empty, log it prepended by a timestamp
[ ! -z "$OUT" ] && echo "$(date +%c) : $OUT" >>/var/log/ppp.log
# There is automatic route removal on ppp disconnect.
# So no need to manually remove the above route(s) in /etc/ppp/ip-down
Grazie per l'idea di jalbrecht2000 su link