Маршрутизация в VPN

Настраиваем NetworkManager для правильной маршрутизации.

Были проблемы с корпоративным VPN: подключаешь один — получаешь доступ к одной части ресурсов, подключаешь второй — к другой. При этом доступ к первой части отваливается.

Решение

Оказывается, всё довольно просто. Нужно в момент подключения к VPN посмотреть, нет ли там маршрута, который пускает весь трафик через себя, и если есть — удалить его.

Проверка маршрутов:

ip route

Чтобы удалить маршрут, используйте команду:

ip route delete <маршрут>

Автоматизация

Делать это вручную глупо, поэтому лучше написать небольшой скрипт, который будет делать это автоматически. Его даже запускать вручную не надо. Используем встроенную функциональность NetworkManager.

  1. В каталоге /etc/NetworkManager/dispatcher.d/ создайте файл с расширением .conf.

  2. Сделайте этот файл исполняемым. Что? .conf и исполняемый? Да!

    sudo chmod +x /etc/NetworkManager/dispatcher.d/<script>.conf
    
  3. Добавьте код скрипта.

    Код скрипта должен корректно обрабатывать два входных параметра:

    1. Название сетевого интерфейса.

    2. Статус подключения. Тут нужно всего лишь обработать события vpn-up и vpn-down.

    У меня получилось так:

    #!/bin/bash
    
    IFACE="$1"
    STATUS="$2"
    
    if [ "$IFACE" = "tun0" ] ; then
        case "$STATUS" in
            vpn-up)
                ip route delete default         via <VPN-IP> dev tun0 proto static metric 50
                ip route add    <IP>            via <VPN-IP> dev tun0 proto static metric 50
                ;;
            vpn-down)
                ip route delete <IP>            via <VPN-IP> dev tun0 proto static metric 50
                ;;
            *)
                ;;
        esac
    fi
    

Всё. Теперь при включении VPN NetworkManager будет удалять маршрут default, который направляет весь трафик через VPN, и добавлять маршруты для выбранных IP-адресов. А при отключении VPN, наоборот, будет удалять добавленные маршруты.

Создано при помощи Hugo
Тема Stack, дизайн Jimmy