假设我有一个面向公众的 Nginx反向代理将流量发送到下游 Web 服务 (B) 的容器 (A)。这个 A 容器是 TLS 连接终止的地方。 Docker 服务器是还在外部反向代理服务后面。我是成功地能够从转发标头中提取并记录真实 IP。没问题。
如何配置fail2ban操作来监狱(例如DROP)来自真实IP退出容器A的流量?下游 Web 服务 B 将看到带有真实 IP 的 XFF 标头。
这是我的 iptables 现在正在做的事情 ( iptables -nL
):
Chain INPUT (policy ACCEPT)
target prot opt source destination
fail2ban-auth-fail tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
Chain FORWARD (policy ACCEPT)
target prot opt source destination
DOCKER-USER all -- 0.0.0.0/0 0.0.0.0/0
DOCKER-ISOLATION-STAGE-1 all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
DOCKER all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
DOCKER all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain DOCKER (2 references)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 172.20.128.1 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 172.20.128.1 tcp dpt:80
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target prot opt source destination
DOCKER-ISOLATION-STAGE-2 all -- 0.0.0.0/0 0.0.0.0/0
DOCKER-ISOLATION-STAGE-2 all -- 0.0.0.0/0 0.0.0.0/0
RETURN all -- 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-ISOLATION-STAGE-2 (2 references)
target prot opt source destination
DROP all -- 0.0.0.0/0 0.0.0.0/0
DROP all -- 0.0.0.0/0 0.0.0.0/0
RETURN all -- 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-USER (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
Chain fail2ban-auth-fail (1 references)
target prot opt source destination
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 STRING match "X-Forwarded-For: 184.75.215.178" ALGO name bm TO 65535
RETURN all -- 0.0.0.0/0 0.0.0.0/0
正如您所看到的,我已经尝试将数据包与 XFF 字符串进行匹配,并且该 IP 地址是真实 IP,而不是代理服务器。
也许 INPUT 链是罪魁祸首?
以下是我的主要行动:
actionstart = iptables -N fail2ban-<name>
iptables -A fail2ban-<name> -j RETURN
iptables -I <chain> -p <protocol> --dport <port> -j fail2ban-<name>
actionban = iptables -I fail2ban-<name> 1 -p tcp --dport 80 -m string --algo bm --string 'X-Forwarded-For: <ip>' -j DROP
答案1
看这里https://github.com/fail2ban/fail2ban/issues/2292
您需要配置fail2ban
以将iptables
规则放入chain
DOCKER-USER
- 或者您复制规则(像我一样) - 一个使用默认链来保护主机 - 另一个保护暴露的 docker 容器。
答案2
这帮助我解决了类似的问题。如果您设置 Crowdsec 或 failure2ban:
群控:
sudo iptables -I FORWARD -m set --match-set crowdsec-blacklists src -j DROP
对于fail2ban 类似的东西:
sudo iptables -I FORWARD 1 -p tcp -j f2b-HTTPS
事实上,fail2ban 在 iptables 中有它自己的“目标”,你可以通过以下命令找到它们:
sudo iptables -L | grep f2b
它将在 iptables 中的 Docker 规则之前放置一个条目,该条目将在请求到达 Docker 规则之前拒绝请求(允许所有请求)