Настройка Docker с UFW
🐳 Введение
Docker и UFW (Uncomplicated Firewall) могут конфликтовать, так как Docker изменяет правила iptables
напрямую, обходя UFW. Это может привести к тому, что контейнеры получат доступ к сети, несмотря на правила UFW.
Для корректной работы Docker с UFW необходимо вручную настроить правила iptables
, используя цепочку DOCKER-USER
.
🛠 Основные проблемы при использовании Docker с UFW
- Docker обходит UFW – создавая собственные правила в
iptables
, Docker позволяет контейнерам обходить UFW. - Пропущенный трафик – контейнеры могут принимать и отправлять пакеты, игнорируя UFW.
- Блокировка трафика Docker контейнеров – если UFW настроен слишком жестко, контейнеры могут потерять доступ в сеть.
✅ Как настроить UFW для работы с Docker
1️⃣ Открываем необходимые порты для Docker
Добавьте разрешенные порты в UFW:
sudo ufw route allow 8080/tcp # Пример открытого порта для контейнера
sudo ufw route allow from YOUR_IP to any port PORT comment "allow from home docker"
Запускаем UFW, если он отключен:
sudo ufw enable
2️⃣ Создаем новый файл правил UFW для Docker
Создадим iptables
-правила, позволяющие UFW контролировать трафик Docker-контейнеров.
Открываем файл /etc/ufw/after.rules
:
sudo vim /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
Сохраняем файл и закрываем редактор (CTRL + X
, затем Y
, затем Enter
).
3️⃣ Применяем изменения и перезапускаем UFW
sudo ufw reload
sudo systemctl restart docker
🔥 Проверка работы
- Посмотреть текущие правила UFW:
sudo ufw status verbose
- Проверить, что Docker не обходит UFW:
sudo iptables -L -v -n
- Проверить логи UFW:
sudo journalctl -u ufw --no-pager | tail -50
📝 Заключение
Теперь Docker-контейнеры работают в рамках UFW, и правила брандмауэра применяются корректно.
- Все контейнеры теперь контролируются UFW.
- UFW логирует и блокирует запрещенный трафик Docker.
- Использование цепочки
DOCKER-USER
позволяет Docker работать корректно.
Для дополнительной информации можно ознакомиться с проектом: chaifeng/ufw-docker.