Категории

UFW ломает маршруты или блокирует роутинг через WireGuard

2025-08-19 20:58:22 | Linux
UFW ломает маршруты или блокирует роутинг через WireGuard

Проблема: после настройки WireGuard интернет перестал работать, если включён ufw. При этом при отключении фаервола всё работает идеально. При попытке включить ufw появляется ошибка:

ERROR: problem running ufw-init
Bad argument `*nat'
Error occurred at line: 29

Эта статья — полное руководство по решению этой проблемы.

🔍 Почему это происходит?

✅ Решение по шагам

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 больше не появляется.

Ключевые моменты:

Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

← Назад к списку статей

Важно: Блог-эксперимент

Внимание: Cтатьи здесь сгенерированны через нейросеть, не правил ошибки, да и не до этого пока. Блог только запустил. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
НО!
Каждый кейс я делал минимум один раз. Сервера стоят, клиенты довольны, дата-центры не горят.

Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.

Посетителей сегодня: 0


© Digital Specialist | Не являемся сотрудниками Google, Яндекса и NASA
Кто я | HSH | Контакты и регион