Использование клиента Forti через подсистему Windows для Linux (WSL 2, WSLg)
Обложка
TL; DR В статье рассказывается о доступе к внутрикорпоративным ресурсам через соединение Forti из подсистемы Windows для Linux (WSL).
Дисклеймеры
Общий дисклеймер • О личности автора • Отказ от ответственности • Об использовании нейросетей
Аннотация
Случилась такая ситуация, что иногда (почти всегда) приходится держать по два прокси/VPN для свободного доступа к Интернету и чуть менее свободного доступа к интранету компании. Допустим, оба соединения работают через создание TUN-адаптеров в Windows, а это 100% гарантирует конфликты в сетевой маршрутизации, разруливать которые, будучи хоть трижды сетевым инженером, вам вряд ли захочется — адаптеры виртуальные, создаются на каждый чих, маршруты между ними писать замучаешься даже с помощью всемогущего PowerShell.
А ещё у вас одно устройство, просто потому что вам удобно. Ну, или несколько устройств, но на всех хочется иметь корпоративный доступ, не теряя личного пространства.
Первым VPN может быть Nekoray, Hiddify, Amnezia или прочие нехорошие и в недалёком будущем уголовно наказуемые названия, а второй — это Forti с их «любимым» клиентом, который работает, скажем, с такой же охотой, как средний работник в пятницу вечером, ибо написан на Electron со всеми вытекающими. О совместной работе двух настолько различающихся программных решений не может быть и речи — при одновременном включении работает либо один, либо второй, либо вообще ничего в Сеть не может достучаться.
Пример содержимого окна FortiClient VPN
Данная статья предлагает решение проблемы двух Proxy/VPN-клиентов. К счастью, на современных Windows есть и «вторая» ОС (точнее, их может быть сколько угодно) — WSL (для поддержания уровня душноты имеем в виду WSL 2). В таком случае можно использовать вторую ОС на Linux для доступа и работы в корпоративной сети. Работать будем конкретно с Ubuntu 24.04. Because we can!
Инструкция
Требования
Вся та часть рабочего процесса, зависящая от корпоративного доступа, может быть легко мигрирована в экосистему Linux без остатка (например, вы пользуетесь только браузером и кросс-платформенными утилитами для разработки фронтенда (VS Code, Node, npm));
Наличие знаний о работе в Windows 11+ на уровне выше среднего (каждый определяет его для себя сам, вот у меня он 25 сантиметров — хотите верьте, хотите нет);
Наличие знаний о базовой работе с терминалом, GNU/Linux в общем и в Ubuntu 24.04+ в частности;
Windows 11 с включенным режимом разработчика;
WSL включён;
Если у вас уже установлен и включен WSL, то убедитесь, что вы работаете на версии WSL 2.
Ubuntu установлена и настроена (добавлен пользователь, есть доступ к Интернет);
Ваша инфраструктура — в основном on-premise/self-hosted;
Вы подключаетесь через FortiClient VPN по SSL-VPN, а не IPsec VPN;
Вы знаете реквизиты подключения к серверу Forti (домен, порт, свои логин и пароль) и у вас установлено приложение FortiToken для генерации OTP-кодов для входа в корпоративный VPN;
Вы знаете адрес DNS-сервера, который связывает корпоративные домены и IP-адреса в вашей локальной сети. Спросите у местного сисадмина или девопса.
Последовательность действий aka алгоритм
Переходите в консоль с дистрибутивом Ubuntu: в Windows нажимаете Win + R → вводите
ubuntu
. Всё, отныне мы работаем там;Ставите любимый браузер: Microsoft Edge или Google Chrome;
Ставите пакет openfortivpn:
sudo apt install -y openfortivpn
;Создаете конфиг вот этой командой:
cat > ~/.openfortivpnconfig<
port = <ПОРТ СЕРВЕРА FORTI, ОБЫЧНО 443> username = <ВАШЕ ИМЯ ПОЛЬЗОВАТЕЛЯ> password = <ВАШ ПАРОЛЬ К УЧЕТНОЙ ЗАПИСИ> set-dns = 1 use-resolvconf = 1 pppd-use-peerdns = 0 pppd-log=/var/log/openfortivpn.log # Эта запись сертификата X509 позволяет пропустить предупреждение о незащищенном соединении. ХЗ, почему, но это работает! trusted-cert = fa0ce72653d7946106170d147e20113a97b02f7200bf11e8e5e5029efb339720 EOF Запускаем!
5.1. Кстати, подготовьте мобильное приложение FortiToken, оно вам нужно будет прямо сейчас.
sudo openfortivpn -c ~/.openfortivpnconfig -o <ВВЕДИТЕ ШЕСТЬ ЦИФР ИЗ ПРИЛОЖЕНИЯ FORTI TOKEN>
Если всё хорошо, вывод должен быть таким:
sudo openfortivpn -c ~/.openfortivpnconfig -o XXXXXX INFO: Connected to gateway. INFO: Authenticated. INFO: Remote gateway has allocated a VPN. INFO: Got addresses: [10.32.0.2], ns [10.32.2.1] INFO: Negotiation complete. INFO: Got addresses: [10.32.0.2], ns [10.32.2.1] INFO: Negotiation complete. INFO: Got addresses: [10.32.0.2], ns [10.32.2.1] INFO: Negotiation complete. INFO: Got addresses: [10.32.0.2], ns [10.32.2.1] INFO: Negotiation complete. INFO: Got addresses: [10.32.0.2], ns [10.32.2.1] INFO: Negotiation complete. INFO: Negotiation complete. INFO: Interface ppp0 is UP. INFO: Setting new routes... INFO: Route to gateway exists already. INFO: Route to gateway exists already. INFO: Route to gateway exists already. INFO: Route to gateway exists already. INFO: Route to gateway exists already. INFO: Route to gateway exists already. INFO: Route to gateway exists already. INFO: Route to gateway exists already. INFO: Route to gateway exists already. INFO: Route to gateway exists already. INFO: Route to gateway exists already. INFO: Route to gateway exists already. INFO: Route to gateway exists already. INFO: Route to gateway exists already. INFO: Adding VPN nameservers... Dropped protocol specifier '.openfortivpn' from 'ppp0.openfortivpn'. Using 'ppp0' (ifindex=6). INFO: Tunnel is up and running.
Если нет красных линий строчек и надписей ERROR, то всё хорошо.
Проверка
Этот шаг в идеале можно пропустить, но я почти гарантирую вам — оно на первом запуске работать не будет. Поэтому распишу пару проверок.
ℹ️ Вот теперь необходимо вспомнить адрес DNS-сервера, который присылается после подключения Forti. Для удобочитаемости здесь он принят за 10.32.2.1
Открываем ещё одну панель или вкладку в Windows Terminal/окошко в консоли с новым подключением к той же Ubuntu: Win + R → вводите
ubuntu
;Проверяем, что всё должно работать. Пропингуйте, например, свой домен менеджера задач:
ping -c 1 <ДОМЕН JIRA/TRELLO/ИТД>
Если в строке с доменом будет IP-адрес, начинающийся с серого диапазона IP, типа »10.32»,»172.0»,»192.168», то всё хорошо. Если это не так, продолжайте читать.
Проверяем маршруты:
ip route show | grep "10.32.2.1" # чекаем адрес DNS-сервера в записях маршрутной таблицы
Должно выдать как минимум одну строчку, что-то типа:
10.32.2.1/31 dev ppp0 scope link
. Это значит, что всё хорошо, трафик на айпишники10.XXX.XXX.XXX
пойдет через новосозданный сетевой интерфейсppp0
.Теперь проверяем
resolv.conf
:cat /etc/resolv.conf | grep "10.32.2.1"
Если в выводе есть строка
nameserver 10.32.2.1
, то всё хорошо. Если нет, то добавьте её сюда:sudo sed -i '1s/^/nameserver 10.32.2.1\n/' /etc/resolv.conf
ℹ️ Внимание! WSL затерёт содержимое этого файла через некоторое время. Чтобы она не затирала файл, нужно воспользоваться инструкциями из него и поправить
wsl.conf
, посмотреть инструкции:cat /etc/resolv.conf
.
Запуск
Запускаем браузер! Командой
microsoft-edge
илиgoogle-chrome
, как вам больше нравится! Запустится браузер в окружении Linux. Пользуемся.ℹ️ Если ресурсы вашего корпоративного интранета всё ещё не открываются, то нужно в настройках браузера включить+отключить Secure DNS и любые настройки/расширения, отвечающие за прокси/VPN.
Переносим в WSL, точнее, в Ubuntu весь свой тулчейн разработки, прямо зависящий от доступа к корпоративной сети. Если этот тулчейн у вас состоит из одного лишь VS Code, то просто создайте/склонируйте папку проекта и напишите
code .
, он вам скачает сервер и запустит виндовый VS Code с подключением к WSL по SSH-соединению. Вуаля!
Скриншотики для отвлечения внимания:
Типичный запущенный терминал выглядит как-то так
Браузер, запущенный из-под Linux
Плюстар уонна минустар
Плюсы данного подхода:
+ Всё в одном: можно пользоваться и личным, и корпоративным VPN;
+ WSL пользуется виндовыми маршрутами, так что если на Windows у вас работает клиент, поставивший свой TUN-адаптер, то и Линукс тоже будет пользоваться этим трафиком. В данном случае это удобно — иметь доступ одновременно к заблокированным и к корпоративным сайтам;
+ В теории должно работать и с Dev-контейнерами (Dev containers) VS Code в облаке и в локалке, то есть можно будет хоть с планшета на github.dev заходить и иметь доступ к корпоративной сети для дебага;
+ Это лучше, чем иметь сессию по RDP к специально оборудованному для работу устройству (ну, тут вкусовщина, но меня это 10 fps задолбали. И, да, я знаю, что можно фреймрейт поднять, но это всё не то, суррогат);
+ Можно пользоваться только личными устройствами и не нести ответственность за корпоративную собственность. Меньше ответственности — меньше срок от прокурора!
Минусы:
— Повышенное энергопотребление устройства + часть вычислительных ресурсов начнёт съедать WSL. Не так много, но если браузер, запущенный через Linux, попадется на особо прожорливую вкладку… Окошко просто зависнет и вы его просто так не убьёте через Диспетчер задач и
top
(ибо точно не угадаете с первого раза с одним из сотни одинаковых процессов) без выключения всей WSL (Powershell:wsl --shutdown
);— Для перфекционистов и технодушнил: да, это WSL 2. Да, это есть суть виртуальная машина Hyper-V. Да, мало чем от неё отличается. Да, браузер и окошки из-под Linux рендерятся через RDP по X-Server’у. Да, я смирился с этим, стал жертвой ЛДПР-пропаганды от M$ и получаю от них баснословные суммы за эту статью на Хабре. Да, я знаю, что я автоматически получаю бан на посещение любой GNU-конфы на 5 лет без права компилировать ядро. Да, мне удобно и я кайфую от организованного мною процесса разработки. Да, я благодарю Microsoft за изобретение WSL;
— Перемешиваются абстракции и сама суть разделения работы и личной жизни. Решение простое: отказаться от личной жизни. И далось оно мне легко.
Примечания
В результате вы получаете, по сути, две машины: Windows для личных нужд, где работает ваш личный Proxy/VPN-клиент, и Linux, где всё настроено для работы. Linux, находящийся внутри Windows, будет ходить в том числе и через ваш личный VPN, имейте в виду.
Как вы могли заметить в конфиге OpenFortiVPN, можно обойтись без прямого задания DNS-сервера в /etc/resolv.conf
, и это работает -, но только если в Windows не установлен Docker с интеграцией с WSL. Он маршрутную таблицу добавляет свою запись:
ip route
default via 172.28.64.1 dev eth0 proto kernel
172.28.64.0/20 dev eth0 proto kernel scope link src 172.28.79.89 # Вот эта?
— и всё почему-то ломается. Ни разу не сетевик, поэтому неохота разбираться, почему.
Для запуска браузера без вывода в stdout можно воспользоваться утилитой nohup
: nohup microsoft-edge &
. Это позволит вам освободить панель/окно терминала для более нужных дел.
Не держите линуксовый браузер включенным более двух дней подряд! Почему-то со временем он зависает почти со 100% вероятностью.
Кстати, скорее всего, всё это заработает и на Windows 10… правда, вживую я её уже пару лет как не видел.
Естественно, есть и другие пути организации доступа к корпоративному интранету, но этот показался мне наиболее изящным, так как визуально и он создаёт больше всего «нативности». А если ты не замечаешь лишних абстракций в виде RDP-соединения к рабочему компьютеру или специально подготовленной виртуалке, то работается психологически легче. ИМХО.
Хотите пойти дальше и избавиться в том числе от проприетарного FortiToken Mobile? Тогда вам сюда, читать мануал (на телефоне нужен root).
Выводы
Инструкция пригодится в любой стране, где права и свободы граждан в Интернете ограничиваются, в связи с чем нужно туннелировать трафик не только для доступа к сети компании, но и для себя-любимого. Статья подойдет именно людям с потребностями и ситуациями, описанными в аннотации, и только им. Это могут быть люди разной направленности в IT: от менеджеров и аналитиков до разработчиков и лидов без комплекса арчевода. Описана инструкция, немного путей траблшутинга (диагностики неполадок), плюсы и минусы данного подхода, а также примечания. И всё-таки хорошо, что WSL — есть!