AmneziaWG в Docker: Ошибка внедрения правил маршрутизации iptables
- Контейнер завершает работу с ошибкой:
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_MASQUERADE2. Переключение на iptables-legacy (при конфликтах nftables backend)
Если хост использует старый бэкенд, а контейнер новый (или наоборот):
# На хосте Debian/Ubuntu
update-alternatives --set iptables /usr/sbin/iptables-legacy
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy3. Корректные 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 MASQUERADE4. Перезапуск службы Docker
systemctl restart docker Частые вопросы (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+').