Настройка WireGuard клиента на Ubuntu Server как шлюза (NAT) с сохранением локального доступа
Часто при поднятии WireGuard на удаленном сервере Ubuntu с конфигом AllowedIPs = 0.0.0.0/0 сервер намертво забивает на локальную сеть и отправляет весь трафик (включая ответы на ваш SSH) внутрь туннеля. Как результат — моментальная потеря связи с сервером.
Ниже пошаговая инструкция, как настроить клиента, завернуть весь внешний трафик в VPN, сохранить доступ к локальным подсетям за вашим основным роутером (например, MikroTik) и превратить саму Ubuntu в шлюз (NAT) для других устройств.
Исходные данные для примера:
* Интерфейс Ubuntu: ens192
* IP-адрес Ubuntu: 192.168.11.50
* Шлюз (локальный роутер): 192.168.11.1
* Локальные подсети, которые НЕ надо пускать в VPN: 192.168.10.0/24, 192.168.20.0/24, 172.16.0.0/24
Шаг 1. Установка WireGuard и resolvconf
Поскольку в клиентских конфигах часто прописана строка DNS = ..., WireGuard при старте будет искать утилиту для управления резолвом. Установим сам пакет и нужный обработчик:
sudo apt update && sudo apt install wireguard resolvconf -y
Шаг 2. Включение маршрутизации (IP Forwarding) в ядре
Чтобы Ubuntu могла работать как роутер и пересылать пакеты из локальной сети в VPN, нужно разрешить форвардинг.
Включаем прямо сейчас:
sudo sysctl -w net.ipv4.ip_forward=1
Чтобы настройка сохранялась после перезагрузки, открываем файл конфигурации:
sudo nano /etc/sysctl.confНаходим и раскомментируем (или добавляем в конец файла) строчку:
net.ipv4.ip_forward=1
Шаг 3. Настройка конфигурационного файла WireGuard
Создаем или редактируем файл /etc/wireguard/wg0.conf:
sudo nano /etc/wireguard/wg0.conf
Вставляем ваш конфиг, используя символ обратного слэша \ для переноса длинных строк. Это позволит сохранить читаемость файла без поломки скрипта:
[Interface]
PrivateKey = <ВАШ_ПРИВАТНЫЙ_КЛЮЧ>
Address = 10.0.0.2/32, fd00::2/128
DNS = 1.1.1.1
# --- Скрипты включения интерфейса (PostUp) ---
# 1. Исправляем асимметричную маршрутизацию (SSH не отвалится)
PostUp = ip rule add from 192.168.11.50 table 200; \
ip route add default via 192.168.11.1 dev ens192 table 200;
# 2. Добавляем маршруты до локальных подсетей в обход VPN
PostUp = ip route add 192.168.10.0/24 via 192.168.11.1 dev ens192; \
ip route add 192.168.20.0/24 via 192.168.11.1 dev ens192; \
ip route add 172.16.0.0/24 via 192.168.11.1 dev ens192;
# 3. Настраиваем правила пересылки и NAT (Маскарадинг)
PostUp = iptables -A FORWARD -i ens192 -o wg0 -j ACCEPT; \
iptables -A FORWARD -i wg0 -o ens192 -m state --state RELATED,ESTABLISHED -j ACCEPT; \
iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
# --- Скрипты выключения интерфейса (PostDown) ---
# 1. Удаляем правила асимметричной маршрутизации
PostDown = ip rule del from 192.168.11.50 table 200; \
ip route del default via 192.168.11.1 dev ens192 table 200;
# 2. Удаляем локальные маршруты
PostDown = ip route del 192.168.10.0/24 via 192.168.11.1 dev ens192; \
ip route del 192.168.20.0/24 via 192.168.11.1 dev ens192; \
ip route del 172.16.0.0/24 via 192.168.11.1 dev ens192;
# 3. Удаляем правила пересылки и NAT
PostDown = iptables -D FORWARD -i ens192 -o wg0 -j ACCEPT; \
iptables -D FORWARD -i wg0 -o ens192 -m state --state RELATED,ESTABLISHED -j ACCEPT; \
iptables -t nat -D POSTROUTING -o wg0 -j MASQUERADE
[Peer]
PublicKey = <КЛЮЧ_СЕРВЕРА>
Endpoint = 198.51.100.5:51820
AllowedIPs = 0.0.0.0/0, ::/0
Шаг 4. Запуск и автозапуск
Запускаем туннель:
sudo wg-quick up wg0Проверяем, что связь по SSH не прервалась. Если всё ок, добавляем интерфейс в автозапуск при старте системы:
sudo systemctl enable wg-quick@wg0
Для проверки статуса подключения можно использовать команду:
sudo wg
Финал: Теперь достаточно на вашем основном роутере (например, в IP -> Routes на MikroTik) завернуть трафик нужных локальных клиентов, указав шлюзом IP-адрес нашей Ubuntu (192.168.11.50), и они пойдут в интернет через WireGuard.