🚨 Проблема
Обнаружил серьёзную дыру в безопасности: виртуалки KVM/libvirt могут обращаться к Docker контейнерам в обход файрвола хоста.
Что происходило:
- Сервис на порту 9090 корректно блокировался iptables ✅
- FileBrowser в Docker на 8191 был доступен из виртуалок ❌
- Обычные INPUT правила не работали для Docker сервисов
🔍 Диагностика
Видим Docker-proxy обходит наши правила
sudo ss -tlnp | grep 8191
docker-proxy слушает на 0.0.0.0:8191
Docker использует DNAT в собственных цепях
sudo iptables -t nat -L DOCKER
DNAT: 8191 -> 172.22.0.3:80
⚡ Почему так происходит?
1. libvirt создаёт bridge
virbr0 (192.168.122.0/24)2. Docker использует свои iptables цепи (`DOCKER-USER`, `DOCKER-FORWARD`)
3. Трафик идёт: VM → bridge → Docker NAT → контейнер
4. INPUT правила срабатывают только для хоста, но НЕ для Docker
🛡️ Решение
Блокировать в специальной цепи
DOCKER-USER:# Заблокировать виртуалки от всех Docker контейнеров
sudo iptables -I DOCKER-USER 1 -s 192.168.122.0/24 -d 172.16.0.0/12 -j DROP
# Сделать постоянным (Ubuntu/Debian)
sudo iptables-save | sudo tee /etc/iptables/rules.v4
Почему 172.16.0.0/12?
Docker использует диапазон 172.16.0.0-172.31.255.255 для своих сетей.
📋 Проверка
# ✅ Должно работать
curl google.com # Интернет
ssh user@vm # SSH к виртуалкам
# ❌ Должно блокироваться
curl 192.168.122.1:8191 # Docker сервисы
🎯 Итого
- Обычные iptables INPUT ≠ защита от виртуалок
- Docker-proxy обходит стандартные правила
- DOCKER-USER - единственный способ контролировать VM→Docker трафик
UPD: Потратил 2 часа на debugging, пока не понял что Docker живёт в своей вселенной 🤦♂️
Может кому то тоже будет полезно.
#security #docker #kvm #libvirt #iptables #firewall