Сразу говорю - дело не в geoip!
В настоящий момент использую голый NGINX и 3 streams проброса голых на 4 уровне OSI TCP балансировщика. Без терминации на порты 143, 587,993.
Всё работает прекрасно и фильтрует через iptables по geoip. Но суть не в этом.
После того как я ставлю Docker в котором крутится NGINX Proxy Manage (Далее NPM) - всё работает тоже прекрасно.
Через вкладку streams сделал сырые пробросы на те же самые порты.
Но есть проблема, поскольку DOCKER создаёт кучу своих цепочек - по офф. документации нужно настраивать лишь цепочку DOCKER-USER.
Ну хорошо.
По умолчанию в цепочку DOCKER-USER лишь одно правило
-A DOCKER-USER -j RETURN
Что логично, если нет своих настроек то правила "ретёрнит" обратно в FORWARD и переходит в другие цепочки DOCKER и далее в DOCKER-ISOLATION.
Т. е. чтобы добавить свои правила разрещающие должны быть -j RETURN а запрещающие -j DROP
В самом конце должен быть -j RETURN чтобы те правила и порты которы не попали под правила DOCKER-USER шли дальше.
НО есть проблема.
При вот таких правилах в /etc/iptables/rules.v4
-A DOCKER-USER -m state --state RELATED,ESTABLISHED -j RETURN
-A DOCKER-USER -m state --state INVALID -j DROP
-A DOCKER-USER -p tcp -m tcp --dport 80 -m geoip --source-country RU,UA,US,BY,KZ,GE,AM,KG,NL,DE,SG,GB,FR,CA,IE,SE,PL -j RETURN
-A DOCKER-USER -p tcp -m tcp --dport 81 -s 192.168.0.0/16 -j RETURN
-A DOCKER-USER -p tcp -m tcp --dport 143 -m geoip --source-country RU,UA,BY,KZ -j RETURN
-A DOCKER-USER -p tcp -m tcp --dport 443 -m geoip --source-country RU,UA,US,BY,KZ,GE,AM,KG,NL,DE,SG,GB,FR,CA,IE,SE,PL -j RETURN
-A DOCKER-USER -p tcp -m tcp --dport 587 -m geoip --source-country RU,UA,BY,KZ -j RETURN
-A DOCKER-USER -p tcp -m tcp --dport 993 -m geoip --source-country RU,UA,BY,KZ -j RETURN
-A DOCKER-USER -p tcp -m tcp --dport 80 -m geoip ! --source-country RU,UA,US,BY,KZ,GE,AM,KG,NL,DE,SG,GB,FR,CA,IE,SE,PL -j DROP
-A DOCKER-USER -p tcp -m tcp --dport 81 ! -s 192.168.0.0/16 -j DROP
-A DOCKER-USER -p tcp -m tcp --dport 143 -m geoip ! --source-country RU,UA,BY,KZ -j DROP
-A DOCKER-USER -p tcp -m tcp --dport 443 -m geoip ! --source-country RU,UA,US,BY,KZ,GE,AM,KG,NL,DE,SG,GB,FR,CA,IE,SE,PL -j DROP
-A DOCKER-USER -p tcp -m tcp --dport 587 -m geoip ! --source-country RU,UA,BY,KZ -j DROP
-A DOCKER-USER -p tcp -m tcp --dport 993 -m geoip ! --source-country RU,UA,BY,KZ -j DROP
Правила действительно работают для того же 81 порта.
Но порты 143 587 и 993 работают неадекватно.
Когда этих правил нет - 143,587,993 работают через TCP и доступ до сервера есть
Когда я добавляю свои правила - те же самые порты работают по TCP/UDP - доступа до сервера нет
У меня сложилось впечатление что правила где-то либо застревают либо NPM+DOCKER не поддерживают то что я хочу либо тупо багулина.
П. С. В итоге сижу пока что на своём кастомном решении Nginx, всё равно у NPM нету нужно фичи DNS-01 Challenge для nic.ru, а ждать 2 года пока добавят лень....
П. П. С. Чувак с пандой на аватарке- пожалуйста не пиши всякую чушь. Советуя отключать iptables для docker ты ломаешь сам докер и сам принцип докера "для чего" его поднимают. Отсюда ты ломаешь масштабируемость.
Для джунов DevOps есть прекрасная документация по docker в которой ясно сказано что кастомные настройки нужно вносить в Docker-User не ломая цепочку Dockera (а это и ни к чему так как она дефолтна).