Включение ufw для контейнеров докер
В последних версиях докер ufw не работает корректно, необходимо вносить изменения в конфиг файлы.
Подробно решение описано в репозитории: GitHub - chaifeng/ufw-docker: To fix the Docker and UFW security flaw without disabling iptables и GitHub - il-da-r/dockerufw: Исправить ошибку безопасности Docker и UFW без отключения Iptables в Ubuntu
Необходимо изменить конфигурацию ufw
nano /etc/ufw/after.rules
Вставить в конец файла слеющий блок
# UFW DOCKER
*filter
:ufw-user-forward - [0:0]
:DOCKER-USER - [0:0]
# Следующие правила позволяют локальным подсетям
# иметь возможность доступа друг к другу.
-A DOCKER-USER -j RETURN -s 10.0.0.0/8
-A DOCKER-USER -j RETURN -s 172.16.0.0/12
-A DOCKER-USER -j RETURN -s 192.168.0.0/16
# Если докер-контейнер не соответствует настройкам ОС при получении данных, то есть минимальный номер порта меньше 32768.
# Например, у нас есть контейнер Dnsmasq. # Минимальный номер порта, который Dnsmasq использует для получения данных, составляет 1024.
# Мы можем использовать следующую команду, чтобы разрешить больший диапазон портов, используемых для получения пакетов DNS.
-A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN
# правилo позволяет UFW определять, разрешено ли общедоступным сетям посещать службы, предоставляемые контейнером Docker.
-A DOCKER-USER -j ufw-user-forward
# Например, если мы хотим опубликовать порт 8080 контейнеров, используйте следующую команду:
# ufw route allow 8080
# Особенности: невозможно выставить службы, работающие на хостах и контейнерах одновременно, одной и той же командой.
# Но порт 8080 хоста по-прежнему недоступен для публичной сети.
# Если мы хотим сделать это, выполните следующую команду, чтобы разрешить общий доступ к порту на хосте отдельно:
# ufw allow 8080
# Не поддерживает более старые версии Ubuntu (где нет поддержки ufw route)
# Вместо правила выше можно использовать
#-A DOCKER-USER -j ufw-user-input.
# Простой в использовании и понимании, поддерживает старые версии Ubuntu.
# Например, чтобы разрешить посещать опубликованный порт, порт контейнера которого 8080,
# используйте команду: ufw allow 8080
# Он не только предоставляет порты контейнеров, но также предоставляет порты хоста.
# Например, если на хосте запущена служба, а порт - 8080.
# Команда ufw allow 8080 # позволяет общедоступной сети посещать службу и все опубликованные порты, порты контейнеров которых 8080.
# Но мы просто хотим выставить службу работающий на хосте, или
# только сервис, работающий внутри контейнеров, а не оба.
#Чтобы избежать этой проблемы, нам может понадобиться использовать команду, аналогичную следующей для всех контейнеров:
# ufw allow proto tcp from any to 172.16.0.3 port 8080
# Правила блокируют запросы на подключение, инициированные всеми общедоступными сетями,
# но разрешают внутренним сетям доступ к внешним сетям.
# Для протокола TCP это препятствует активному установлению соединения TCP из общедоступных сетей.
# Для протокола UDP все доступы к портам меньше 32767 заблокированы.
-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 172.16.0.0/12
-A DOCKER-USER -j RETURN
COMMIT
# END UFW AND DOCKER
Перезапустить службу:
sudo ufw reload
sudo service docker restart
Отключение маршрутов для докер
Danger
Является одним из вариантов решения проблемы но может привести к проблема в работе сетей докер
nano /etc/docker/daemon.json
Добавить запись:
{ "iptables": false }
Перезапустить службу докер
sudo service docker restart