
TL;DR Пытаюсь замаскировать все Docker
вручную firewalld
.
Я только что начал использовать его firewalld
на своей машине Debian 10, так как хочу узнать, как он работает.
Я Docker
установил брандмауэр на хосте и хочу управлять им самостоятельно, чтобы узнать больше о том, что делает Docker, какие правила и т. д. он применяет при создании контейнеров и как работает firewalld.
Так как Debian 10 использует nftables
по умолчанию и использует некую iptables
оболочку, позволяющую использовать iptables
команды для создания правил брандмауэра. Docker
работает нормально, когда --iptables
включен.
Однако я хочу использовать firewalld
с nftables
бэкэндом и пропустить все, что связано с этим, iptables
так как это просто сбивает с толку. Поэтому /etc/systemd/system/multi-user.target.wants/docker.service
я добавил --iptables=false
, чтобы Docker не связывался с брандмауэром. Я сбросил все правила iptables и т. д., и пока все хорошо.
Теперь перейдем к моей проблеме.
Все контейнеры могут получить доступ к хосту и друг к другу, но не к интернету. Поскольку все они работают на 172.17.0.0/16, а мой хост находится на 192.168.9.0/24, мне нужно замаскировать трафик от контейнеров.
Я не могу найти достаточно информации об управлении брандмауэром вручную при использовании Docker, и поскольку я новичок в firewalld, мне остается только предполагать.
Мои интерфейсы следующие:
eno1 (main interface)
docker0 (docker bridge)
veth******* (one for each container)
все veth
интерфейсы находятся в docker0
мосту.
Поэтому я подумал, что могу создать новую зону под названием docker
и скрыть все с docker0
моста.
~# firewall-cmd --permanent --new-zone=docker
~# firewall-cmd --permanent --zone=docker --change-interface=docker0
~# firewall-cmd --permanent --zone=docker --add-rich-rule='rule family="ipv4" source address=172.17.0.0/16 masquerade'
~# firewall-cmd --reload
Список активных зон дает мне следующее:
~# firewall-cmd --get-active-zones
docker
interfaces: docker0
public
interfaces: eno1
Я все еще не могу получить доступ к интернету из контейнеров. Я понятия не имею, правильный ли это путь или что я упускаю. Любая помощь будет оценена по достоинству.
решение1
В firewalld маскарадинг нужно настроить на зону, которая ведет в Интернет. В вашем случае это, похоже, зона public
.