![无根 podman keycloak 容器主机上的 fail2ban](https://linux22.com/image/789082/%E6%97%A0%E6%A0%B9%20podman%20keycloak%20%E5%AE%B9%E5%99%A8%E4%B8%BB%E6%9C%BA%E4%B8%8A%E7%9A%84%20fail2ban.png)
在 Rocky Linux 9.2 上运行,使用 podman 4.4.1。我有一个 podman Pod,里面有 keycloak + postgresql,以无根方式运行。pod 本身带有--network 'slirp4netns:port_handler=slirp4netns'
。keycloak 容器正在运行,--log-driver json-file --log-opt path=/var/log/keycloak.log
因此我在主机系统本身上有日志文件。还有一个 traefik 代理使 keycloak 可访问,traefik 上的 ssl 终止 + keycloak 本身上的 ssl 终止。
到目前为止一切正常,我在日志中看到了尝试登录的用户的真实 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]
在 keycloak jail 文件中进行了设置,iptables 随后在 FORWARD 链中设置了规则,但仍然不起作用。与使用默认设置(在 INPUT 链中)时的行为相同。
如何让无根 podman 容器遵守 iptables 的 ip 禁令?有什么想法吗?
答案1
Fail2ban(默认情况下)在防火墙级别工作,而防火墙级别本身在 IP 级别工作。
根据您的设置,所有流量都由外部 Traefik 实例中继,该实例的 IP 是唯一与 Keycloak 联系的 IP,这意味着防火墙可以阻止该 IP 或允许它。
如果您想阻止行为不端的 IP,则需要在 Traefik 主机上阻止它们(根据您提供的信息)。
答案2
摆弄 fail2ban 和 X-Forwarded-For 标头并不是一个令人满意的解决方案。我使用 opnsense API 方法解决了这个问题。快速摘要:
- 创建了一个具有 alias_util 和诊断防火墙状态端点权限的用户(api 密钥)。
ipv4_blacklist
创建了外部类型的别名(高级)- 创建了防火墙 WAN 规则来阻止来自源头的所有内容
ipv4_blacklist
actionban
使用并创建keycloak自定义操作actionunban
因为actionban
你需要两个命令:
- 通过以下方式将给定的 IP 添加到黑名单
api/firewall/alias_util/add/ipv4_blacklist
- 通过终止活动会话
api/diagnostics/firewall/kill_states
,因此禁止操作立即生效
一个actionunban
命令就足够了:
- 只需通过以下方式删除给定的 IP
api/firewall/alias_util/delete/ipv4_blacklist