Чтобы докер не портил iprables нужно запретить ему самостоятельно менять правила и вручную создать правила nat и прочее что обычно создает сам докер.
Делаем:
iptables -t nat -N DOCKER
iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
iptables -t nat -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
iptables -t nat -A DOCKER -i docker0 -j RETURN
iptables -N DOCKER
iptables -A FORWARD -o docker0 -j DOCKER
Далее запрещаем демону docker менять iptables. Для этого открываем файл /usr/lib/systemd/system/docker.service и редактируем строку. После чего нужно перечитать конфиг и перезапустить демона. Внимание — все контейнеры так же будут перезапущены.
sed -i \'s,^ExecStart=.*$,ExecStart=/usr/bin/docker daemon -H fd:// --iptables=false,g\' \\
/usr/lib/systemd/system/docker.service
Перезапуск:
systemctl daemon-reload
systemctl restart docker
И если INPUT по умолчанию дропает пакеты — также разрешить опубликованные докером порты.
iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -m multiport --dports 80,443 -m comment --comment \"WEB ACCESS\" -j ACCEPT