Docker容器间的iptables和fail2ban?

Docker容器间的iptables和fail2ban?

假设我有一个面向公众的 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 规则之前拒绝请求(允许所有请求)

相关内容