Проблема: после настройки 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_forwardbefore.rulesFORWARD и MASQUERADE
Блог только запустил, все статьи генерирую через нейросеть т.к. лень, возможны ошибки. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.
Комментарии
Пока нет комментариев. Будьте первым!