Linux весь трафик через vpn

Маршрутизация всего трафика через VPN в Ubuntu Linux

После многих часов поиска и устранения неисправностей, поиска потенциальных решений на этом и других сайтах, и я смирился, чтобы попросить совета у моих игроков. Я работаю над маршрутизацией всего сетевого трафика на экземпляре Ubuntu через Cisco VPN в университете. Используя встроенный сетевой менеджер или vpnc, я могу успешно установить соединение с VPN и успешно маршрутизировать трафик на любой университетский IP через VPN. Однако, помимо этих конкретных диапазонов IP-адресов, я не могу придумать какой-либо маршрут, который успешно сопоставит весь сетевой трафик через VPN.

До сих пор я пытался:

И многие другие глупые, неэффективные вещи, которые я не могу вспомнить достаточно хорошо, чтобы транскрибировать точно.

Кроме того, я пробовал маршрутизировать меньшие диапазоны IP-адресов и конкретные IP-адреса, но безрезультатно. Я не совсем уверен, что происходит не так, как следствия, которые я смог наблюдать, это сбои разрешения имен и сбои маршрутизации трафика через VPN. Что я здесь не так делаю?

Вот вывод ip route show после запуска VPN-соединения с VPNC:

Я успешно перенаправил произвольный трафик через этот VPN в MS Windows через клиент Cisco AnyConnect с конфигурацией по умолчанию. Вот как выглядит таблица маршрутизации, когда работает клиент AnyConnect (это другой компьютер за тем же маршрутизатором на 192.168.1.254).

Ваша локальная сеть — 192.168.1.0/24, как показано этой строкой в ​​вашей таблице маршрутизации:

Ваша сеть VPN 10.0.0.0/8, как показано этой строкой:

В настоящее время ваш маршрутизатор по умолчанию:

это, конечно, то, что вы не хотите, потому что он принадлежит вашей локальной сети: таким образом, все ваши вещи маршрутизируются через ваш локальный шлюз, как будто VPN не существует.

какой маршрут к вашему VPN-провайдеру.

Я не понял, что таблица маршрутизации — это просто таблица, полученная из вашего VPN, без вашего вмешательства. Это может указывать (косвенно), что ваш поставщик услуг желает пересылать только трафик, явно разрешенный в вашей таблице, через интерфейс tun0, и, возможно, предпринял дальнейшие шаги для блокирования всего другого трафика, и в этом случае ваши усилия будут тщетными.

Однако, если ваш провайдер готов перенаправить весь ваш трафик, вам нужно сделать следующее.

Во-первых, вам нужно выяснить, есть ли шлюз, который может принять ваше соединение, с другой стороны, потому что нам нужен его IP-адрес. Я дам вам четыре способа сделать это.

1) Когда компьютер подключен к VPN, попробуйте следующую команду:

Если все идет хорошо, вы должны увидеть ответ, содержащий следующую строку:

xywz — это IP-адрес локального шлюза. Возможно, вам придется отключить VPN после этого теста и, возможно, даже перезагрузить компьютер, потому что мы только что испортили таблицу маршрутизации.

2) В качестве альтернативы вы можете попробовать перейти на один из разрешенных сайтов (те, которые отображаются в вашей таблице маршрутизации как проходящие через интерфейс tun0 ), а затем выполнить команду:

Вы должны получить список устройств, с которыми связались по протоколу ARP, с MAC и IP-адресом; скорее всего, вы получите либо ноль, либо один ответ. Если вы получили один ответ, то это ваш маршрутизатор.

3) Если вы не получили такой ответ, вы можете попробовать с

(что будет очень медленно). Ваш шлюз будет одним из перечисленных, скорее всего, с адресом, оканчивающимся на .1 или .254, если таковой существует.

4) Используйте команду tcpdump:

и увидеть IP-адреса, выбрасываемые командой.

Если вы также не получили правильного ответа на этот тест, это означает, что кто-то действительно затянул винты в своей сети.

Но давайте будем оптимистичны и предположим, что теперь у вас есть кандидатский IP-адрес xwyz для удаленного маршрутизатора. Вам нужно будет удалить шлюз по умолчанию (как sudo!):

и попробуйте ориентироваться.

Позвольте мне повторить: поскольку ваш провайдер разрешил трафик только на несколько выбранных IP-адресов через свою VPN, возможно, он принял дополнительные меры (= брандмауэр), чтобы не дать умному пользователю принудительно использовать общий трафик через свою VPN. В этом случае вы ничего не можете сделать. Но если он этого не сделал, вышеуказанные шаги должны помочь вам найти решение.

mtu 1412 qdisc pfifo_fast state UNKNOWN group default qlen 500 link/none inet 192.168.128.193/24 brd 192.168.128.255 scope global tun0 valid_lft forever preferred_lft forever без адреса однорангового узла, который будет наблюдаться. Кроме того, таблица маршрутизации, которую я разместил ранее, не была изменена мной вообще — она ​​была полностью сгенерирована клиентом vpn.

Во всех ваших route командах отсутствуют маски сетей, поэтому они соответствуют только конкретному 0.0.0.0 адресу, а не всему интернету. Так замените 0.0.0.0 с 0.0.0.0/0 в первой команде вы пытались:

ip route add -net 0.0.0.0/0 gw homeportal dev tun0

Может быть одно предупреждение, которое я не уверен, что ваш VPN-клиент решает сам: конечную точку туннеля нужно исключить из маршрутизации через VPN, она должна быть направлена ​​через ваш eth0 интерфейс. Поэтому, если добавление этого маршрута по умолчанию нарушает вашу VPN, добавьте конкретный маршрут для вашей конечной точки VPN:

Источник

Маршрутизация всего трафика через VPN на Ubuntu Linux

После того, как мы провели часовое устранение неполадок, проложили потенциальные решения на этом сайте и другие, и я смирился, чтобы попросить совета моих лучших. Я работаю над маршрутизацией всего сетевого трафика на экземпляр Ubuntu через Cisco VPN в университете. Используя встроенный диспетчер сети или vpnc, я могу успешно установить соединение с VPN и успешно перенаправить трафик на любой университетский IP-адрес через VPN. Однако, помимо тех конкретных диапазонов IP-адресов, я не могу вызвать какой-либо маршрут, который успешно сопоставляет весь сетевой трафик через VPN.

До сих пор я пытался:

И многие другие глупые, неэффективные вещи, которые я не могу запомнить достаточно хорошо, чтобы четко писать.

Кроме того, я пробовал маршрутизацию меньших диапазонов IP и конкретных IP-адресов, каждый из которых бесполезен. Я не совсем уверен, что происходит не так, поскольку объем эффектов, которые я смог наблюдать, — это ошибки разрешения имен и сбои маршрутизации трафика по VPN. Что я здесь делаю неправильно?

Читайте также:  How do you keep windows clean

Вот вывод ip route show после запуска VPN-подключения с VPNC:

Я успешно перенаправил произвольный трафик по этой VPN в MS Windows через клиент Cisco AnyConnect с настройкой по умолчанию. Вот как выглядит таблица маршрутизации, когда клиент AnyConnect работает (это другой компьютер за одним и тем же маршрутизатором по адресу 192.168.1.254).

2 ответа

Ваша локальная сеть — 192.168.1.0/24, как показано в этой строке в таблице маршрутизации:

Ваша сеть VPN — 10.0.0.0/8, как показано в этой строке:

В настоящее время ваш маршрутизатор по умолчанию:

, который, конечно же, вы делаете не , потому что он принадлежит вашей локальной локальной сети: таким образом, все ваши вещи маршрутизируются через ваш локальный шлюз, как будто VPN не существует.

, который является маршрутом вашего VPN-провайдера.

Я не понял, что таблица маршрутизации — это просто та, которая получена из вашей VPN, без вашего вмешательства. Это может указывать (косвенно), что ваш поставщик услуг готов переслать только трафик, явно разрешенный в вашей таблице через интерфейс tun0, и, возможно, предпринял дальнейшие шаги для блокирования всего другого трафика, и в этом случае ваши усилия будут бесполезны.

Однако, полагая, что ваш провайдер готов перенаправить весь ваш трафик, вам нужно сделать следующее.

Сначала вам нужно выяснить, есть ли шлюз, желающий принять ваше соединение с другой стороны, потому что нам нужен его IP-адрес. Я дам вам четыре способа сделать это.

1) С ПК, подключенным к VPN, попробуйте выполнить следующую команду:

Если все пойдет хорошо, вы должны увидеть ответ, содержащий эту строку:

x.y.w.z — IP-адрес локального шлюза. Возможно, вам придется отключить VPN после этого теста и, возможно, даже перезагрузить компьютер, потому что мы просто очень хорошо испортили таблицу маршрутизации.

2) В качестве альтернативы вы можете попробовать перейти на один из разрешенных сайтов (те, которые отображаются в вашей таблице маршрутизации, как через интерфейс tun0 ), а затем выполнить команду:

Вы должны получить список ПК, подключенных через протокол ARP, с MAC и IP-адресом; скорее всего, вы получите либо нулевой, либо один ответ. Если вы получите один ответ, то это ваш маршрутизатор.

3) Если вы не получите такого ответа, попробуйте

(который будет очень медленным). Ваш шлюз будет один из перечисленных ПК, скорее всего, с адресом, заканчивающимся на .1 или в .254, если таковые существуют.

4) Используйте команду tcpdump:

и посмотрите, какие IP-адреса выбраны командой.

Если вы не получите надлежащего ответа на этот тест, это означает, что кто-то действительно затянул винты в своей сети.

Но давайте будем оптимистами и предположим, что у вас теперь есть IP-адрес кандидата x.w.y.z для удаленного маршрутизатора. Вам нужно будет удалить шлюз по умолчанию (как sudo!):

a добавить новый:

и попытайтесь перейти.

Позвольте мне повторить: поскольку ваш провайдер разрешил трафик только нескольким выбранным IP-адресам через свою VPN, возможно, он, возможно, принял дополнительные меры (= брандмауэр), чтобы предотвратить использование интеллектуального пользователя своим общим трафиком через его VPN , В этом случае вы ничего не можете сделать. Но если он этого не сделал, вышеуказанные шаги должны помочь вам найти решение.

В ваших командах route отсутствуют сетевые маски, поэтому они соответствуют только определенному 0.0.0.0 , а не весь интернет. Поэтому замените 0.0.0.0 на 0.0.0.0/0 в первом команда, которую вы пробовали:

ip route add -net 0.0.0.0/0 gw homeportal dev tun0

Может быть одно предостережение, которое я не уверен, что ваш VPN-клиент решает сам по себе: конечная точка туннеля должна быть исключена из маршрутизации через VPN, ее нужно маршрутизировать через ваш eth0 . Поэтому, если добавление этого маршрута по умолчанию прерывает вашу VPN, добавьте конкретный маршрут для вашей конечной точки VPN:

Источник

Как в линуксе подключиться к корпоративному VPN с помощью openconnect и vpn-slice

Хотите использовать линукс на работе, но корпоративный VPN не даёт? Тогда эта статья может помочь, хотя это не точно. Хочу заранее предупредить, что вопросы администрирования сетей я понимаю плохо, поэтому не исключено, что я всё сделал неправильно. С другой стороны не исключено, что я смогу написать руководство так, что оно будет понятно обычным людям, так что советую попробовать.

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

Большинство команд, используемых в руководстве нужно выполнять через sudo, который для краткости убран. Имейте в виду.

Большинство ip адресов подверглись жестокой обфускации, поэтому если видите адрес наподобие 435.435.435.435 — там должен быть какой-то нормальный ip, специфичный для вашего случая.

У меня Ubuntu 18.04, но думаю с небольшими правками руководство можно применять и к другим дистрибутивам. Однако в этом тексте линукс == Ubuntu.

Cisco Connect

Те, кто сидит на Windows или MacOS могут подключиться к нашему корпоративному VPN через Cisco Connect, которому нужно указать адрес гейтвея и при каждом подключении вводить пароль, состоящий из фиксированной части и кода, генерируемого Google Authenticator.

В случае с Линуксом, завести Cisco Connect не получилось, зато получилось нагуглить рекомендацию использовать openconnect, сделанный специально для того, чтобы заменить Cisco Connect.

Openconnect

По идее в убунте есть специальный графический интерфейс для openconnect но у меня он не заработал. Может оно и к лучшему.

В убунте openconnect ставится из пакетного менеджера.

Сразу после установки можно попробовать подключиться к VPN

vpn.evilcorp.com это адрес вымышленного VPN\
poxvuibr — имя вымышленного пользователя

openconnect попросит ввести пароль, который, напомню, состоит из фиксированной части и кода из Google Authenticator, а потом попробует подключиться к vpn. Если получилось, поздравляю, можете смело пропускать середину в которой много боли и переходить к пункту про работу openconnect в фоне. Если не заработало, то можно продолжать. Хотя если получилось при подключении например с гостевого вайфая на работе, то возможно радоваться и рановато, надо попробовать повторить процедуру из дома.

Cертификат

С высокой вероятностью ничего не запустится, а выхлоп openconnect будет выглядеть как-то вот так:

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

Тут сервер отослал нам сертификат, по которому можно определить, что подключение происходит именно к серверу родной корпорации, а не к злобному мошеннику, а системе этот сертификат неизвестен. И поэтому она не может проверить, настоящий сервер или нет. И поэтому на всякий случай прекращает работу.

Для того, чтобы openconnect всё-таки подключился к серверу, нужно явным образом сказать ему, какой сертификат должен прийти от VPN сервера с помощью помощью ключа —servercert

А узнать какой сертификат нам отослал сервер можно прямо из того, что напечатал openconnect. Вот из этого куска:

Читайте также:  Изменить курсор мыши windows 10 pro

Вот такой командой можно попробовать подключиться ещё раз

Возможно теперь заработало, тогда можно переходить к концу. Но лично мне Убунта показала фигу вот в такой форме

habr.com будет ресолвиться, но зайти туда будет нельзя. Адреса типа jira.evilcorp.com вообще не ресолвятся.

Что тут произошло, мне не понятно. Но эксперимент показывает, что если добавить в /etc/resolv.conf строку

то адреса внутри VPN начнут магическим образом ресолвиться и по ним можно будет ходить, то есть то, что ищет какими DNS ресолвить адреса, смотрит именно в /etc/resolv.conf, а не куда-то ещё.

Что подключение к VPN есть и оно работает, можно убедиться и без правок в /etc/resolv.conf, для этого достаточно ввести в браузере не символьное имя ресурса из vpn, а его ip адрес

По итогу получается две проблемы

  • при подключении к VPN не подхватывается её dns
  • весь трафик идёт через vpn, который не позволяет ходить в интернет

Что делать я сейчас расскажу, но сначала немного автоматизации.

Автоматический ввод фиксированной части пароля

К текущему моменту вы скорее всего уже ввели пароль не менее пяти раз и эта процедура вас уже изрядно утомила. Во-первых, потому что пароль длинный, во-вторых потому что при вводе нужно уложиться в фиксированный временной промежуток

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

Положим, фиксированная часть пароля — fixedPassword, а часть из Google Authenticator 567 987. Весь пароль целиком openconnect можно передать через стандартный ввод с помощью аргумента —passwd-on-stdin .

Теперь можно постоянно возвращаться к последней введённой команде и менять там только часть из Google Authenticator.

Корпоративный VPN не позволяет ходить в интернет.

Вообще не очень неудобно, когда для того, чтобы сходить на хабр приходится использовать отдельный компьютер. Отсутствие возможности копипастить со stackoverfow, вообще может парализовать работу, поэтому что надо что-то делать.

Нужно как-то организовать, чтобы когда надо зайти на ресурс из внутренней сети, линукс ходил в vpn, а когда надо зайти на хабр — ходил в интернет.

openconnect после запуска и установки соединения с vpn, выполняет специальный скрипт, который находится в /usr/share/vpnc-scripts/vpnc-script. В скрипт на вход передаются какие-то переменные, а он делает настройку vpn. К сожалению, я не смог разобраться, как разделить потоки трафика между корпоративным vpn и остальным интернетом с помощью родного скрипта.

Видимо специально для таких как я была разработана утилита vpn-slice, которая позволяет направлять трафик по двум каналам без танцев с бубном. Ну, то есть танцевать придётся, но шаманом при этом быть не обязательно.

Разделение трафика с помощью vpn-slice

Во-первых vpn-slice придётся поставить, с этим придётся разобраться самостоятельно. Если в комментариях будут вопросы, я напишу по этому поводу отдельный пост. Но это обычная программа на питоне, так что сложностей быть не должно. Я ставил с помощью virtualenv.

А дальше утилиту надо применить, с помощью ключа —script указав openconnect, что вместо стандартного скрипта нужно использовать vpn-slice

В —script передаётся строка с командой, которую нужно вызвать вместо скрипта. ./bin/vpn-slice — путь к исполняемому файлу vpn-slice 192.168.430.0/24 — маска адресов, по которым следует ходить в vpn. Тут, имеется в виду что если адрес начинается с 192.168.430 — то ресурс с этим адресом нужно искать внутри vpn

Теперь ситуация должна быть почти нормальной. Почти. Теперь можно зайти на хабр и можно зайти на внутрикорпоративный ресурс по ip, но нельзя зайти на внутрикорпоративный ресурс по символьному имени. Если прописать соответствие символьного имени и адреса в hosts — всё должно заработать. И работать, пока ip не поменяется. Линукс теперь умеет ходить в интернет или во внутрикорпоративную сеть в зависимости от ip. Но для определения адреса по прежнему используется не корпоративный DNS.

Проблема ещё может проявляться в таком виде — на работе всё нормально, а дома на внутрикорпоративные ресурсы можно зайти только по ip. Это потому что когда ты подключен к корпоративному Wi-Fi, то DNS используется тоже корпоративный, и в нём символьные адреса из VPN ресолвятся, несмотря на то что пройти по такому адресу без использования VPN по прежнему нельзя.

Автоматическая модификация файла hosts

Если vpn-slice вежливо попросить, то он может после поднятия VPN сходить в её DNS, найти там ip адреса нужных ресурсов по их символьным именам и вписать их в hosts. После выключения VPN эти адреса будут из hosts удалены. Для этого нужно передать символьные имена в vpn-slice в качестве аргументов. Вот так.

Теперь всё должно работать и в офисе и на пляже.

Искать адреса всех поддоменов в DNS, который отдала VPN

Если адресов внутри сети немного, то подход с автоматической модификацией файла hosts вполне рабочий. Но если ресурсов в сети много, то вам постоянно надо будет добавлять в скрипт строки вроде zoidberg.test.evilcorp.com zoidberg это так зовут один из тестовых стендов.

Но теперь, когда мы немного понимаем что к чему эту необходимость можно устранить.

Если после поднятия VPN посмотреть в /etc/hosts, то можно увидеть, вот такую строку

192.168.430.534 dns0.tun0 # vpn-slice-tun0 AUTOCREATED

Да и в resolv.conf была добавлена новая строка. Короче, vpn-slice каким-то образом определила где находится dns сервер для vpn.

Теперь надо сделать так, чтобы для того, чтобы узнать ip адрес доменного имени, кончающегося на evilcorp.com, линукс ходил в корпоративный dns, а если надо что-то другое, то в дефолтный.

Я довольно долго гуглил и обнаружил, что такая функциональность есть в убунте из коробки. Имеется в виду возможность использовать для ресолва имён локальный dns сервер dnsmasq.

То есть можно сделать так, чтобы за ip адресами линукс всегда ходил в локальный dns сервер, который в свою очередь, в зависимости от доменного имени, будет искать ip на соответствующем внешнем dns сервере.

Для управления всем, связанным с сетями и сетевыми соединениями, в убунте используется NetworkManager, а графический интерфейс для выбора, например, вайфай соединения — просто фронт к нему.

Нам надо будет полазить в его конфигурации.

  1. Создать файл в /etc/NetworkManager/dnsmasq.d/evilcorp

Обратите внимание на точку перед evilcorp. Она сигнализирует dnsmasq, что все поддомены evilcorp.com надо искать именно в корпоративном dns.

  1. Сказать NetworkManager, что для разрешения имён надо использовать dnsmasq

Конфигурация network-manager находится в /etc/NetworkManager/NetworkManager.conf Надо добавить туда:

Теперь, после подключения к VPN с помощью связки openconnect и vpn-slice, ip будет нормально опредёляться, даже если не добавлять символьные адреса в аргументы к vpnslice.

Как ходить через VPN в отдельные сервисы

После того, как получилось подключиться к vpn, я дня два очень радовался, а потом выяснилось, что если подключаться к впн не из офисной сети, то не работает почта. Симптом знакомый, не правда ли?

Читайте также:  Что будет если срок активации windows истек

Почта у нас находится в mail.publicevilcorp.com, а значит не попадает под правило в dnsmasq и адрес почтового сервера ищется через публичный DNS.

Ну а в офисе всё равно используется DNS, в котором этот адрес есть. То есть я так думал. На деле после добавления в dnsmasq строки

ситуация никак не изменилась. ip остался тот же. Пришлось мне ходить на работу.

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

Я использую vpn-slice, чтобы ходить через VPN по адресам, которые начинаются с 192.168.430. А у почтового сервера не только символьный адрес не является поддоменом evilcorp, у него ещё и ip адрес не начинается с 192.168.430. И из общей сети он конечно никого к себе не пускает.

Для того, чтобы линукс ходил через VPN и к почтовому серверу, нужно добавить в vpn-slice и его. Допустим адрес почтовика- 555.555.555.555

Скрипт для поднятия VPN с одним аргументом

Всё это, конечно, не очень удобно. Да, можно сохранить текст в файлик и копипастить в консольку, а не набирать руками, но всё равно приятного мало. Для облегчения процесса можно завернуть команду в скрипт, который будет находиться в PATH. И тогда нужно будет только ввести код, полученный из Google Authenticator

Если поместить скрипт в connect

то можно будет просто писать в консоли

Но теперь всё равно придётся зачем-то держать консоль в которой запущен openconnect открытой

Запуск openconnect в фоне

К счастью авторы openconnect позаботились о нас и добавили в программу специальный ключ —background, который делает так, чтобы программа после запуска работала в фоне. Если запустить её вот так, то консоль после запуска можно закрыть

Теперь только непонятно, куда идут логи. Логи нам в общем-то не сильно нужны, но мало ли. openconnect может перенаправить их в syslog, где они будут храниться в целостности и сохранности. нужно этого надо добавить в команду ключ —syslog

И вот, получается, что openconnect работает где-то там в фоне и никому не мешает, но как его остановить непонятно. То есть можно, конечно отфильтровать выхлоп ps грепом и искать процесс в названии которого есть openconnect, но это как-то муторно. Спасибо авторам, которые подумали и об этом. В openconnect есть ключик —pid-file, с помощью которого можно проинструктировать openconnect писать идентификатор своего процесса в файл.

Теперь всегда можно прибить процесс командой

Если процесса нет, kill ругнётся, но ошибку не кинет. Если файла нет, то тоже не случится ничего страшного, так что можно смело убивать процесс в первой строке скрипта.

Теперь можно включить компьютер, открыть консоль и запустить команду, передав ей код из Google Authenticator. Консоль потом можно прибить.

Без vpn-slice. Вместо послесловия

Понять, как жить без vpn-slice оказалось очень сложно. Пришлось много читать и гуглить. К счастью, когда столько времени провёл с проблемой, технические мануалы и даже man openconnect читаются как захватывающие романы.

В итоге я выяснил, что vpn-slice, как и родной скрипт, для разделения сетей модифицирует таблицу маршрутизации.

Таблица маршрутизации

Это, упрощённо говоря, такая таблица в первой колонке которой содержится с чего должен начинаться адрес, по которому хочет пройти линукс, а во второй через какой сетевой адаптер по этому адресу пройти. На самом деле колонок больше, но сути это не меняет.

Для того, чтобы посмотреть таблицу маршрутизации нужно выполнить команду ip route

Тут каждая строчка отвечает за то, куда надо пройти для того, чтобы послать сообщение по какому-то адресу. Первым идёт описание с чего должен начинаться адрес. Для того, чтобы понять как определить, что 192.168.0.0/16 означает, что адрес должен начинаться с 192.168 нужно погуглить что такое маска ip адреса. После dev находится имя адаптера в который надо слать сообщение.

Для VPN линукс сделал виртуальный адаптер — tun0. За то, чтобы трафик для всех адресов начинающихся с 192.168 шёл через него отвечает строка

Ещё посмотреть на текущее состояние таблицы маршрутизации можно с помощью команды route -n (ip адреса талантливо анонимизированы) Эта команда выдаёт результаты в другом виде и вообще deprecated, но её выхлоп часто попадается в мануалах в интернете и надо уметь его читать.

С чего должен начинать ip адрес для маршрута можно понять из комбинации колонок Destination и Genmask. Те части ip адреса, которым в Genmask соответствуют цифры 255, учитываются, а те, где там 0 — нет. То есть комбинация Destination 192.168.0.0 и Genmask 255.255.255.0 означает, что если адрес начинается с 192.168.0, то запрос к нему пойдёт по этом маршруту. А если Destination 192.168.0.0 но Genmask 255.255.0.0, то по этому маршруту пойдут запросы к адресам, которые начинаются с 192.168

Для того, чтобы разобраться, что на самом деле делает vpn-slice я решил посмотреть на состояния таблиц до и после

До включения VPN было так

После вызова openconnect без vpn-slice стало так

А после вызова openconnect в комбинации с vpn-slice вот так

Видно, что если не использовать vpn-slice, то openconnect явным образом пишет, что по всем адресам, кроме отдельно указанных, надо ходить через vpn.

Там рядом сразу указан ещё один путь, который надо использовать, если адрес, по которому пытается пройти линукс не соответствует ни одной маске из таблицы.

Тут уже написано, что в таком случае надо ходить через стандартный адаптер вайфай.

Я полагаю, что путь для VPN используется потому, что он в таблице маршрутизации первый.

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

И всё заработало.

Роутинг запросов к почтовому серверу без vpn-slice

Но у меня же есть ещё почтовый сервер с адресом 555.555.555.555, на который тоже надо ходить через vpn. Маршрут до него тоже надо добавить руками.

И вот теперь всё норм. Так что обойтись без vpn-slice таки можно, но уже надо хорошо знать, что делаешь. Я сейчас думаю не добавить ли в последнюю строку родного скрипта openconnect удаление дефолтного маршрута и добавление маршрута для почтовика после подключения к vpn, просто, чтобы движущихся частей в моём велосипеде стало поменьше.

Наверное, кому-то для того, чтобы понять как настроить VPN хватило бы этого послесловия. Но я, пока пытался понять что и как мне делать, прочитал достаточно много таких руководств, которые работают у автора, но почему-то не работают у меня и решил добавить сюда все кусочки, которые нашёл. Я бы чему-то такому очень порадовался.

Источник

Оцените статью