灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3947回复:0

linux网站服务器防SYN攻击另类新招

楼主#
更多 发布于:2011-11-09 15:36
今天早上一到公司登录公司官网的时候感觉挺慢,登录服务器查看官网访问情况:

[root@web ~]# netstat -anp |awk '{print $6}'|sort|uniq -c |sort -rn

172 ESTABLISHED

59 CONNECTED

589 SYN_RECV

15 STREAM

SYN居然这么高,继续追查是那些ip发出的SYN:

[root@tweb ~]# netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more

570 x.x.x.x

(ip就不写出了,是山东枣庄联通的一个ip),只是这一个ip就发出了这么多的syn请求连接,本来我们web服务器的并发数不是很高,这样一来正常的用户请求得不到相应,页面无法打开。因为硬件防火墙归集团IT部管理,我没有权限,所以只能在本地服务器上做些措施对SYN攻击进行部分减缓。

首先说一下SYN的攻击原理:

在TCP/IP协议中,

TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV

 

第三次握手:客户端收到服务器的SYNACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据.


图片:34_3710_f8e1ee7ef437066.jpg


如果用户与服务器发起连接请求只进行到第二次握手而不再响应服务器,服务器就会不停地等待用户的确认,如果过多这样的连接就会把服务器端的连接队列占满就会导致正常的用户无法建立连接。所以我们直接从SYN的连接上进行如下改动:

查看linux默认的syn配置:
[root@web ~]# sysctl -a | grep _syn
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 5
net.ipv4.tcp_syn_retries = 5

tcp_max_syn_backlogSYN队列的长度,加大
SYN队列长度可以容纳更多等待连接的网络连接数。tcp_syncookies是一个开关,是否打开SYN Cookie 功能,该功能可以防止部分SYN攻击。tcp_synack_retriestcp_syn_retries定义SYN 的重试连接次数,将默认的参数减小来控制SYN连接次数的尽量少。

以下是我修改后的参数,可以根据自己服务器的实际情况进行修改:
[root@web ~]# more /etc/rc.d/rc.local
#!/bin/sh
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local
ulimit -HSn 65535
/usr/local/apache2/bin/apachectl start
#####
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_synack_retries=3
sysctl -w net.ipv4.tcp_syn_retries=3
为了不重启服务器而使配置立即生效,可以执行

#sysctl -w net.ipv4.tcp_max_syn_backlog=2048
#sysctl -w net.ipv4.tcp_syncookies=1
#sysctl -w net.ipv4.tcp_synack_retries=3
#sysctl -w net.ipv4.tcp_syn_retries=3
也有的人喜欢用访问控制列表来防止SYN的攻击,在一定程度上减缓了syn的攻击:
Syn 洪水攻击
#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
# iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
#>iptables-save >/etc/sysconfig/iptables
进行查看,#iptables -L
ACCEPT     tcp  --  anywhere             anywhere            tcp flags:FIN,SYN,RST,ACK/SYN limit: avg 1/sec burst 5
ACCEPT     tcp  --  anywhere             anywhere            tcp flags:FIN,SYN,RST,ACK/RST limit: avg 1/sec burst 5
ACCEPT     icmp --  anywhere             anywhere            icmp echo-request limit: avg 1/sec burst 5
再次进行查看syn连接:
[root@web ~]# netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more
    20 10.92.10.220
     1 125.43.36.199

明显SYN连接数已经下来了。


喜欢0 评分0
游客

返回顶部