Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

DOCKER_IPTABLES_INJECT_FAIL Сетевое оборудование и VPN

AmneziaWG в Docker: Ошибка внедрения правил маршрутизации iptables

Обновлено: 25.08.2026 · Официальная документация ↗
  • Контейнер завершает работу с ошибкой: iptables v1.8.7 (legacy): can't initialize iptables table 'nat': Table does not exist (do you need to insmod?).
  • Сбой выполнения директивы: PostUp = iptables -A FORWARD -i %i -j ACCEPT.
  • Клиенты успешно подключаются к VPN, но не имеют доступа к сети Интернет (нет NAT-трансляции).
  • Конфликт между Docker daemon iptables и системными цепочками nftables.

1. Загрузка необходимых модулей Netfilter на хосте

Контейнер не может самостоятельно загрузить модули ядра хоста. Выполните загрузку вручную:

modprobe ip_tables
modprobe iptable_nat
modprobe iptable_filter
modprobe xt_MASQUERADE
modprobe xt_conntrack

Сохраните автозагрузку в /etc/modules-load.d/iptables.conf:

ip_tables
iptable_nat
xt_MASQUERADE

2. Переключение на iptables-legacy (при конфликтах nftables backend)

Если хост использует старый бэкенд, а контейнер новый (или наоборот):

# На хосте Debian/Ubuntu
update-alternatives --set iptables /usr/sbin/iptables-legacy
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy

3. Корректные PostUp / PostDown команды в awg0.conf

Убедитесь, что имя внешнего интерфейса (например, eth0 или ens3) указано правильно:

[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <Key>
# Универсальные правила NAT
PostUp = iptables -A FORWARD -i awg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o $(ip route show default | awk '{print $5}') -j MASQUERADE
PostDown = iptables -D FORWARD -i awg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o $(ip route show default | awk '{print $5}') -j MASQUERADE

4. Перезапуск службы Docker

systemctl restart docker
💡 Практика специалистов: Если на сервере включен UFW или Firewalld, не перегружайте PostUp сложными цепочками — добавьте правила трансляции напрямую в /etc/ufw/before.rules или настройте зону masquerade в firewall-cmd.

Частые вопросы (FAQ)

Почему iptables выдает ошибку 'Table does not exist' внутри контейнера?

В ядре хоста не загружен модуль iptable_nat. Контейнер изолирован и не имеет права выполнять modprobe без монтирования /lib/modules и привилегий SYS_MODULE.

Можно ли использовать nftables вместо iptables в PostUp скриптах?

Да, можно написать PostUp = nft add rule nat postrouting oifname 'eth0' masquerade, если в окружении установлен пакет nftables.

Как проверить, работает ли трансляция NAT для подключенных клиентов?

Выполните на сервере: iptables -t nat -L POSTROUTING -v -n. Счетчик переданных пакетов (pkts) должен увеличиваться при серфинге с клиента.

Что делать, если имя внешнего сетевого интерфейса меняется при перезагрузке?

Используйте динамическое определение интерфейса через subshell команду: $(ip -4 route ls | grep default | grep -Po '(?<=dev )\S+').

Полезные материалы
Рекомендуем