Даже если ты настроил ufw и открыл порты только на 22, 433 и 80, у тебя все равно сервисы docker могут торчать наружу. Это происходит потому что docker напрямую управляет iptables/nftables, вставляя свои правила до UFW, поэтому опубликованные порты могут быть доступны, даже если UFW их не показывает.
Почему это небезопасно:
Если ты запускаешь контейнер так:
docker run -p 8080:80 …
Или в docker-compose у тебя:
ports:
- "8080:80"
То Docker сам открывает порт всему интернету (0.0.0.0), даже если в ufw status его нет. Это значит, что любой человек из сети может достучаться до твоего контейнера и ufw это не остановит - Docker обходит его фильтры.
Как правильно защитить контейнер:
Лучше всего конечно вообще не открывать порт наружу, если в этом нет нужды. Безопасный вариант (локальный доступ):
docker run -p 127.0.0.1:8080:80 …
либо в docker-compose.yml:
ports:
- "127.0.0.1:8080:80"
Так сервис будет доступен только внутри сервера. Подходит для проксирования через nginx, который проксирует наружу, скрытых API и внутренних утилит, ssh-туннелей или VPN.
Вариант с открытым портом контейнера:
Если все-таки нужно по какой-то причине поднять контейнер на 0.0.0.0, то лучше закрыть эти порты с помощью правил. Docker поддерживает специальную цепочку DOCKER-USER, где ты можешь сам прописать фильтры:
# Разрешаем уже установленные соединения
sudo iptables -I DOCKER-USER -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# Разрешаем только нужный порт (например, 8080)
sudo iptables -I DOCKER-USER -p tcp --dport 8080 -j ACCEPT
# Всё остальное режем
sudo iptables -A DOCKER-USER -j DROP
Важно: правила читаются сверху вниз, поэтому разрешающие вставляем перед правилом DROP.
Проверка:
ss -lntp | grep 8080 # Слушает ли порт
Если вывод пуст - порт больше не слушает «снаружи».
Вывод:
Docker по умолчанию открывает всё наружу, даже если UFW говорит, что порты закрыты. Если не нужен внешний доступ, не публикуй порты или публикуй на 127.0.0.1. Если доступ нужен - используй DOCKER-USER, чтобы жёстко ограничить доступ к нужным портам.
LinuxCamp | #devops #docker #bymaga