Мне нужно запустить несколько туннелей vpnc и определить другой статический маршрут для каждого из них индивидуально после настройки.
Для этого я создал сценарий, который будет запускаться после каждого подключения (tunX).
Однако, если один или несколько туннелей выйдут из строя и мне потребуется перезапустить это конкретное соединение, я потеряю правильный порядок атрибуции для каждого клиента, и мой скрипт не будет работать должным образом, что фактически заблокирует меня из коробки.
Пример: мне нужно удалить и добавить следующие маршруты для client_b в tun1, потому что введенные маршруты переопределяют мои внутренние сети.
ip route del 0.0.0.0/0 dev tun1 # this route must be deleted because it overrides my GW.
ip route del 192.168.0.0/16 dev tun1 # this route must be deleted because it overrides internal net.
ip route add 192.168.88.0/24 via 123.123.123.123 dev tun1 # Manually added subnet that I need to have access to
ip route add 0.0.0.0/0 via 192.168.40.1 dev eth0 # My internal network is 192.168.40.0/24
Таким образом, всякий раз, когда я начинаю новое соединение vpnc, я получаю номер туннеля, начинающийся с tun0, затем tun1, tun2 и так далее.
Однако если один туннель выйдет из строя и мне нужно его перезапустить, я получу tunX, где X больше не в порядке.
Пример: изначально, когда я подключаю этих клиентов последовательно, я получаю последовательный номер tunX для каждого клиента.
sudo vpnc client_a --local-port 0 # It will be available on tun0
sudo vpnc client_b --local-port 0 # It will be available on tun1
sudo vpnc client_c --local-port 0 # It will be available on tun2
sudo vpnc client_d --local-port 0 # It will be available on tun3
Обратите внимание: мне нужно удалить нежелательные маршруты в каждом туннеле и определить персонализированные маршруты для каждого из них индивидуально, потому что каждый имеет свой собственный маршрут и соответствующую конечную точку.
Убить все соединения сразу и запустить их все последовательно - не вариант.
Итак, мой вопрос: как я могу статически определить client_a, чтобы всегда использовать tun0, client_b, чтобы всегда использовать tun1 и так далее?
На случай, если кто-то столкнется с той же проблемой, вот решение, которое я сделал.
#!/bin/bash
# Run script as # nohup ./vpn-monitor.sh /dev/null 2>&1 &
# mjoao
################### Start functions ###################
vpn_clientA(){
vpnName="clientA"
endpoint="10.23.23.51"
endpoint2="10.23.25.55"
count=$( ping -c 3 $endpoint | grep icmp* | wc -l )
count2=$( ping -c 3 $endpoint2 | grep icmp* | wc -l )
if [ $count -eq 0 -a $count2 -eq 0 ]
then
# All pings have failed!!!
echo "Ping FAILED $(date)" >> /var/log/vpnc/$vpnName.log
# Sending Email...
echo "Ping for $endpoint FAILED! More info /var/log/vpnc/$vpnName.log " | mail -s "VPN $vpnName failed " my@domain.com
# Restart connection
/root/vpn_clientA.sh >> /var/log/vpnc/$vpnName.log &
else
echo "Ping replied $(date)" >> /var/log/vpnc/$vpnName.log
fi
}
vpn_clientB(){
vpnName="clientB"
endpoint="192.168.10.11"
endpoint2="192.168.10.13"
count=$( ping -c 3 $endpoint | grep icmp* | wc -l )
count2=$( ping -c 3 $endpoint2 | grep icmp* | wc -l )
if [ $count -eq 0 -a $count2 -eq 0 ]
then
# All pings have failed!!!
echo "Ping FAILED $(date)" >> /var/log/vpnc/$vpnName.log
# Sending Email
echo "Ping for $endpoint FAILED! More info /var/log/vpnc/$vpnName.log " | mail -s "VPN $vpnName failed " my@domain.com
# Restart connection
/root/vpn_clientB.sh >> /var/log/vpnc/$vpnName.log &
else
echo "Ping replied $(date)" >> /var/log/vpnc/$vpnName.log
fi
}
vpn_clientC(){
vpnName="clientC"
endpoint="10.10.10.78"
endpoint2="10.10.10.198"
count=$( ping -c 3 $endpoint | grep icmp* | wc -l )
count2=$( ping -c 3 $endpoint2 | grep icmp* | wc -l )
if [ $count -eq 0 -a $count2 -eq 0 ]
then
# All pings have failed!!!
echo "Ping FAILED $(date)" >> /var/log/vpnc/$vpnName.log
# Sending Email
echo "Ping for $endpoint FAILED! More info /var/log/vpnc/$vpnName.log " | mail -s "VPN $vpnName failed " my@domain.com
# Restart Connection
/root/vpn_clientC.sh >> /var/log/vpnc/$vpnName.log &
else
echo "Ping replied $(date)" >> /var/log/vpnc/$vpnName.log
fi
}
################### Functions End ###################
while : # Infinite cycle
do
# Call functions every 30 seconds
vpn_clientA
vpn_clientB
vpn_clientC
sleep 30
done
Отредактировано для правописания и ясности.