Вопрос или проблема
Я подключен к VPS и мне нужно направить конкретное приложение через VPN. Однако, когда я включаю свой VPN через WireGuard, мое SSH-соединение с VPS обрывается. По умолчанию мой VPN перенаправляет весь трафик через себя, но я хочу, чтобы только определенные приложения использовали VPN. Моя цель – настроить WireGuard так, чтобы только приложения, явно привязанные к интерфейсу сети VPN (se-got-wg-001
), использовали VPN, в то время как другие продолжали использовать интерфейс по умолчанию (eth0
).
Ниже представлена моя текущая конфигурация WireGuard:
[Interface]
PrivateKey = REDACTED
Address = 10.66.127.142/32,fc00:bbbb:bbbb:bb01::3:7f8d/128
DNS = REDACTED
[Peer]
PublicKey = REDACTED
AllowedIPs = 0.0.0.0/0,::0/0
Endpoint = REDACTED
Я хочу, чтобы эти изменения сохранялись после перезагрузки. Какие изменения мне нужно внести, чтобы обеспечить использование eth0
в качестве интерфейса по умолчанию, даже когда VPN включен?
Я нашел несколько связанных постов, которые могут помочь, но все еще не совсем понимаю, какие шаги мне нужно предпринять:
- Wireguard клиент с двумя интерфейсами – использовать один интерфейс для Wireguard
- https://www.reddit.com/r/WireGuard/comments/npf4bp/new_to_wireguard_tips_for_routing_only_certain/
- https://serverfault.com/questions/1075973/wireguard-how-to-only-tunnel-some-of-the-traffic
- https://www.reddit.com/r/WireGuard/comments/vytuv5/is_it_possible_to_setup_wireguard_so_it_only/
Вот информация о моей системе:
root@vmixxx /e/wireguard# neofetch
.-/+oossssoo+/-. [email protected]
`:+ssssssssssssssssss+:` ---------------------------------
-+ssssssssssssssssssyyssss+- OS: Ubuntu 24.04.1 LTS x86_64
.ossssssssssssssssssdMMMNysssso. Host: KVM/QEMU (Standard PC (i440FX + PIIX, 1996) pc-i440fx-7.2)
/ssssssssssshdmmNNmmyNMMMMhssssss/ Kernel: 6.8.1-1009-realtime
+ssssssssshmydMMMMMMMNddddyssssssss+ Uptime: 2 hours, 45 mins
/sssssssshNMMMyhhyyyyhmNMMMNhssssssss/ Packages: 1813 (dpkg), 4 (snap)
.ssssssssdMMMNhsssssssssshNMMMdssssssss. Shell: fish 3.7.0
+sssshhhyNMMNyssssssssssssyNMMMysssssss+ Resolution: 800x600
ossyNMMMNyMMhsssssssssssssshmmmhssssssso CPU: AMD EPYC 7282 (4) @ 2.794GHz
ossyNMMMNyMMhsssssssssssssshmmmhssssssso GPU: 00:02.0 Vendor 1234 Device 1111
+sssshhhyNMMNyssssssssssssyNMMMysssssss+ Memory: 2630MiB / 5925MiB
.ssssssssdMMMNhsssssssssshNMMMdssssssss.
/sssssssshNMMMyhhyyyyhdNMMMNhssssssss/
+sssssssssdmydMMMMMMMMddddyssssssss+
/ssssssssssshdmNNNNmyNMMMMhssssss/
.ossssssssssssssssssdMMMNysssso.
-+sssssssssssssssssyyyssss+-
`:+ssssssssssssssssss+:`
.-/+oossssoo+/-.
WireGuard не обрабатывает маршрутизацию. wg-quick преобразует ваши AllowedIPs в маршруты, поэтому, если у вас есть “AllowedIPs = 0.0.0.0/0”, wg-quick добавит маршрут 0.0.0.0/0 из этого.
В вашей конфигурации wg-quick укажите Table=
, чтобы установить маршруты в другую таблицу маршрутизации вместо главной таблицы. Например:
[Interface]
Table = 40
Когда VPN будет включен, выполните ip [-4] [-6] route ls table 40
, чтобы проверить, что маршруты действительно помещаются в эту таблицу.
Наконец, используйте ip -4 rule add from 10.66.127.142/32 lookup 40
, чтобы система выбирала эту таблицу для любых пакетов, исходящих с IPv4-адреса wg0, и повторите то же самое с ip -6 rule
для его IPv6-адреса (вы можете указать from fc00::/8
, если это не будет конфликтовать с другими интерфейсами, но лучше сопоставить весь /128).
Настройте PostUp=
в wg-quick, чтобы автоматически добавлять эти правила маршрутизации по политике.
Ответ или решение
Для того чтобы настроить VPN на базе WireGuard так, чтобы лишь определённые приложения использовали VPN-соединение, необходимо применить политику маршрутизации, которая позволит контролировать трафик. Ниже приводится пошаговая инструкция для достижения этой цели.
Шаг 1: Измените конфигурацию WireGuard
Ваша текущая конфигурация WireGuard выглядит так:
[Interface]
PrivateKey = REDACTED
Address = 10.66.127.142/32,fc00:bbbb:bbbb:bb01::3:7f8d/128
DNS = REDACTED
[Peer]
PublicKey = REDACTED
AllowedIPs = 0.0.0.0/0,::0/0
Endpoint = REDACTED
Замените строку AllowedIPs
, чтобы она не включала маршрутизацию всего трафика через VPN. Это можно сделать двумя способами: установить определённые IP-адреса, которые хотите маршрутизировать через VPN, или использовать более свежую методику с таблицами маршрутов.
Шаг 2: Использование таблиц маршрутов
Добавьте следующую строку в раздел [Interface]
вашей конфигурации:
Table = 40
Это укажет, что маршруты, связанные с данным интерфейсом, будут добавлены в таблицу маршрутов с номером 40. Вот как теперь будет выглядеть ваша конфигурация:
[Interface]
PrivateKey = REDACTED
Address = 10.66.127.142/32,fc00:bbbb:bbbb:bb01::3:7f8d/128
DNS = REDACTED
Table = 40
[Peer]
PublicKey = REDACTED
AllowedIPs = 0.0.0.0/0,::0/0
Endpoint = REDACTED
Шаг 3: Настройка маршрутов
Теперь в конфигурацию wg-quick
добавьте команды PostUp
и PostDown
, чтобы автоматически применять политики маршрутизации при поднятии или поднятии интерфейса. Например:
PostUp = ip -4 rule add from 10.66.127.142/32 lookup 40
PostDown = ip -4 rule delete from 10.66.127.142/32 lookup 40
Эти команды добавляют правила маршрутизации, позволяя пакетам, исходящим из IP вашего WireGuard интерфейса, использовать таблицу маршрутов 40.
Шаг 4: Проверка и настройки
После внесения изменений, активируйте ваш WireGuard интерфейс и проверьте правильность маршрутизации, выполнив команду:
ip -4 route ls table 40
Вы также можете создать правила для IPv6 аналогичным образом.
Шаг 5: Устойчивость изменений
Чтобы обеспечить сохранность ваших настроек после перезагрузки системы, убедитесь, что конфигурация WireGuard правильно сохранена в нужном месте, например, в /etc/wireguard
. После перезагрузки сервис должен автоматически поднимать WireGuard с заданным интерфейсом и вашими маршрутами.
Это решение поможет вам избежать отключения SSH-соединения с VPS при активации VPN, поскольку мы изолировали маршрутизируемый трафик, оставив основной поток через eth0
.
Вывод
Следуя шагам выше, вы сможете настроить WireGuard так, чтобы только конкретные приложения использовали VPN-соединение, при этом другие приложения продолжат использовать стандартный интерфейс eth0
. Убедитесь, что все команды и конфигурации вводятся правильно, чтобы избежать потери подключения к вашему серверу.