iptables 无法与“x-forwarded-for”配合使用(Cloudflare 背后)

iptables 无法与“x-forwarded-for”配合使用(Cloudflare 背后)

我有一个在 Cloudflare 后面运行的 Web 服务器(Ubuntu 和 Apache)。我想使用 iptables 阻止用户。在这里,我想实现 iptables 的字符串匹配扩展,并在以下情况下断开连接:x-转发-for匹配。我使用以下命令添加规则:

iptables -I INPUT -m string --string "x-forwarded-for: 216.244.66.205" --algo bm --to 65535 -j DROP

添加此规则后,客户端仍然能够访问服务器。

我知道 Cloudflare 针对客户端 IP 的特定标头是cf-连接-ip。如果我使用以下命令添加规则,它会按预期工作。以下是运行良好的规则:

iptables -I INPUT -m string --string "cf-connecting-ip: 216.244.66.205" --algo bm --to 65535 -j DROP

为什么我要使用 XFF 而不是cf-连接-ip

我有一个单独的负载均衡器 (haproxy),一些域通过它而不是 Cloudflare 运行。这就是我想使用 XFF 的原因,因为cf-连接-ip是 Cloudflare 所特有的,并且两者都支持 XFF。

从 Cloudflare 到 Web 服务器的流量是 HTTP(端口 80),因此 http 数据对于 iptables 来说是可见的。

我可以看到 Cloudflare 正确地连接了两者cf-连接-ip和 XFF 标头。以下是多个请求中的 tcpdump 输出:

tcpdump -A -s 65535 'tcp port 80' | grep 216.244.66.205
x-forwarded-for: 216.244.66.205
cf-connecting-ip: 216.244.66.205
x-forwarded-for: 216.244.66.205
cf-connecting-ip: 216.244.66.205
x-forwarded-for: 216.244.66.205
cf-connecting-ip: 216.244.66.205
x-forwarded-for: 216.244.66.205
cf-connecting-ip: 216.244.66.205

iptables 能够检测到cf-连接-ip但不是x-转发-for

我在这里做错了什么?

答案1

字符串匹配针对单个IP数据包的有效负载进行操作。

因此,一个可能的原因是报头的位置x-forwarded-for:恰好位于两个 TCP 段的边界上。因此第一个 IP 数据包可能包含x-forw第二个 IP 数据包arded-for:。然后string匹配模块不匹配任何一个数据包。

要检查是否是这个原因,请查看属于该连接的不同 IP 数据包有效负载,并查看 TCP 段如何拆分为 IP 数据包。

最好在 HTTP 级别实现这样的块功能。

相关内容