在我们的服务器上运行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
答案1
现在你终于发布了netstat
有问题的输出(谢谢你),我们可以看到它所拾取的连接几乎肯定不是从正如您所想的那样,远程服务器正在努力发起连接到远程服务器的端口 443(HTTPS)。这就是为什么它们没有被INPUT
链式规则阻止;第一个数据包是出站- 只有远程服务器生成的响应才会被规则阻止INPUT
,保持连接SYN_SENT
直至超时。
使用netstat -apn
表明,您系统上的 HTTPD 服务器正在建立这些连接。您不知道您的服务器为什么要这样做,所以您要仔细检查一下它的设置。
答案2
iptables -L -nv
如果规则匹配,您可以使用它来排除故障。您将在第一列中看到pkts
与每条规则匹配的数据包数量。
如果您的规则不匹配,则可能是因为它先前已被另一个防火墙条目(规则)匹配。
答案3
确保使用iptables -I INPUT (...)
该rulenum
参数运行。您要确保将此规则插入到任何-j ACCEPT
http 端口规则之前。此参数的默认值为 1,因此它应该已经位于顶部。
iptables -nvL --line-numbers
将打印出您当前的 iptables 以及规则编号。
$ iptables -nvL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 52 2640 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
2 0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:443
3 415 42229 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
运行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
上面给出的值进行过滤。如果系统日志中显示此信息,则您的过滤器是有效的,应该会丢弃流量。
您可以在 iptables 规则中保留LOG
和DROP
行(按此顺序)。