Настройка Docker с UFW

🐳 Введение

Docker и UFW (Uncomplicated Firewall) могут конфликтовать, так как Docker изменяет правила iptables напрямую, обходя UFW. Это может привести к тому, что контейнеры получат доступ к сети, несмотря на правила UFW.

Для корректной работы Docker с UFW необходимо вручную настроить правила iptables, используя цепочку DOCKER-USER.


🛠 Основные проблемы при использовании Docker с UFW

  1. Docker обходит UFW – создавая собственные правила в iptables, Docker позволяет контейнерам обходить UFW.
  2. Пропущенный трафик – контейнеры могут принимать и отправлять пакеты, игнорируя UFW.
  3. Блокировка трафика 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

🔥 Проверка работы

  1. Посмотреть текущие правила UFW:
    sudo ufw status verbose
    
  2. Проверить, что Docker не обходит UFW:
    sudo iptables -L -v -n
    
  3. Проверить логи UFW:
    sudo journalctl -u ufw --no-pager | tail -50
    

📝 Заключение

Теперь Docker-контейнеры работают в рамках UFW, и правила брандмауэра применяются корректно.

  • Все контейнеры теперь контролируются UFW.
  • UFW логирует и блокирует запрещенный трафик Docker.
  • Использование цепочки DOCKER-USER позволяет Docker работать корректно.

Для дополнительной информации можно ознакомиться с проектом: chaifeng/ufw-docker.