我的 Linux 上的 Apache Web 服务器被大量针对不存在文件的请求淹没。直接影响是访问和错误日志的快速增长。我已经通过不记录这些请求(如果匹配特定字符串)来解决这个问题。我们说的是每秒 40 到 50 个请求来自多个 IP 地址(对于同一个文件)。
我最初认为这是一个僵尸网络,但我相信这是一些脚本小子在欺骗源 IP。我在服务器上运行 iptables,我想知道这些数据包是如何绕过 TCP/IP 初始握手到达应用程序层(HTTP 服务器)的?如果我有:
--Default Policy for INPUT chain is to DROP
<snip>
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
<...>
<snip>
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
...我的服务器在初始连接请求后响应的 SYN/ACK 是否应该发送到伪造的 IP?因此丢失了?如果数据包是伪造的,看起来像是来自已建立的连接,netfilter 的状态跟踪机制是否应该处理这个问题(通过上面的 RELATED、ESTABLISHED 行)并将它们识别为不是已建立会话的一部分,因此丢弃它们(通过默认策略:DROP)?
提前致谢,克拉科尼亚
pd 请求来自有效的互联网地址。
答案1
即使他们伪造了源 IP,也需要先进行 SYN/ACK TCP 握手才能连接到 Apache。这有效地防止了伪造的 TCP 连接。因此,您可以非常肯定所有连接都是从日志中看到的 IP 地址建立的。
僵尸网络或开放代理更有可能是罪魁祸首。或者是网页中某个地方的漏洞。一个典型的漏洞是在网站的 HTML 中嵌入指向 Web 服务器上大型对象的链接,使所有客户端都访问您的 Web 服务器,试图从您的服务器获取该对象……
您的 IPTABLES 规则现在确实有意义了 ;)
答案2
您的iptables
规则很好。在防火墙环境中,您实际上无能为力,只能确保您不会被使用源路由的人发现。Linux 内核中有一项名为rp_filter
(反向路径过滤器)的设置,您可以打开它来阻止指定源路由的数据包。由于源路由几乎从未在诊断环境之外使用,因此阻止此类数据包是安全的。
大多数 Linux 系统都有/etc/sysctl.conf
,其中包含内核设置。将以下几行添加到该文件:
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1
然后重新启动以确保这些变量已设置。或者,您可以在运行时通过常规方式在各个网络接口上设置它们,例如
echo 1 > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/eth1/rp_filter
...
或者
sysctl -w net.ipv4.conf.eth0.rp_filter=1
sysctl -w net.ipv4.conf.eth1.rp_filter=1
...
答案3
您是如何消除僵尸网络的可能性的?
攻击者是否可能使用IP 源路由?
来自上述网址
不幸的是,源路由经常被互联网(和其他地方)上的恶意用户滥用,并被用来使一台机器(A)认为它正在与另一台机器(B)通信,而实际上它正在与第三台机器(C)通信。这意味着 C 可以出于某些目的控制 B 的 IP 地址。
远程攻击者可能会试图访问受 TCP 包装程序保护的 UNIX 系统,或受基于源地址的访问列表保护的 Windows NT Internet 信息服务器 (IIS)。如果攻击者只是欺骗其中一个允许的源地址,攻击者可能永远不会得到响应。但是,如果攻击者同时欺骗地址并设置松散源路由选项强制将响应返回到攻击者的网络,攻击即可成功。
(我强调)