Перейти к содержанию

Docker и UFW без отключения iptables

Мне хотелось контролировать подключения к докеру через ufw и вот к кому решению я пришел.
Необходимо изменить файл конфигурации UFW /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

Дальше включаем ufw и проверяем работу

Опубликовано в рубрикеLINUXUncategorized

Оставьте первый коментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *