Day33-计算机基础3
- 1.根据TCP/IP进行Linux内核参数优化
- 1.1 例1:调整访问服务端的【客户端】的动态端口范围 ,LVS(10-50万并发),NGINX负载,SQUID缓存服务,
- 1.2 企业案例:DOS攻击的案例:
- 1.3 例2:#全/半连接队列
- 1.4 TCP超时重传
- 1.5 拥塞控制
- 2. 内核TCP参数优化
- 2.1 参看帮助: man tcp
- 2.2 企业案例:TIME_WAIT过多故障,如何解决?
#抓取所有经过eth0,目的地址是10.0.0.128,端口是22的TCP数
tcpdump -i eth0 '((tcp) and (port 22) and (dst host 10.0.0.128))'
wireshark
CLOSING 状态表示:客户端发送了 FIN,但没有收到服务器的 ACK,却收到了服务器的 FIN。
这种情况发生在服务器发送的 ACK 丢包的时候,因为网络传输有时会有意外。
1.根据TCP/IP进行Linux内核参数优化
1.1 例1:调整访问服务端的【客户端】的动态端口范围 ,LVS(10-50万并发),NGINX负载,SQUID缓存服务,
[root@oldboy ~]# cat /proc/sys/net/ipv4/ip_local_port_range
32768 60999
[root@oldboy ~]# echo 4000 65000 > /proc/sys/net/ipv4/ip_local_port_range
[root@oldboy ~]# cat /proc/sys/net/ipv4/ip_local_port_range
4000 65000
DOS/SYN攻击
链接: https://baike.baidu.com/item/dos%E6%94%BB%E5%87%BB/3792374?fr=aladdin
1.2 企业案例:DOS攻击的案例:
SYN洪水攻击属于DoS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。、
1.3 例2:#全/半连接队列
#半连接
/proc/sys/net/ipv4/tcp_max_syn_backlog #syn连接池队列大小
[root@oldboy ~]# echo 8192 >/proc/sys/net/ipv4/tcp_max_syn_backlog
[root@oldboy ~]# cat /proc/sys/net/ipv4/tcp_max_syn_backlog
8192
#全连接
/proc/sys/net/core/somaxconn #完成连接队列大小,默认值128,建议调整大小为1024以上
[root@oldboy ~]# echo 512 >/proc/sys/net/core/somaxconn
[root@oldboy ~]# cat /proc/sys/net/core/somaxconn
512
超时连接
Linux为了防止孤儿连接长时间存留在内核中的两个内核参数:
[root@oldboy ~]# cat /proc/sys/net/ipv4/tcp_max_orphans
16384
[root@oldboy ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout
60
[root@oldboy ~]# echo 2 > /proc/sys/net/ipv4/tcp_fin_timeout
[root@oldboy ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout
2
1.4 TCP超时重传
异常网络状况下(开始出现超时或丢包),TCP控制数据传输以保证其承诺的可靠服务TCP服务必须能够重传超时时间内未收到确认的TCP报文段。为此,TCP模块为每个TCP报文段都维护一个重传定时器,该定时器在TCP报文段第一次被发送时启动。如果超时时间内未收到接收方的应答,TCP模块将重传TCP报文段并重置定时器。至于下次重传的超时时间如何选择,以及最多执行多少次重传,就是TCP的重传策略。
与TCP超时重传相关的两个内核参数:
#指定在底层IP接管之前TCP最少执行的重传次数,默认值是3
#cat /proc/sys/net/ipv4/tcp_retries1
3
#指定连接放弃前TCP最多可以执行的重传次数,默认值15(一般对应13~30min)
#cat /proc/sys/net/ipv4/tcp_retries2
15
1.5 拥塞控制
网络中的带宽、交换结点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可承受的能力,网络的性能就会变坏。此情况称为拥塞TCP为提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性。即所谓的拥塞控制TCP拥塞控制的标准文档是RFC 5681,
拥塞控制的四个部分:
- 慢启动(slow start)
- 拥塞避免(congestion avoidance)
- 快速重传(fast retransmit)
- 快速恢复(fast recovery)。
拥塞控制算法在Linux下有多种实现,比如reno算法、vegas算法和cubic算法等。
当前所使用的拥塞控制算法
/proc/sys/net/ipv4/tcp_congestion_control
2. 内核TCP参数优化
2.1 参看帮助: man tcp
编辑文件/etc/sysctl.conf,加入以下内容:然后执行sysctl -p让参数生效。
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_max_orphans = 16384
net.ipv4.ip_local_port_range = 2000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.core.somaxconn = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.route.gc_timeout = 100
net.core.netdev_max_backlog = 16384
作用说明:
- net.ipv4.tcp_tw_reuse 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认值为0,表示关闭。
该参数对应系统路径为:/proc/sys/net/ipv4/tcp_tw_reuse 0
- net.ipv4.tcp_tw_recycle 表示开启TCP连接中TIME-WAIT sockets的快速回收。该参数对应系统路径为:/proc/sys/net/ipv4/tcp_tw_recycle,默认为0,表示关闭。
提示:reuse和recycle这两个参数是为防止生产环境下Web、Squid等业务服务器time_wait网络状态数量过多设置的
- net.ipv4.tcp_syncookies 表示开启SYN Cookies功能。当出现SYN等待队列溢出时,启用Cookies来处理,可防范少量SYN攻击。
该参数对应系统路径为:/proc/sys/net/ipv4/tcp_syncookies,默认值为1
- net.ipv4.ip_local_port_range 该选项用来设定允许系统打开的端口范围,即用于向外连接的端口范围。
该参数对应系统路径为:/proc/sys/net/ipv4/ip_local_port_range 32768 61000
- net.ipv4.tcp_max_syn_backlog 表示SYN队列的长度,即半连接队列长度,默认为1024。该参数为服务器端用于记录那些尚未收到客户端确认信息的连接请求最大值。该参数对象系统路径为:/proc/sys/net/ipv4/tcp_max_syn_backlog
- net.ipv4.tcp_max_tw_buckets 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数值,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,对于Nginx等服务器来说可以将其调低一点,如改为5000~30000,不通业务的服务器也可以给大一点,比如LVS、Squid。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。该参数对应系统路径为:/proc/sys/net/ipv4/tcp_max_tw_buckets
- net.ipv4.tcp_synack_retries 参数的值决定了内核放弃连接之前发送SYN+ACK包的数量。该参数对应系统路径为:/proc/sys/net/ipv4/tcp_synack_retries,默认值为5
- net.ipv4.tcp_syn_retries 表示在内核放弃建立连接之前发送SYN包的数量。该参数对应系统路径为:/proc/sys/net/ipv4/tcp_syn_retries,默认值为6
- net.ipv4.tcp_max_orphans 用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数值,孤立连接将被立即被复位并打印出警告信息。这个限制只有为了防止简单的DoS攻击。不能过分依靠这个限制甚至认为减少这个值,更多的情况是增加这个值。该参数对应系统路径为:/proc/sys/net/ipv4/tcp_max_orphans ,默认值8192
- net.core.somaxconn 同时发起的TCP的最大连接数,即全连接队列长度,在高并发请求中,可能会导致链接超时或重传,一般结合并发请求数来调大此值。该参数对应系统路径为:/proc/sys/net/core/somaxconn ,默认值是128
- net.core.netdev_max_backlog 表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包最大数。该参数对应系统路径为:/proc/sys/net/core/netdev_max_backlog,默认值为1000
2.2 企业案例:TIME_WAIT过多故障,如何解决?
LVS、Squid、Nginx这些软件本身服务,能够承受大并发。
基础解决:
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
修改配置文件:/etc/sysctl.conf (原内容保存)
vm.swappiness = 10
##swappiness的值的大小对如何使用swap分区是有着很大的联系的。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。两个极端,对于 centos linux 5的默认设置,这个值等于60,建议修改为10。
net.ipv4.tcp_syncookies = 1
##表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout = 30
#表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
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_tw_buckets = 5000
##表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,
##TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。
##对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,
##但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。
net.ipv4.tcp_mem = 786432 1048576 1572864
##有3个值,意思是:
##net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力.
##net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段.
##net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket
net.core.wmem_max = 873200
##最大socket写buffer,可参考的优化值:873200
net.core.rmem_max = 873200
##最大socket读buffer,可参考的优化值:873200
net.ipv4.tcp_wmem = 8192 436600 873200
##TCP写buffer,可参考的优化值: 8192 436600 873200
net.ipv4.tcp_rmem = 32768 436600 873200
##TCP读buffer,可参考的优化值: 32768 436600 873200
net.core.somaxconn = 256
##listen()的默认参数,挂起请求的最大数量.默认是128.对繁忙的服务器,增加该值有助于网络性能.
可调整到256.
net.core.netdev_max_backlog = 1000
##进入包的最大设备队列.默认是300,对重负载服务器而言,该值太低,可调整到1000.
net.ipv4.tcp_max_syn_backlog = 2048
##进入SYN包的最大请求队列.默认1024.对重负载服务器,增加该值显然有好处.
可调整到2048.
net.ipv4.tcp_retries2 = 5
##TCP失败重传次数,默认值15,意味着重传15次才彻底放弃.可减少到5,以尽早释放内核资源.
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
##意思是如果某个TCP连接在idle 30个分钟后,内核才发起probe.如果probe 3次(每次75秒)不成功,内核才彻底放弃,认为该连接已失效.
net.ipv4.conf.lo.arp_ignore = 0
net.ipv4.conf.lo.arp_announce = 0
net.ipv4.conf.all.arp_ignore = 0
net.ipv4.conf.all.arp_announce = 0
##NAT模式下的打开ARP广播响应