Назад | Перейти на главную страницу

Linux vpnc - Как определить конкретный номер tunX в vpnc

Мне нужно запустить несколько туннелей 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

Отредактировано для правописания и ясности.