Проблема: после настройки WireGuard интернет перестал работать, если включён ufw. При этом при отключении фаервола всё работает идеально. При попытке включить ufw появляется ошибка:
ERROR: problem running ufw-init
Bad argument `*nat'
Error occurred at line: 29
Эта статья — полное руководство по решению этой проблемы.
🔍 Почему это происходит?
- UFW блокирует маршрутизацию: по умолчанию
ufwимеет политикуdeny (routed), что означает: запрещать весь трафик, проходящий через сервер (например, от клиента WireGuard в интернет). - Неправильный порядок секций в
before.rules: файл должен строго следовать форматуiptables-restore. Если*natнаходится посередине, а потом снова идут правила*filter—ufwсломается.
✅ Решение по шагам
1. Включи IP-форвардинг
WireGuard как шлюз требует включённой маршрутизации пакетов.
sudo sysctl -w net.ipv4.ip_forward=1
Чтобы включить навсегда, добавь в /etc/sysctl.conf:
net.ipv4.ip_forward = 1
2. Узнай имя внешнего интерфейса
ip route | grep default
Пример вывода:
default via 192.168.1.1 dev ens3
Значит, внешний интерфейс — ens3 (может быть eth0, enp0s3 и т.д.).
3. Настрой /etc/ufw/before.rules
Замени содержимое файла на следующее (подставь свою сеть и интерфейс):
# /etc/ufw/before.rules
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
# Разрешаем трафик через WireGuard
-A ufw-before-forward -i wg0 -j ACCEPT
-A ufw-before-forward -o wg0 -j ACCEPT
-A ufw-before-input -i wg0 -j ACCEPT
-A ufw-before-output -o wg0 -j ACCEPT
# Остальные стандартные правила UFW
-A ufw-before-input -i lo -j ACCEPT
-A ufw-before-output -o lo -j ACCEPT
-A ufw-before-input -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-output -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-forward -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# ICMP
-A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type echo-request -j ACCEPT
# DHCP
-A ufw-before-input -p udp --sport 67 --dport 68 -j ACCEPT
# ufw-not-local
-A ufw-before-input -j ufw-not-local
-A ufw-not-local -m addrtype --dst-type LOCAL -j RETURN
-A ufw-not-local -m addrtype --dst-type MULTICAST -j RETURN
-A ufw-not-local -m addrtype --dst-type BROADCAST -j RETURN
-A ufw-not-local -m limit --limit 3/min --limit-burst 10 -j ufw-logging-deny
-A ufw-not-local -j DROP
# mDNS и UPnP
-A ufw-before-input -p udp -d 224.0.0.251 --dport 5353 -j ACCEPT
-A ufw-before-input -p udp -d 239.255.255.250 --dport 1900 -j ACCEPT
COMMIT
# NAT для маскарадинга трафика клиентов
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.0.0.0/24 -o ens3 -j MASQUERADE
COMMIT
Важно:
- Замени
10.0.0.0/24на сеть из твоегоwg0.conf(например,10.8.0.0/24). - Замени
ens3на твой внешний интерфейс. *filterдолжен быть полностью до*nat. Никаких правил послеCOMMIT!
4. Перезагрузи UFW
sudo ufw disable
sudo ufw enable
5. Перезапусти WireGuard
sudo wg-quick down wg0
sudo wg-quick up wg0
6. Проверь подключение
На клиенте:
ping 8.8.8.8
curl ifconfig.me
Совет: Чтобы отслеживать блокировки, смотри логи:
sudo tail -f /var/log/ufw.log
🎯 Итог
Теперь WireGuard работает с включённым UFW, интернет доступен, и ошибка *nat больше не появляется.
Ключевые моменты:
- Включи
ip_forward - Правильно структурируй
before.rules - Разреши
FORWARDиMASQUERADE
Комментарии
Пока нет комментариев. Будьте первым!