работает на Rocky Linux 9.2 с podman 4.4.1. У меня есть Pod podman с keycloak + postgresql внутри, работающий без прав root. Сам pod с --network 'slirp4netns:port_handler=slirp4netns'
. Контейнер keycloak работает с , --log-driver json-file --log-opt path=/var/log/keycloak.log
поэтому у меня есть файл журнала на самой хостовой системе. Также есть прокси-сервер traefik, делающий keycloak доступным, ssl terminate на traefik + ssl terminate на самом keycloak.
Пока все работает, я вижу в журналах реальный IP-адрес пользователя, пытающегося войти. Fail2ban запущен на хост-системе, регулярное выражение также работает и блокирует правильный IP-адрес, НО даже несмотря на то, что IP заблокирован (я вижу это в fail2ban-client status keycloak
), пользователь все еще может продолжать отправлять логины.
/etc/fail2ban/jail.d/keycloak.local
[keycloak]
backend = auto
enabled = true
filter = keycloak
maxretry = 3
bantime = 86400
findtime = 86400
logpath = /var/log/keycloak.log
action = iptables-allports[name=keycloak]
Итак, до запрета iptables пуст:
iptables -n -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
После запрета:
iptables -n -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
f2b-keycloak tcp -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain f2b-keycloak (1 references)
target prot opt source destination
REJECT all -- xx.xx.xx.xx 0.0.0.0/0 reject-with icmp-port-unreachable
RETURN all -- 0.0.0.0/0 0.0.0.0/0
Я также читал что-то о том, что Docker использует цепочку FORWARD, поэтому я установил action = iptables-allports[name=keycloak, protocol=all, chain=FORWARD]
файл jail keycloak, тогда iptables имел правило в цепочке FORWARD, но оно все равно не работало. То же самое поведение, что и при использовании настройки по умолчанию (в цепочке INPUT).
Как заставить контейнер podman без root подчиняться запрету ip из iptables? Есть идеи?
решение1
Fail2ban работает (по умолчанию) на уровне брандмауэра, который, в свою очередь, работает на уровне IP.
Учитывая ваши настройки, весь трафик ретранслируется внешним экземпляром Traefik, IP-адрес которого является единственным, с которым можно связаться с Keycloak, что означает, что брандмауэр может либо заблокировать этот IP-адрес, либо разрешить его.
Если вы хотите заблокировать некорректно работающие IP-адреса, вам необходимо заблокировать их на хосте Traefik (с учетом предоставленной вами информации).
решение2
Возня с fail2ban и заголовком X-Forwarded-For не будет удовлетворительным решением. Я решил это с помощью подхода API opnsense. Краткое резюме:
- создал пользователя (ключ API) с разрешениями для alias_util и конечных точек состояний брандмауэра диагностики.
- создал псевдоним
ipv4_blacklist
типа Внешний (расширенный) - создал правило брандмауэра wan для блокировки всего из источника
ipv4_blacklist
- создано пользовательское действие keycloak с использованием
actionban
иactionunban
для actionban
вас нужны две команды:
- Добавление указанного IP в черный список через
api/firewall/alias_util/add/ipv4_blacklist
- Завершение активных сеансов с помощью
api/diagnostics/firewall/kill_states
, поэтому действие запрета вступает в силу немедленно
для actionunban
одной команды достаточно:
- Просто удалите указанный IP через
api/firewall/alias_util/delete/ipv4_blacklist