Docker и UWF

12-04-2024

Проблема

UFW — это популярный интерфейс iptables в Ubuntu, который упрощает управление правилами брандмауэра. Но когда Docker установлен, Docker обходит правила UFW, и к опубликованным портам можно получить доступ извне.

Решение проблем UFW и Docker

В этом решении необходимо изменить только один файл конфигурации UFW, все конфигурации и параметры Docker остаются значениями по умолчанию.

Измените файл конфигурации UFW /etc/ufw/after.rules и добавьте в конец файла следующие правила:

# BEGIN UFW AND DOCKER
*filter
:ufw-user-forward - [0:0]
:ufw-docker-logging-deny - [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -j ufw-user-forward
-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
-A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 172.16.0.0/12
-A DOCKER-USER -j RETURN
-A ufw-docker-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW DOCKER BLOCK] "
-A ufw-docker-logging-deny -j DROP
COMMIT
# END UFW AND DOCKER

Используйте команды sudo systemctl restart ufw или sudo ufw reload для перезапуска UFW после изменения файла. Теперь общедоступная сеть не может получить доступ к каким-либо опубликованным портам докера, контейнер и частная сеть могут нормально посещать друг друга, а контейнеры также могут получать доступ к внешней сети изнутри.

Разрешить общедоступным сетям доступ к сервисам, предоставляемым контейнером Docker, порт службы контейнера — 80. Запустите следующую команду, чтобы разрешить общедоступным сетям доступ к этой службе:

ufw route allow proto tcp from any to any port 80

Примечание. Если мы публикуем порт с помощью параметра -p 8080:80, нам следует использовать порт контейнера 80, а не порт хоста 8080.

Если имеется несколько контейнеров со сервисным портом 80, но мы хотим, чтобы внешняя сеть имела доступ только к определенному контейнеру. Например, если частный адрес контейнера — 172.17.0.2, используйте следующую команду:

ufw route allow proto tcp from any to 172.17.0.2 port 80

Если сетевой протокол службы — UDP, например службы DNS, вы можете использовать следующую команду, чтобы разрешить внешней сети доступ ко всем опубликованным службам DNS:

ufw route allow proto udp from any to any port 53

Аналогично, если только для конкретного контейнера, например IP-адреса 172.17.0.2:

ufw route allow proto udp from any to 172.17.0.2 port 53

Ссылка на статью