Были проблемы с корпоративным 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, наоборот, будет удалять добавленные маршруты.