На всякий случай, вот ссылка на статью, которая описывает основную идею. Если в двух словах – нам понадобится VPN-сервер, иначе пакеты упорно будут идти на внешний адрес. Рассмотрим еще один вариант.
В прошлый раз мы использовали OpenVPN, сегодня рассмотрим L2TP в варианте с IPSec. Я тестировал на CentOS 7/8, но принципиально оно должно работать и на других дистрибутивах. Итак, для начала нам понадобится репозиторий EPEL, он вообще содержит много разного полезного и интересного.
yum -y install epel-release
Далее, ставим пакет, который и будет использоваться для подключения:
yum -y install NetworkManager-l2tp
Осталось всего ничего – создать соединение. Потребуется команда примерно такого вида:
nmcli c add con-name [vpn-name] type vpn vpn-type l2tp ifname [vpn-name] connection.autoconnect yes ipv4.method auto vpn.data 'gateway=[VPN-Server_IP], ipsec-enabled=yes, ipsec-psk=[IPSec_PSK], password-flags=0, user=[VPN_Username]' vpn.secrets password=[VPN_Password]
Разумеется, блоки в квадратных скобках нужно заменить на свои данные уже без скобок. В принципе, ИМХО, особой расшифровки не требуется – создаем соединение с нужным именем соединения и именем интерфейса. Указываем имя, пароль, PSK-фразу для фазы IPSec. Внутренний IP-адрес получаем от VPN-сервера. Параметр password-flags=0 говорит о том, что все данные указаны прямо в строке подключения – по умолчанию оно ищет пароль в спец. файле, а всё, что указано в команде просто игнорируется. Кстати, насколько я смог выяснить, адрес сервера придется указывать в формате IP-адреса. DNS-имена вроде работают через раз.
Но это общий формат. Нам нужно внести несколько изменений конкретно под наш сценарий – через VPN ходить надо только в сеть VPN, а всё остальное надо пускать через шлюз по умолчанию. В этом нам помогут параметры ipv4.never-default и ipv4.routes. В итоге, строка будет выглядеть так:
nmcli c add con-name [vpn-name] type vpn vpn-type l2tp ifname [vpn-name] connection.autoconnect yes ipv4.never-default yes ipv4.routes "[VPN_Network]/[VPN_Netmask] [VPN_Gateway]" ipv4.method auto vpn.data 'gateway=[VPN-Server_IP], ipsec-enabled=yes, ipsec-psk=[IPSec_PSK], password-flags=0, user=[VPN_Username]' vpn.secrets password=[VPN_Password]
После корректного заполнения всех параметров выйдет что-то похожее на вот это:
nmcli c add con-name test-vpn type vpn vpn-type l2tp ifname test-vpn connection.autoconnect yes ipv4.never-default yes ipv4.routes "192.168.10.0/24 192.168.10.1" ipv4.method auto vpn.data 'gateway=172.183.194.205, ipsec-enabled=yes, ipsec-psk=my-PSK-secret, password-flags=0, user=odmin' vpn.secrets password=SuperPassword
К сожалению, есть пара подводных камней. В CentOS 7 можно запускать VPN вместе с ОСью, если привязать VPN-соединение к основному. В CentOS 8 это не работает и после неудачной попытки запустить VPN падает и проводной интерфейс. Насколько я смог выяснить, это ошибка в работе Network Manager’а и её не решают уже давно на самых разных системах. Типа в старой версии всё хорошо, а в новых поломали и не чинят. Команда будет выглядеть следующим образом:
nmcli connection modify ens192 connection.secondaries test-vpn
Однако, в моем случае автозапуск VPN при старте системы не особенно помогает, потому что он разрывается по какой-то причине в рандомное время. Поэтому я просто добавил в cron команду запуска в нужное мне время, которая выглядит так:
nmcli connection up [vpn-name]
Разумеется, не забываем заменить значение в квадратных скобках на имя своего интерфейса. Вообще, состояние интерфейсов покажет команда:
nmcli connection show
При необходимости, подробные команды с параметрами легко гуглятся по ключевому слову “nmcli” и/или “NetworkManager”.