网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事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)**