Борьба с правилами брандмауэра с контейнерами Docker.
Настройка следующая.
Тонкая установка Debian 11 с Docker (Standalone).
На Docker установлен Portainer и еще 4 веб-контейнера.
Все подключено к одной мостовой сети под названием dkr-lan.
Игнорируя контейнер portainer, другие контейнеры имеют следующие сопоставленные порты
- web01 8081:80
- web02 8082:80
- web03 8083:80
- web04 8084:80
web01 и web03 могут быть общедоступны из любого места через порты 8081 и 8083.
Однако доступ к web02 возможен только с двух общедоступных IP-адресов 1.2.3.4 и 1.2.3.5.
Точно так же к web04 можно получить доступ только с одного общедоступного IP-адреса 1.2.3.4.
Я использую iptables и сначала пытался настроить правила в цепочке DOCKER-USER, однако это, кажется, фильтрует пакеты только после того, как NAT имел место, и кажется, что все контейнеры после NAT используют порт 80. Я не мог понять, как ACCEPT web02 и web04 для этих IP-адресов и УДАЛИТЕ остальные.
После небольшого поиска я начал думать, что лучшим вариантом будет фильтрация в цепочке PREROUTING.
с правилами, как показано ниже
# Для веб01
iptables -t mangle -A PREROUTING -p TCP -s 0/0 --dport 8081 -j MARK --set-mark 1
# Для веб02
iptables -t mangle -A PREROUTING -p TCP -s 1.2.3.4 --dport 8082 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p TCP -s 1.2.3.5 --dport 8082 -j MARK --set-mark 1
# Для веб03
iptables -t mangle -A PREROUTING -p TCP -s 0/0 --dport 8083 -j MARK --set-mark 1
# Для веб04
iptables -t mangle -A PREROUTING -p TCP -s 1.2.3.4 --dport 8084 -j MARK --set-mark 1
# Разрешить весь трафик, отмеченный в PREROUTING
# Блокировать весь остальной трафик
iptables -A DOCKER-USER -m mark --mark 1 -j ПРИНЯТЬ
iptables -A DOCKER-USER -p TCP --dport 8082 -j DROP
iptables -A DOCKER-USER -p TCP --dport 8084 -j DROP
Я вижу, что входящий трафик попадает в правила PREROUTING, так как счетчики увеличиваются, и это выглядит нормально.
Но блоки не работают. Это связано с тем, что это делается в цепочке DOCKER-USER, и на этом этапе они находятся после NAT.
Итак, как я могу настроить правила, которые разрешают IP-адреса на основе DPORT, а затем блокируют сброс также на основе DPORT?
Угадайте, что это должно быть сделано в цепочке PREROUTING?
А еще нужно быть настойчивым. Как и сейчас, каждый раз, когда я останавливаюсь и запускаю контейнер, он, кажется, нарушает правила брандмауэра, и все снова открывается для ВСЕХ. Это делается в цепочке DOCKER. Итак, предполагаю, что мне нужно поместить свои правила в PREROUTING или DOCKER-USER.
Что мне не хватает?