TGViewer
Bash Days | Linux | DevOps Bash Days | Linux | DevOps @bashdays · 23.6K subscribers
Post #55 7.36K
Не думал что этот вопрос настолько актуален — почему перестают работать очевидные правила iptables на хостовой машине, если на сервере запущены какие-либо docker контейнеры?

Давай разбираться.

Если коротко, то когда ты запускаешь docker контейнеры, то все начинает работать через жопу по правилам маршрутизации самого docker’а. И плевать он хотел что у тебя там на хостовой машине было ранее сконфигурировано в плане безопасности.

Давай рассмотрим на примере как с этим можно побороться.

Вводные:
На сервере крутится контейнер nginx, порты 80 и 443 смотрят в мир, то есть открыты для всех.
Задача: Нужно, чтобы порты 80 и 443 были доступны только для определенных IP адресов.

Если бахнуть на хостовой машине так:

-A INPUT -s xxx.xxx.xxx.xxx/32 -p tcp -m tcp --dport 80,443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited

То порты 80 и 443 так же будут доступны всем желающим. Вот на эти грабли почти каждый и наступает.

А решение простое, правим немного свой docker-compose.yml и добавляем networks. В моем примере я добавил сеть bashdays.

version: '3.2'

services:
nginx:
image: nginx:1.20.1
container_name: nginx
ports:
- '80:80'
- '443:443'
networks:
- bashdays

networks:
bashdays:
driver: bridge
driver_opts:
com.docker.network.enable_ipv6: "false"
com.docker.network.bridge.name: "docker_bashdays"

Ну и теперь на хостовой машине можно уже что-то запрещать или разрешать с помощью iptables.

/sbin/iptables -F DOCKER-USER
/sbin/iptables -I DOCKER-USER -i eth0 -o docker_bashdays -j DROP
/sbin/iptables -I DOCKER-USER -i eth0 -s <EXTERNAL IP> -j RETURN
/sbin/iptables -I DOCKER-USER -i eth0 -p tcp --dport 80 -s <CLIENT IP> -j RETURN
/sbin/iptables -I DOCKER-USER -i eth0 -p tcp --dport 443 -s <CLIENT IP> -j RETURN
/sbin/iptables -I DOCKER-USER -i eth0 -o docker_bashdays -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

Где <EXTERNAL IP> это айпишник сервера который доступен из мира. А <CLIENT_IP> собственно айпишник клиента, которому мы разрешим конектится к порту 80 и 443. Все! Теперь у нас и docker в шоколаде и хостовые правила iptables работают «наверное» правильно.

Не забывай правильно подставить свой интерфейс ethX/enoX, а то всякое бывает.

Важное замечание. После перезапуска контейнеров, docker снова перетрет правила на хостовой машине. Поэтому весь этот процесс хорошо бы автоматизировать. Я сильно не заморачивался, просто закинул правила в bash скрипт, повесил на крон (каждую минуту), да и все. 🧠 Закостылил так закостылил.

Сегодня чуть позже покажу более правильный скрипт, который будет следить за ребутом docker, но по сути те же яйца, только сбоку. Рад был всех вас видеть!

tags: #networks
—
🟢 Подпишись: @bashdays
  • 👍 120
More from @bashdays
  1. Sep 29, 2026Самый жаркий холивар в команде — это не systemd, а какие заказать роллы на всю команду. Од…
  2. Sep 24, 2026Post #1565
  3. Sep 23, 2026Здрасти приехали, решил я в кой-то веке воспользоваться услугами Codex, создал аккаунт, по…
  4. Sep 22, 2026Всем привет, с вами TagdTagd. Сегодня опять поднимем тему архивов, но немного с другой сто…
  5. Sep 15, 2026Всем привет, с вами TagdTagd. И это вторая часть. Практическая. С первой частью можешь озн…
  6. Sep 11, 2026🤖 DevOps в эпоху AI трансформации: что работает уже сейчас! 17 сентября Сбер собирает Dev…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →