在我们的服务器上运行top
给了我们
平均负载:68.67、63.48、60.30
我们怀疑这是由于太多的 httpd 连接造成的。
跑步:
netstat -tun 2>/dev/null | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
给我们(所有 IP 转换为私有地址):
418
176 192.168.1.1
41 192.168.1.2
8 192.168.1.3
5 192.168.1.4
5 192.168.1.5
4 192.168.1.6
2 192.168.1.7
2 192.168.1.8
2 192.168.1.9
2 127.0.0.1
1 servers)
1 Address
1 192.168.1.10
1 192.168.1.11
正如您所看到的192.168.1.1
(从 WAN 地址转换而来,仅用于此处),它似乎有 176 个连接到我们的服务器。远程查找此 IP 可将其重新解析为 DDOS 服务。
我们跑了
sudo iptables -I INPUT -m iprange --src-range 192.168.0.0-192.168.0.255 -j DROP
尝试删除与其完整范围相关的所有范围,但在运行 netstat 命令时仍会显示请求。
IPtables 命令或 netstat 命令有问题吗?
我们跑
sudo service iptables save
sudo service httpd restart
存储它并使其处于活动状态,然后
sudo iptables --list
确认它已添加,它是。不确定我们是否缺少某些东西。谢谢。
更新
跑步iptables -L -nv
节目
pkts bytes target prot opt in
30179 1793K DROP all -- * * 0.0.0.0/0 0.0.0.0/0 source IP range STARTRANGE-ENDRANGE
这是否意味着30179
请求被阻止?
我们的 IPtables 也看起来像这样(STARTRANGE/ENDRANGE 是实际的四字节地址)...
Chain INPUT (policy DROP)
target prot opt source destination
DROP all -- anywhere anywhere source IP range STARTRANGE-ENDRANGE
DROP all -- anywhere anywhere source IP range STARTRANGE-ENDRANGE
DROP all -- anywhere anywhere source IP range STARTRANGE-ENDRANGE
ACCEPT tcp -- anywhere anywhere tcp dpt:http
ACCEPT tcp -- anywhere anywhere tcp dpt:https
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:mysql
DROP all -- anywhere anywhere source IP range STARTRANGE-ENDRANGE
缩短的 Netstat 输出(命令运行:)netstat -n | grep '192.168'
:
tcp 0 1 OUR_SERVER_IP:44531 192.168.1.1:443 SYN_SENT
tcp 0 1 OUR_SERVER_IP:44675 192.168.1.1:443 SYN_SENT
tcp 0 1 OUR_SERVER_IP:44600 192.168.1.1:443 SYN_SENT
tcp 0 1 OUR_SERVER_IP:44587 192.168.1.1:443 SYN_SENT
tcp 0 1 OUR_SERVER_IP:44641 192.168.1.1:443 SYN_SENT
tcp 0 1 OUR_SERVER_IP:44578 192.168.1.1:443 SYN_SENT
tcp 0 1 OUR_SERVER_IP:44626 192.168.1.1:443 SYN_SENT
tcp 0 1 OUR_SERVER_IP:44604 192.168.1.1:443 SYN_SENT
tcp 0 1 OUR_SERVER_IP:44541 192.168.1.1:443 SYN_SENT
tcp 0 1 OUR_SERVER_IP:44678 192.168.1.1:443 SYN_SENT
tcp 0 1 OUR_SERVER_IP:44625 192.168.1.1:443 SYN_SENT
tcp 0 1 OUR_SERVER_IP:44661 192.168.1.1:443 SYN_SENT
tcp 0 1 OUR_SERVER_IP:44543 192.168.1.1:443 SYN_SENT
tcp 0 1 OUR_SERVER_IP:44602 192.168.1.1:443 SYN_SENT
tcp 0 1 OUR_SERVER_IP:44644 192.168.1.1:443 SYN_SENT
tcp 0 1 OUR_SERVER_IP:44580 192.168.1.1:443 SYN_SENT
tcp 0 1 OUR_SERVER_IP:44688 192.168.1.1:443 SYN_SENT
tcp 0 1 OUR_SERVER_IP:44683 192.168.1.1:443 SYN_SENT
tcp 0 1 OUR_SERVER_IP:44588 192.168.1.1:443 SYN_SENT
tcp 0 1 OUR_SERVER_IP:44556 192.168.1.1:443 SYN_SENT
tcp 0 1 OUR_SERVER_IP:44681 192.168.1.1:443 SYN_SENT
tcp 0 1 OUR_SERVER_IP:44631 192.168.1.1:443 SYN_SENT
现在您终于发布了
netstat
有问题的输出(感谢您),我们可以看到它获取的连接几乎肯定不是来自远程服务器,正如您所想的那样。相反,您的服务器正努力在端口 443 (HTTPS) 上启动与该远程服务器的连接。这就是为什么他们没有被INPUT
链式规则阻止的原因;第一个数据包是出站的 - 只有远程服务器生成的响应被INPUT
规则阻止,连接SYN_SENT
一直保持到超时。的使用
netstat -apn
表明,建立这些连接的是系统上的 HTTPD 服务器。您不知道您的服务器应该这样做的任何原因,因此您将离开仔细研究它的设置。iptables -L -nv
如果规则匹配,您可以使用它进行故障排除。您将在第一列pkts
中看到匹配每个规则的数据包数量。如果您的规则不匹配,则可能是它之前已被另一个防火墙条目(规则)匹配。
确保
iptables -I INPUT (...)
使用rulenum
参数运行。您要确保-j ACCEPT
在 http 端口的任何规则之前插入此规则。此参数的默认值为 1,因此它应该已经在顶部。iptables -nvL --line-numbers
将打印出您当前的 iptables 以及规则的编号。运行
iptables -I INPUT 2 <your-rule-here>
将在输出中的规则 #2 之前添加规则,将其推入表格中。iptables -I INPUT -m iprange --src-range 192.168.0.0-192.168.0.255 -j LOG --log-prefix "BADGUYS"
您可以用而不是替换您的规则-j DROP
。这会将日志数据写入系统日志,您可以在其中按BADGUYS
上面给出的值进行过滤。如果这显示在 syslog 中,那么您的过滤器是好的,应该丢弃流量。您可以在 iptables 规则中同时保留 a
LOG
和DROP
一行(按此顺序)。