查看服务器是否被DDOS攻击的方法_宝塔服务器流量异常,如何查看出口ip(1)

avatar
作者
猴君
阅读量:2

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

A.CPU占用很高

B.netstat –na,若观察到大量的ESTABLISHED的连接状态 单个IP高达几十条甚至上百条,属于正常。
查看TCP端口连接数

查看网络连接总数 # netstat -an |wc -l  查看某个特定ip的连接数 # netstat -an |grep 8.8.8.8 |wc -l  查看连接数等待time_wait状态连接数 # netstat -an |grep TIME\_WAIT|wc -l  查看建立稳定连接数量 # netstat -an |grep ESTABLISHED |wc -l  查看不同状态的连接数 # netstat -an | awk '/^tcp/ {++y[$NF]} END {for(w in y) print w, y[w]}'  查看每个ip跟服务器建立的连接数 # netstat -nat|awk '{print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn (PS:正则解析:显示第5列,-F : 以:分割,显示列,sort 排序,uniq -c统计排序过程中的重复行,sort -rn 按纯数字进行逆序排序)  查看每个ip建立的ESTABLISHED/TIME_OUT状态的连接数 # netstat -nat|grep ESTABLISHED|awk '{print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn  

以下是我自己用VPS测试的结果:

root:~# netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n 1 114.226.9.xx 1 174.129.237.xx 1 58.60.118.xx 1 Address 1 servers) 2 118.26.131.xx 3 123.125.1.x  

在这里插入图片描述
每个IP几个、十几个或几十个连接数都还算比较正常,如果像上面成百上千肯定就不正常了。

上述所讲到的判断分析,让我们能准确的判断存在的问题是什么,怎么第一时间来解决问题。让我们能更好的维护我们的网站安全。

TCP洪水攻击检测

# tail -f /var/log/messages  Apr 18 11:21:56 web5 kernel: possible SYN flooding on port 80. Sending cookies.  

检查连接数增多,并且SYN_RECV 连接特别多:

检查连接数增多,并且SYN_RECV 连接特别多: # netstat -n awk '/^tcp/ { S[$NF]} END {for(a in S) print a, S[a]}'  TIME_WAIT 16855  CLOSE_WAIT 21  SYN_SENT 99  FIN_WAIT1 229  

根据经验,正常时检查连接数如下:

# netstat -n awk '/^tcp/ { S[$NF]} END {for(a in S) print a, S[a]}'  

在这里插入图片描述
根据netstat查看到的对方IP特征:

# netstat -na grep SYN\_RECV more  

在这里插入图片描述
以下配置,第一段参数是最重要的,第二段参数是辅助的,其余参数是其他作用的:

# vi /etc/sysctl.conf  net.ipv4.tcp_synack_retries=0  #半连接队列长度  net.ipv4.tcp_max_syn_backlog=200000  #系统允许的文件句柄的最大数目,因为连接需要占用文件句柄  fs.file-max=819200  #用来应对突发的大并发connect 请求  net.core.somaxconn=65536  #最大的TCP 数据接收缓冲(字节)  net.core.rmem_max=1024123000  #最大的TCP 数据发送缓冲(字节)  net.core.wmem_max=16777216  #网络设备接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目  net.core.netdev_max_backlog=165536  #本机主动连接其他机器时的端口分配范围  net.ipv4.ip_local_port_range=1000065535  

使配置生效:

# sysctl -p  注意,以下参数面对外网时,不要打开。因为副作用很明显,具体原因请google,如果已打开请显式改为0,然后执行sysctl -p关闭。因为经过试验,大量TIME_WAIT状态的连接对系统没太大影响:  #当出现 半连接 队列溢出时向对方发送syncookies,调大 半连接 队列后没必要  net.ipv4.tcp_syncookies=0  #TIME\_WAIT状态的连接重用功能  net.ipv4.tcp_tw_reuse=0  #时间戳选项,与前面net.ipv4.tcp_tw_reuse参数配合  net.ipv4.tcp_timestamps=0  #TIME\_WAIT状态的连接回收功能  net.ipv4.tcp_tw_recycle=0  

防御TCP洪水攻击方法

通过调整tcp参数来防范DDOS攻击
sysctl -a | grep syn 看到:SYN相关的配置
net.ipv4.tcp_max_syn_backlog = 1024

net.ipv4.tcp_syncookies = 0

net.ipv4.tcp_synack_retries = 5

net.ipv4.tcp_syn_retries = 5

tcp_max_syn_backlog是SYN队列的长度,tcp_syncookies是一个开关,是否打开SYN Cookie 功能,该功能可以防止部分SYN攻击。tcp_synack_retries和tcp_syn_retries定义SYN 的重试次数。加大SYN队列长度可以容纳更多等待连接的网络连接数,打开SYN Cookie功能可以阻止部分 SYN攻击,降低重试次数也有一定效果。
调整上述设置的方法是:

增加SYN队列长度到2048:

sysctl -w net.ipv4.tcp_max_syn_backlog=2048  

打开SYN COOKIE功能:

sysctl -w net.ipv4.tcp_syncookies=1  

降低重试次数:

sysctl -w net.ipv4.tcp_synack_retries=3  sysctl -w net.ipv4.tcp_syn_retries=3  

为了系统重启动时保持上述配置,可将上述命令加入到/etc/rc.d/rc.local文件中。

防止同步包洪水(Sync Flood)

# iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT  

也有人写作

#iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT  --limit 1/s 限制syn并发数每秒1次,可以根据自己的需要修改  

防止各种端口扫描

# iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT  

Ping洪水攻击(Ping of Death)

# iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT  

扩展

问题1:解决time_wait连接数大量问题

查询到time_wait连接数过多情况下,调整内核参数:/etc/sysctl.conf

# vim /etc/sysctl.conf 添加以下配置文件: net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 300  让配置生效 # /sbin/sysctl -p  参数详解: 1.net.ipv4.tcp_syncookies = 1 表示开启 syn cookies 。当出现 syn 等待队列溢出时,启用 cookies 来处理,可防范少量 syn \*\*\*,默认为 0 ,表示关闭;  2.net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将 time-wait sockets 重新用于新的 tcp 连接,默认为 0 ,表示关闭; 3.net.ipv4.tcp_tw_recycle = 1 表示开启 tcp 连接中 time-wait sockets 的快速回收,默认为 0 ,表示关闭。 4.net.ipv4.tcp_fin_timeout 修改系靳默认的 timeout 时间  

如果以上配置调优后性能还不理想,可继续修改一下配置:

# vim /etc/sysctl.conf net.ipv4.tcp_keepalive_time = 1200   #表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。 net.ipv4.ip_local_port_range = 1024 65000   #表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。 net.ipv4.tcp_max_syn_backlog = 8192   #表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。 net.ipv4.tcp_max_tw_buckets = 5000   #表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。 默认为180000,改为5000。 对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于 Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。  

问题2:ESTABLISHED连接数过大问题

怎么解决请求结束后依然存在大量ESTABLISHED没有被释放

初步推断是tomcat服务器回收session时出了问题,这个一般都跟服务器的Timeout设置有联系。

查看tomcat的配置文件 server.xml

Copy <Connector port="8080" protocol="HTTP/1.1"                connectionTimeout="20000"                redirectPort="8443" URIEncoding="UTF-8" /> \*\*\*\*\*  

检查配置得出20000毫秒的时候acceptCount=”100” ,明显不合理,最大连接数也太小了吧。

所以进一步优化:

  ![img](https://img-blog.csdnimg.cn/img_convert/3075b7077c0845b739ae89ca249e39fa.png) ![img](https://img-blog.csdnimg.cn/img_convert/fbbccc33301d6e26c2453f79213a592e.png) ![img](https://img-blog.csdnimg.cn/img_convert/2d985c8068784202d172a45228d4e4a0.png)  **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!**  **由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**  **[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**  转存中...(img-cCUg9Gg7-1715512403530)] [外链图片转存中...(img-KO2GAGtp-1715512403531)] [外链图片转存中...(img-Y0K47E6j-1715512403531)]  **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!**  **由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**  **[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**  

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!