SYN攻击的原理,攻击工具,以及防护手段/使用iptables应对SYN攻击、CC攻击、ACK攻击

本文介绍SYN攻击原理及防御手段,包括iptables配置、系统参数调整等,并提供针对ACK攻击和CC攻击的防护策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SYN攻击的原理,攻击工具,以及防护手段/使用iptables应对SYN攻击、CC攻击、ACK攻击



三次握手的过程及相关概念
TCP/IP协议使用三次握手来建立连接,过程如下:
1、第一次握手,客户端发送数据包syn到服务器,并进入SYN_SEND状态,等待回复
2、第二次握手,服务器发送数据报syn/ack,给客户机,并进入SYN_RECV状态,等待回复
3、第三次握手,客户端发送数据包ACK给客户机,发送完成后,客户端和服务器进入ESTABLISHED状态,链接建立完成


三次握手协议中,服务器维护一个等待队列,收到一个syn包就在队列中建立一个条目,并分配一定的资源。对应的每一个条目表示已经收到一个syn请求,并已经回复syn/ack,服务器上对应的连接已经进入SYN_RECV状态,等待客户端响应,收到客户端的响应包以后,该连接进入ESTABLISHED状态,队列中对应的条目被删除。
backlog参数:设定等待队列的最大数目。对应内核参数:net.ipv4.tcp_max_syn_backlog = 1024
syn-ack重传次数:服务器发送syn/ack包,如果没有收到客户端的相应,就会重传syn/ack,超过一定时间之后会进行第二次重传,超过设定次数以后将该条目从队列中删除。每次重传的间隔时间并不确定。对应的内核参数:net.ipv4.tcp_synack_retries = 5
syn重传次数:概念和syn/ack重传次数类似,对应的内核参数:net.ipv4.tcp_syn_retries = 5
等待存活时间:指等待队列的条目存活时间,即从服务器收到syn包到确认这个包无效的最长时间,该时间是所有重传包请求的最长等待时间

什么是SYN 攻击

syn攻击属于DDOS攻击中的一种,利用TCP/IP的缺陷进行网络攻击,可以使用很小的资源取得十分显著的效果。其基本原理如下:
服务器收到客户端的syn包,之后进入SYN_RECV状态,服务器的等待队列中增加一个条目,服务器未收到客户端的确认包,进行重传,一直到超时之后,该条目从未链接队列中删除。客户端不断地发送syn包,而不响应来自服务器的syn/ack,等待队列的条目迅速增长,最后服务器的等待队列达到最大数目,之后就不能再接受新的连接,一直到链接超时才从队列中删除对应的条目。配合ip地址欺骗技术,该方法可以取得十分良好的效果,基本上在攻击期间,服务器将不能给正常的用户提供服务。这个攻击办法利用了TCP/IP协议的缺陷,攻击的目标不止于服务器,任何网络设备,只要开启了网络服务器,都可能会受到这种攻击,导致处理器资源被大量占用,内存被用完,大量队列等待处理,针对网络设备的攻击往往会导致整个网络瘫痪。

如何减小SYN攻击的影响
1、修改等待数:# sysctl -w net.ipv4.tcp_max_syn_backlog=2048
2、启用syncookies:#sysctl -w net.ipv4.tcp_syncookies=1
启用syncookies可以大幅减小syn攻击带来的影响,但是却引入了新的安全缺陷

syncookie基本原理是:仔细处理连接的初始序列号而不是随机选择一个序列号。一旦server接收到SYN报文,将关键信息仔细编码并作为state存储在SYN队列中。这种经过编码的信息是用一个秘钥进行加密hash,形成SYN-ACK报文中的序列号并发送给client。在合法握手的第三个报文中,即从client返回给server的ACK报文中,在acknowledgment number字段中包含该序列号(加1). 这样,open双向连接所必须的所有信息又返回给server,而server在三次握手完成之前不必维护state。syn-cookies解决了SYN的基本问题,但是随之带来一个新的问题,就是服务器需要对收到的ACK报文进行计算,提高了三次握手需要的系统资源。一种新的攻击方式随之而来,即ACK攻击,发送大量的ACK数据报,导致服务器忙于计算最终导致服务器停止相应。Linux上的实际应用中,只有等待数被占满的时候才会启用syncookies的方式(syncookies摘自网文)
3、修改重试次数,#sysctl -w net.ipv4.tcp_syn_retries = 0 重传次数设置为0,只要收不到客户端的响应,立即丢弃该连接,默认设置为5次
4、使用iptables限制单个地址的并发连接数量:

#iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 10 --connlimit-mask 32 -j REJECT
5、使用iptables限制单个c类子网的并发链接数量:

#iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 10 --connlimit-mask 24 -j REJECT
6、限制单位时间内的连接数:

#iptables -t filter -A INPUT -p tcp --dport 80 -m --state --state NEW -m recent --set --name access --resource

#iptables -t filter -A INPUT -p tcp --dport 80 -m --state --state NEW -m recent --update --seconds 60 --hitcount 30 --name access -j DROP
或者使用如下两条策略

#iptables -t filter -A INPUT -p tcp --dport 80 -m --state --syn -m recent --set

#iptables -t filter -A INPUT -p tcp --dport 80 -m --state --syn -m recent --update --seconds 60 --hitcount 30 -j DROP
7、为了取得更好的效果,需要修改/etc/modprobe.conf


options ipt_recent ip_list_tot=1000 ip_pkt_list_tot=60 记录10000个地址,每个地址60个包 # ip_list_tot最大为8100,超过这个数值会导致iptables错误
8、限制单个地址最大连接数:

#iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP

应对 ACK攻击

ACK攻击是针对syn-cookies而发产生的,通过发送大量的ACK数据报,使目标服务器忙于计算,达到拒绝服务的目的,使用iptables对发起ACK攻击的地址进行限制

#iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP 限制并发连接数不大于50

#iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK ACK -m connlimit --connlimit-above 10 --connlimit-mask 32 -j REJECT 限制并发ACK不大于50


#iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK ACK -m recent --set --name drop


#iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK ACK -m recent --update --seconds 60 --hitcount 30 -j DROP 一分钟内大于30次的连接全部丢弃

应对CC攻击

普通的CC攻击特点是所有的连接都是正常的完整的连接,这样的连接一般的防火墙是很难预防的。但是既然是网络攻击必然也具有网络攻击的共同特点,也就是每一个攻击源都会发起尽量多的连接,因此我们仍然可以使用限制单个地址并发链接数量的办法来实现对CC攻击的抵御。具体命令同上

webcc,想必之下似乎更加难以预防,但是由于所有的访问都是由相同的一个或几个网站中转而来,这些访问请求的http_reffer都会带有这些中转站的地址。我们只要在web服务器上设置http_reffer过滤即可大幅减小webcc攻击的影响,具体的设置这里就略过不表了

附:如何为RHEL5增加connlimit模块
#wget ftp://ftp.netfilter.org/pub/patc ... ng-20080214.tar.bz2
#wget ftp://ftp.netfilter.org/pub/iptables/iptables-1.4.0.tar.bz2
#
bunzip2 iptables-1.4.0.tar.bz2
#
tar xvf iptables-1.4.0.tar
#
bunzip2 patch-o-matic-ng-20080214.tar.bz2
# tar xf patch-o-matic-ng-20080214.tar
#
cd patch-o-matic-ng-20080214
下载connlimit模块
# export KERNEL_DIR=/usr/src/kernels/2.6.18-8.el5-i686/
# export IPTABLES_DIR=/root/iptables-1.4.0
# ./runme --download

Successfully downloaded external patch geoip
Successfully downloaded external patch condition
Successfully downloaded external patch IPMARK
Successfully downloaded external patch ROUTE
Successfully downloaded external patch connlimit
Successfully downloaded external patch ipp2p
Successfully downloaded external patch time
./patchlets/ipv4options exists and is not external
./patchlets/TARPIT exists and is not external
Failed to get http://www.intra2net.com/de/prod ... /ipt_account//index, skipping..
Successfully downloaded external patch pknock
Loading patchlet definitions........................ done


Excellent! Source trees are ready for compilation.

把connlimit应用到内核
# ./runme connlimit
Loading patchlet definitions........................ done
Welcome to Patch-o-matic ($Revision: 6736 $)!

Kernel:
2.6.18, /usr/src/kernels/2.6.18-8.el5-i686/
Iptables: 1.4.0, /root/iptables-1.4.0/
Each patch is a new feature: many have minimal impact, some do not.
Almost every one has bugs, so don't apply what you don't need!
-------------------------------------------------------
Already applied:
Testing connlimit... not applied
The connlimit patch:

Author: Gerd Knorr <kraxel@bytesex.org>

Status: ItWorksForMe[tm]

This adds an iptables match which allows you to restrict the
number of parallel TCP connections to a server per client IP address
(or address block).

Examples:

# allow 2 telnet connections per client host
iptables -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT

# you can also match the other way around:
iptables -p tcp --syn --dport 23 -m connlimit ! --connlimit-above 2 -j ACCEPT

# limit the nr of parallel http requests to 16 per class C sized
# network (24 bit netmask)
iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 \

--connlimit-mask 24 -j REJECT
-----------------------------------------------------------------
Do you want to apply this patch [N/y/t/f/a/r/b/w/q/?] y

Excellent! Source trees are ready for compilation.
内核编译
# make oldconfig
scripts/kconfig/conf -o arch/i386/Kconfig
*
* Linux Kernel Configuration
*
*
* Code maturity level options
*
Prompt for development and/or incomplete code/drivers (EXPERIMENTAL) [Y/n/?] y

*
* General setup
………………………………………………………………………………………………………………………………………………………..



ARP tables support (IP_NF_ARPTABLES) [M/n/?] m

ARP packet filtering (IP_NF_ARPFILTER) [M/n/?] m

ARP payload mangling (IP_NF_ARP_MANGLE) [M/n/?] m

Connections/IP limit match support (IP_NF_MATCH_CONNLIMIT) [N/m/?] (NEW) m
提示加入了connlimit的选项,问使用哪一种模式,编译进内核还是模块,输入“m”,编译为模块
CRC16 functions (CRC16) [M/n/y/?] m
CRC32 functions (CRC32) [Y/?] y
CRC32c (Castagnoli, et al) Cyclic Redundancy-Check (LIBCRC32C) [Y/?] y
#
# configuration written to .config
#

编译模块
# make modules_prepare
scripts/kconfig/conf -s arch/i386/Kconfig

CHK
include/linux/version.h

CHK
include/linux/utsrelease.h

HOSTCC
scripts/genksyms/genksyms.o

HOSTCC
scripts/genksyms/lex.o

HOSTCC
scripts/genksyms/parse.o

HOSTLD
scripts/genksyms/genksyms

CC
scripts/mod/empty.o

MKELF
scripts/mod/elfconfig.h

HOSTCC
scripts/mod/file2alias.o

HOSTCC
scripts/mod/modpost.o

HOSTCC
scripts/mod/sumversion.o

HOSTLD
scripts/mod/modpost
[root@localhost 2.6.18-8.el5-i686]# mv net/ipv4/netfilter/Makefile
net/ipv4/netfilter/Makefile.bak
备份原来的文件


# make M=net/ipv4/netfilter/

LD
net/ipv4/netfilter/built-in.o

CC [M]
net/ipv4/netfilter/ipt_connlimit.o

Building modules, stage 2.

MODPOST

CC
net/ipv4/netfilter/ipt_connlimit.mod.o

LD [M]
net/ipv4/netfilter/ipt_connlimit.ko

#
cp net/ipv4/netfilter/ipt_connlimit.ko /lib/modules/2.6.18-8.el5/kernel/net/ipv4/netfilter/
# chmod 744 /lib/modules/2.6.18-8.el5/kernel/net/ipv4/netfilter/ipt_connlimit.ko

# depmod -a
[root@localhost 2.6.18-8.el5-i686]# modprobe ipt_connlimit
# lsmod |grep conn
ip_conntrack_netbios_ns
6977
0
ipt_connlimit
7680
6
ip_conntrack
53153
3 ip_conntrack_netbios_ns,xt_state,ipt_connlimit
nfnetlink
10713
1 ip_conntrack
x_tables
17349
8 ipt_recent,xt_state,ipt_REJECT,ipt_connlimit,ip_tables,ip6t_REJECT,xt_tcpudp,ip6_tables
好了,模块安装完毕。可以使用connlimit策略了

针对WINDOWS平台还可以通过修改regedit做一些防范,比如 1,打开regedit,找到 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters  增加一个SynAttackProtect的键值,类型为REG_DWORD,取值范围是0-2,这个值决定了系统受到SYN攻击时采取的保护措施,包括减少系统SYN+ACK的重试的次数等,默认值是0(没有任何保护措施),推荐设置是2   
  2 增加一个TcpMaxHalfOpen的键值,类型为REG_DWORD,取值范围是100-0xFFFF,这个值是系统允许同时打开的半连接默认情况下Pro和Server是100,Advanced Server是500,这个值取决于服务器TCP负荷的状况和可能受到的攻击强度

3 增加一个TcpMaxHalfOpenRetried的键值,类型为REG_DWORD,取值范围是80-0xFFFF,默认情况下Pro和Server是80,Advanced Server是400,这个值决定了在什么情况下系统会打开SYN攻击保护 。

来源:http://www.csna.cn/network-analyst-19881-1-1.html

### SYN Flood 攻击原理 SYN Flood攻击通过利用TCP连接的握手过程来实施。在标准操作下,TCP连接展示三个不同阶段以完成一次连接建立,在此过程中客户端发送带有同步标志位(SYN)的数据包给服务器;随后服务器回应一个确认数据包(ACK),并保留一定量的状态信息用于后续处理;最后一步则是由最初发起者返回另一个确认消息使通信链路正式开启[^2]。 然而,在SYN Flood场景里,恶意行为者会伪造源IP地址并向目标机器快速连续发出大量的SYN请求。由于这些请求来自虚假的身份,当被攻击端尝试响应每一个收到的新建连企图时——即回送ACK报文——却永远得不到预期中的第三次握手应答。这使得受害者的半开放状态表迅速填满,从而阻止任何合法用户的接入请求得到及时响应甚至完全失败[^4]。 ### 漏洞分析 这种类型的拒绝服务(DoS)攻击之所以能够成功,是因为它巧妙地利用了TCP/IP协议栈设计上的固有缺陷: - **缺乏验证机制**:对于初始到达的服务端口上接收到的所有SYN分组,默认情况下都会为其分配临时存储空间直至三次握手机制顺利完成为止。 - **资源消耗不对等**:每次新建链接仅需耗费极少量计算能力即可生成相应SYN段落,但对于每一条这样的入站流媒体来说,接收侧都不得不投入相对较多的时间和内存去管理和跟踪它们的存在状况,直到超时期间结束或是遭到显式释放之前都不会轻易放弃该位置预留。 上述弱点共同作用的结果便是即使面对数量级远小于自身承载极限范围内的异常流量冲击也足以让某些网络节点陷入瘫痪境地[^1]。 ### 安全防护措施 针对此类威胁可以采取如下几种策略来进行缓解或预防: #### 使用防火墙过滤规则 配置边界设备只允许特定子网范围内已知可信实体之间相互交换含有SYN标记的信息单元,以此减少外部未知来源造成的影响程度。 #### 启用SYN Cookie技术 尽管文中提到SockStress攻击对此类手段免疫,但在常规情形之下启用这项功能可以帮助减轻因遭受大规模并发访问而导致系统崩溃的风险。其核心思路在于不再为每个未决事务创建专门记录项而是直接基于加密散列算法动态构建回复序列号传递回去供对方校验之用,进而节省宝贵的空间配额。 #### 实施速率限制 通过对单位时间内所能接受的最大新连接数设定上限值的方式有效遏制突发性的海量请求数目激增现象的发生频率及其规模大小。 #### 部署负载均衡器 借助集群架构分散潜在风险点并将任务合理划分到多个成员实例上去执行,不仅提高了整体吞吐性能还增强了抵御复杂环境下各种形式干扰的能力。 ```bash iptables -A INPUT -p tcp --syn -m limit --limit 5/minute --limit-burst 7 -j ACCEPT ``` 以上命令展示了如何使用`iptables`工具定义一条简单的限速指令,这里的意思是在一分钟内最多允许五个新的TCP连接尝试进入,并且设置了七次作为突发情况下的额外容忍度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值