Linux系统内核相关参数调优

  • Linux系统内核相关参数调优

        SYN攻击是利用TCP/IP协议3次握手的原理,发送大量的建立连接的网络包,但不实际建立连接,最 终导致被攻击服务器的网络队列被占满,无法被正常用户访问。

        SYN Flood是当前最流行的DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)的方式之一,这 是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,常用假冒的IP或IP号段发来的海量请求连接的 第一个握手包(SYN包),被攻击服务器回应第二个握手包(SYN+ACK包),因为对方是假冒IP,对方 永远收不到包且不会回应第三个握手包。导致被攻击服务器保持大量SYN_RECV状态的“半连接”,并且 会重试默认5次回应第二个握手包,塞满TCP等待连接队列,资源耗尽(CPU满负荷或内存不足),让正 常的业务请求连接不进来。 解决方案如下:

vim /etc/sysctl.conf

net.ipv4.tcp_synack_retries = 0
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_max_syn_backlog = 20480
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 10
fs.file-max = 819200 net.core.somaxconn = 65535
net.core.rmem_max = 1024123000
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 165536
net.ipv4.ip_local_port_range = 10000 65535

  • 内核重要参数解说
cat /proc/sys/net/ipv4/tcp_synack_retries #最关键参数,默认为5, 修改为0 表示不要重发

net.ipv4.tcp_synack_retries = 0

# 表示回应第二个握手包(SYN+ACK包)给客户端IP后,如果收不到第三次握手包(ACK包)后, 不进行重试,加快回收“半连接”,不要耗光资源。

# 作为服务端。回应时,如果连接失败,达到对应的失败数后,停止发送synack包 第一个参数tcp_synack_retries = 0是关键,表示回应第二个握手包(SYN+ACK包)给客户端IP后, 如果收不到第三次握手包(ACK包)后,不进行重试,加快回收“半连接”,不要耗光资源。

不修改这个参数,模拟攻击,10秒后被攻击的80端口即无法服务,机器难以ssh登录; 用命令 netstat -na |grep SYN_RECV检测“半连接”hold住180秒; 修改这个参数为0,再模拟攻击,持续10分钟后被攻击的80端口都可以服务,响应稍慢些而已,只是 ssh有时也登录不上;检测“半连接”只hold住3秒即释放掉。

修改这个参数为0的副作用:网络状况很差时,如果对方没收到第二个握手包,可能连接服务器失败, 但对于一般网站,用户刷新一次页面即可。这些可以在高峰期或网络状况不好时tcpdump抓包验证下。

根据以前的抓包经验,这种情况很少,但为了保险起见,可以只在被tcp洪水攻击时临时启用这个参数。 tcp_synack_retries默认为5,表示重发5次,每次等待30~40秒,即“半连接”默认hold住大约180 秒。

我们之所以可以把tcp_synack_retries改为0,因为客户端还有tcp_syn_retries参数,默认是5,即 使服务器端没有重发SYN+ACK包,客户端也会重发SYN握手包。

 cat /proc/sys/net/ipv4/tcp_syn_retries

1

#tcp_syn_retries参数,默认是5,当没有收到服务器端的SYN+ACK包时,客户端重发SYN握手包 的次数。

cat /proc/sys/net/ipv4/tcp_max_syn_backlog

20480

##半连接队列长度,增加SYN队列长度到2048:加大SYN队列长度可以容纳更多等待连接的网络连 接数,具体多少数值受限于内存。

11.4.3 辅助参数

#系统允许的文件句柄的最大数目,因为连接需要占用文件句柄

fs.file-max = 819200

#用来应对突发的大并发connect 请求

net.core.somaxconn = 65535

#最大的TCP 数据接收缓冲(字节)

net.core.rmem_max = 1024123000

#最大的TCP 数据发送缓冲(字节)

net.core.wmem_max = 16777216

#网络设备接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目

net.core.netdev_max_backlog = 165536

#本机主动连接其他机器时的端口分配范围,比如说,在vsftpd主动模式会用到

net.ipv4.ip_local_port_range = 10000 65535

注:如果只是开启22端口,是不会使用到ip_local_port_range这个功能

netstat -antup | grep :22

为了处理大量连接,还需改大另外两个参数:

限制用户资源配置文件:/etc/security/limits.conf

vim /etc/security/limits.conf #在最后添加:

* soft nofile 1024000

* hard nofile 1024000

例2:nproc #用户可以打开的最大进程数

vim /etc/security/limits.d/90-nproc.conf #RHEL6 必须这个文件 中配置 改:

* soft nproc 10240 为:

* soft nproc 66666

* hard nproc 66666

  • ## reboot #最好重启一下

11.4.3 次要辅助参数

以上还无法解决syn洪水攻击,把以下内核参数关闭:

注意,以下参数面对外网时,不要打开。因为副作用很明显。

#当出现 半连接 队列溢出时向对方发送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

cat /proc/sys/net/ipv4/tcp_syncookies

1

#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击, 默认为0,表示关闭;

cat /proc/sys/net/ipv4/tcp_tw_reuse

1

#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭,现在开 启,改为1

cat /proc/sys/net/ipv4/tcp_tw_recycle

1

#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。现在改为1,表示开 启

cat /proc/sys/net/ipv4/tcp_fin_timeout

30

#默认值是 60,对于本端断开的socket连接,TCP保持在FIN_WAIT_2状态的时间。

==========================================

配置 Linux 内核参数修改后不用重启动更新:  /sbin/sysctl -p

sysctl -a                                           # 可以查询到所有的变量

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

の正在缓存99%

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值