Включение 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