Дано:
Linux s1 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt25-2+deb8u3 (2016-07-02) x86_64 GNU/Linux
pppd version 2.4.6
ISP1: eth1:100.100.100.1, gw: 100.100.100.254
ISP2: eth2:200.200.200.1, gw: 200.200.200.254
VPN сервер: 1.1.1.1
По умолчанию используется первичный канал через ISP1, с Linux подключена VPN в качестве PPTP клиента, в какой-то момент времени ISP1 «падает», переключаем на ISP2, но VPN не поднимается:
1 2 |
# ip ro sh | grep default default via 200.200.200.254 dev eth2 |
1 2 3 4 5 6 7 8 |
# ping 1.1.1.1 -c 3 PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data. From 100.100.100.1 icmp_seq=1 Destination Host Unreachable From 100.100.100.1 icmp_seq=2 Destination Host Unreachable From 100.100.100.1 icmp_seq=3 Destination Host Unreachable --- 1.1.1.1 ping statistics --- 3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 2000ms pipe 3 |
Посмотрим куда ведет маршрут к VPN серверу:
1 2 3 |
# ip ro get 1.1.1.1 1.1.1.1 via 100.100.100.254 dev eth1 src 100.100.100.1 cache |
Видно, что VPN смотрит через ISP1. Остальной трафик через ISP2:
1 2 3 |
# ip ro get 8.8.8.8 8.8.8.8 via 200.200.200.254 dev eth2 src 200.200.200.1 cache |
ISP1 лежит:
1 2 3 4 |
# mii-tool eth0: negotiated 1000baseT-FD flow-control, link ok eth1: no link eth2: negotiated 100baseTx-FD, link ok |
Отключаем VPN (хотя он и не работает)
1 2 3 4 5 |
# poff vpn1 /usr/bin/poff: No pppd is running. None stopped. # ifconfig ppp0 ppp0: error fetching interface information: Device not found |
Посмотрим таблицу маршрутизации:
1 2 3 |
# route -n | grep "^0.0.0.0\|^1.1.1.1" 0.0.0.0 200.200.200.254 0.0.0.0 UG 0 0 0 eth2 1.1.1.1 100.100.100.254 255.255.255.255 UGH 0 0 0 eth1 |
Удаляем этот маршрут:
1 |
# ip ro del 1.1.1.1 |
Пробуем подключится:
1 2 3 4 5 6 7 8 9 |
# pon vpn1 # ifconfig ppp0 ppp0 Link encap:Point-to-Point Protocol inet addr:10.10.10.133 P-t-P:10.10.10.135 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1396 Metric:1 RX packets:178 errors:0 dropped:0 overruns:0 frame:0 TX packets:74 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3 RX bytes:200084 (195.3 KiB) TX bytes:6187 (6.0 KiB) |
Снова появился хостовой маршрут через ISP2, который также не удаляется при выключении VPN:
1 2 3 |
# route -n | grep "^0.0.0.0\|^1.1.1.1" 0.0.0.0 200.200.200.254 0.0.0.0 UG 0 0 0 eth2 1.1.1.1 200.200.200.254 255.255.255.255 UGH 0 0 0 eth2 |
Тоже самое делает и Windows, но корретно за сабой его убирает
1 2 |
C:\> netstat -nr | findstr 1.1.1.1 1.1.1.1 255.255.255.255 192.168.1.254 192.168.1.1 21 |
Решение:
vpn1 соответствует имени VPN подключения в
/etc/ppp/peers/. Параметр:
$6 соотвествует параметру:
ipparam в
/etc/ppp/peers/vpn1:
1 2 |
# grep ipparam /etc/ppp/peers/vpn1 ipparam vpn.example.com |
Создаем файл который будет выполнятся при «падении» тунеля:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# cat > /etc/ppp/ip-down.d/vpn1 #!/bin/bash if [ ! $LINKNAME = "vpn1" ] # From "/etc/ppp/peers/" then exit 0 fi for i in `dig $6 +short`; do /sbin/ip route delete $i done Ctrl+D # chmod +x /etc/ppp/ip-down.d/vpn1 |
Если в ipparam передаем IP, dig не нужен в данном случае.