使用 podman 4.4.1 在 Rocky Linux 9.2 上運行。我有一個 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監獄文件中設置了,iptables然後在FORWARD鏈中設置了規則,但它仍然不起作用。與使用預設設定(在 INPUT 鏈中)時的行為相同。
如何讓無根 podman 容器遵守 iptables 的 ip 禁令?有任何想法嗎?
答案1
Fail2ban(預設)在防火牆層級工作,而防火牆本身在 IP 層級工作。
根據您的設置,所有流量均由外部 Traefik 執行個體中繼,該執行個體的 IP 是唯一聯繫 Keycloak 的 IP,這表示防火牆可以阻止該 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