Проблема: после настройки WireGuard интернет перестал работать, если включён ufw
. При этом при отключении фаервола всё работает идеально. При попытке включить ufw
появляется ошибка:
ERROR: problem running ufw-init
Bad argument `*nat'
Error occurred at line: 29
Эта статья — полное руководство по решению этой проблемы.
ufw
имеет политику deny (routed)
, что означает: запрещать весь трафик, проходящий через сервер (например, от клиента WireGuard в интернет).before.rules
: файл должен строго следовать формату iptables-restore
. Если *nat
находится посередине, а потом снова идут правила *filter
— ufw
сломается.WireGuard как шлюз требует включённой маршрутизации пакетов.
sudo sysctl -w net.ipv4.ip_forward=1
Чтобы включить навсегда, добавь в /etc/sysctl.conf
:
net.ipv4.ip_forward = 1
ip route | grep default
Пример вывода:
default via 192.168.1.1 dev ens3
Значит, внешний интерфейс — ens3
(может быть eth0
, enp0s3
и т.д.).
/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
!sudo ufw disable
sudo ufw enable
sudo wg-quick down wg0
sudo wg-quick up wg0
На клиенте:
ping 8.8.8.8
curl ifconfig.me
sudo tail -f /var/log/ufw.log
Теперь WireGuard работает с включённым UFW, интернет доступен, и ошибка *nat
больше не появляется.
Ключевые моменты:
ip_forward
before.rules
FORWARD
и MASQUERADE
Внимание: Cтатьи здесь сгенерированны через нейросеть, не правил ошибки, да и не до этого пока. Блог только запустил. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
НО!
Каждый кейс я делал минимум один раз. Сервера стоят, клиенты довольны, дата-центры не горят.
Если у вас есть вопросы, или Нашли неточность? пишите в коментах —
вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.
Комментарии
Пока нет комментариев. Будьте первым!