apache 为什么iptables不能使用x-forwarded-for进行字符串匹配?

qco9c6ql  于 2022-11-16  发布在  Apache
关注(0)|答案(2)|浏览(214)

我有一个在Cloudflare后面的Ubuntu上运行Apache的Web服务器。我想阻止一个用户使用Web服务器的iptables。在这里我想实现iptables的字符串匹配功能并丢弃连接。下面是我的规则,但不起作用:

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

添加此规则后,客户端仍然能够访问服务器。
我知道Cloudflare的客户端IP的特定标头是cf-connecting-ip。我可以用它来阻止客户端。下面是工作正常的规则:

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

从Cloudflare到Web服务器的流量是HTTP(端口80)。
我有一个负载平衡器(haproxy),一些域通过它运行,而不是Cloudflare。这就是为什么我想使用XFF,因为cf-connecting-ip是特定于Cloudflare的,两者都支持XFF。
我可以看到Cloudflare正确地附加了cf-connecting-ip和XFF头文件。
第一次
不知何故,iptables能够检测到字符串cf-connecting-ip,但不能检测到x-forwarded-for
任何帮助都将不胜感激。

91zkwejq

91zkwejq1#

HTTP标头位于应用层,而IPTables位于TCP/IP堆栈的下层。IPTables看不到您要筛选的数据。
对于Cloudflare背后的网站,您应该配置IPTables,使其仅允许Cloudflare IP地址通过,并使用Cloudflare防火墙阻止客户端IP地址。

tjvv9vkg

tjvv9vkg2#

回答自己的问题,希望它能帮助别人。
该问题是由于字母大小写的差异造成的。服务器以不同的方式传递字母,与提供的字母不匹配。
我只需要添加一个额外的选项--icase,它忽略大小写(不区分大小写的匹配)。
现在的命令是:

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

相关问题