English
 电子信箱
 加入收藏

  威盾防火墙 >> 新闻中心 >> 威盾新闻 >> SYN攻击的原理,攻击工具,以及防护手段/使用iptables应对SYN攻击、CC攻击、ACK攻击

 

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

威盾防火墙 2014-11-10

 
如果错漏之处,敬请指出\r\n\r\n三次握手的过程及相关概念\r\nTCP/IP协议使用三次握手来建立连接,过程如下:\r\n1、第一次握手,客户端发送数据包syn到服务器,并进入SYN_SEND状态,等待回复 \r\n2、第二次握手,服务器发送数据报syn/ack,给客户机,并进入SYN_RECV状态,等待回复 \r\n3、第三次握手,客户端发送数据包ACK给客户机,发送完成后,客户端和服务器进入ESTABLISHED状态,链接建立完成 \r\n\r\n\r\n三次握手协议中,服务器维护一个等待队列,收到一个syn包就在队列中建立一个条目,并分配一定的资源。对应的每一个条目表示已经收到一个syn请求,并已经回复syn/ack,服务器上对应的连接已经进入SYN_RECV状态,等待客户端响应,收到客户端的响应包以后,该连接进入ESTABLISHED状态,队列中对应的条目被删除。\r\nbacklog参数:设定等待队列的最大数目。对应内核参数:net.ipv4.tcp_max_syn_backlog = 1024 \r\nsyn-ack重传次数:服务器发送syn/ack包,如果没有收到客户端的相应,就会重传syn/ack,超过一定时间之后会进行第二次重传,超过设定次数以后将该条目从队列中删除。每次重传的间隔时间并不确定。对应的内核参数:net.ipv4.tcp_synack_retries = 5\r\nsyn重传次数:概念和syn/ack重传次数类似,对应的内核参数:net.ipv4.tcp_syn_retries = 5 \r\n等待存活时间:指等待队列的条目存活时间,即从服务器收到syn包到确认这个包无效的最长时间,该时间是所有重传包请求的最长等待时间\r\n\r\n什么是SYN 攻击\r\n\r\nsyn攻击属于DDOS攻击中的一种,利用TCP/IP的缺陷进行网络攻击,可以使用很小的资源取得十分显著的效果。其基本原理如下:\r\n服务器收到客户端的syn包,之后进入SYN_RECV状态,服务器的等待队列中增加一个条目,服务器未收到客户端的确认包,进行重传,一直到超时之后,该条目从未链接队列中删除。客户端不断地发送syn包,而不响应来自服务器的syn/ack,等待队列的条目迅速增长,最后服务器的等待队列达到最大数目,之后就不能再接受新的连接,一直到链接超时才从队列中删除对应的条目。配合ip地址欺骗技术,该方法可以取得十分良好的效果,基本上在攻击期间,服务器将不能给正常的用户提供服务。这个攻击办法利用了TCP/IP协议的缺陷,攻击的目标不止于服务器,任何网络设备,只要开启了网络服务器,都可能会受到这种攻击,导致处理器资源被大量占用,内存被用完,大量队列等待处理,针对网络设备的攻击往往会导致整个网络瘫痪。\r\n\r\n如何减小SYN攻击的影响\r\n1、修改等待数:# sysctl -w net.ipv4.tcp_max_syn_backlog=2048\r\n2、启用syncookies:#sysctl -w net.ipv4.tcp_syncookies=1 \r\n启用syncookies可以大幅减小syn攻击带来的影响,但是却引入了新的安全缺陷\r\n\r\nsyncookie基本原理是:仔细处理连接的初始序列号而不是随机选择一个序列号。一旦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摘自网文)\r\n3、修改重试次数,#sysctl -w net.ipv4.tcp_syn_retries = 0 重传次数设置为0,只要收不到客户端的响应,立即丢弃该连接,默认设置为5次\r\n4、使用iptables限制单个地址的并发连接数量:\r\n\r\n#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\r\n5、使用iptables限制单个c类子网的并发链接数量:\r\n\r\n#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\r\n6、限制单位时间内的连接数:\r\n\r\n#iptables -t filter -A INPUT -p tcp --dport 80 -m --state --state NEW -m recent --set --name access --resource\r\n\r\n#iptables -t filter -A INPUT -p tcp --dport 80 -m --state --state NEW -m recent --update --seconds 60 --hitcount 30 --name access -j DROP\r\n或者使用如下两条策略\r\n\r\n#iptables -t filter -A INPUT -p tcp --dport 80 -m --state --syn -m recent --set\r\n\r\n#iptables -t filter -A INPUT -p tcp --dport 80 -m --state --syn -m recent --update --seconds 60 --hitcount 30 -j DROP\r\n7、为了取得更好的效果,需要修改/etc/modprobe.conf\r\n\r\n\r\noptions ipt_recent ip_list_tot=1000 ip_pkt_list_tot=60 记录10000个地址,每个地址60个包 # ip_list_tot最大为8100,超过这个数值会导致iptables错误\r\n8、限制单个地址最大连接数:\r\n\r\n#iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP\r\n\r\n应对 ACK攻击\r\n\r\nACK攻击是针对syn-cookies而发产生的,通过发送大量的ACK数据报,使目标服务器忙于计算,达到拒绝服务的目的,使用iptables对发起ACK攻击的地址进行限制\r\n\r\n#iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP 限制并发连接数不大于50\r\n\r\n#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\r\n\r\n\r\n#iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK ACK -m recent --set --name drop\r\n\r\n\r\n#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次的连接全部丢弃\r\n\r\n应对CC攻击\r\n\r\n普通的CC攻击特点是所有的连接都是正常的完整的连接,这样的连接一般的防火墙是很难预防的。但是既然是网络攻击必然也具有网络攻击的共同特点,也就是每一个攻击源都会发起尽量多的连接,因此我们仍然可以使用限制单个地址并发链接数量的办法来实现对CC攻击的抵御。具体命令同上\r\n\r\nwebcc,想必之下似乎更加难以预防,但是由于所有的访问都是由相同的一个或几个网站中转而来,这些访问请求的http_reffer都会带有这些中转站的地址。我们只要在web服务器上设置http_reffer过滤即可大幅减小webcc攻击的影响,具体的设置这里就略过不表了\r\n\r\n附:如何为RHEL5增加connlimit模块\r\n#wgetftp://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-matic-ng-20080214.tar.bz2\r\n#wgetftp://ftp.netfilter.org/pub/iptables/iptables-1.4.0.tar.bz2\r\n#\r\nbunzip2 iptables-1.4.0.tar.bz2 \r\n#\r\ntar xvf iptables-1.4.0.tar \r\n# \r\nbunzip2 patch-o-matic-ng-20080214.tar.bz2 \r\n# tar xf patch-o-matic-ng-20080214.tar\r\n#\r\ncd patch-o-matic-ng-20080214\r\n下载connlimit模块\r\n# export KERNEL_DIR=/usr/src/kernels/2.6.18-8.el5-i686/ \r\n# export IPTABLES_DIR=/root/iptables-1.4.0\r\n# ./runme --download\r\n\r\nSuccessfully downloaded external patch geoip\r\nSuccessfully downloaded external patch condition\r\nSuccessfully downloaded external patch IPMARK\r\nSuccessfully downloaded external patch ROUTE\r\nSuccessfully downloaded external patch connlimit\r\nSuccessfully downloaded external patch ipp2p\r\nSuccessfully downloaded external patch time\r\n./patchlets/ipv4options exists and is not external\r\n./patchlets/TARPIT exists and is not external\r\nFailed to get http://www.intra2net.com/de/produkte/opensource/ipt_account//index, skipping..\r\nSuccessfully downloaded external patch pknock\r\nLoading patchlet definitions........................ done\r\n\r\n\r\nExcellent! Source trees are ready for compilation.\r\n\r\nconnlimit应用到内核\r\n# ./runme connlimit\r\nLoading patchlet definitions........................ done\r\nWelcome to Patch-o-matic ($Revision: 6736 $)!\r\n\r\nKernel:\r\n2.6.18, /usr/src/kernels/2.6.18-8.el5-i686/\r\nIptables: 1.4.0, /root/iptables-1.4.0/\r\nEach patch is a new feature: many have minimal impact, some do not.\r\nAlmost every one has bugs, so don\'t apply what you don\'t need!\r\n-------------------------------------------------------\r\nAlready applied: \r\nTesting connlimit... not applied\r\nThe connlimit patch:\r\n\r\nAuthor: Gerd Knorr <[email protected]>\r\n\r\nStatus: ItWorksForMe[tm]\r\n\r\nThis adds an iptables match which allows you to restrict the\r\nnumber of parallel TCP connections to a server per client IP address\r\n(or address block).\r\n\r\nExamples:\r\n\r\n# allow 2 telnet connections per client host\r\niptables -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT\r\n\r\n# you can also match the other way around:\r\niptables -p tcp --syn --dport 23 -m connlimit ! --connlimit-above 2 -j ACCEPT\r\n\r\n# limit the nr of parallel http requests to 16 per class C sized\r\n# network (24 bit netmask)\r\niptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 \\\r\n\r\n--connlimit-mask 24 -j REJECT\r\n-----------------------------------------------------------------\r\nDo you want to apply this patch [N/y/t/f/a/r/b/w/q/?] y\r\n\r\nExcellent! Source trees are ready for compilation.\r\n内核编译\r\n# make oldconfig\r\nscripts/kconfig/conf -o arch/i386/Kconfig\r\n*\r\n* Linux Kernel Configuration\r\n*\r\n*\r\n* Code maturity level options\r\n*\r\nPrompt for development and/or incomplete code/drivers (EXPERIMENTAL) [Y/n/?] y\r\n\r\n*\r\n* General setup\r\n………………………………………………………………………………………………………………………………………………………..\r\n\r\n\r\n\r\nARP tables support (IP_NF_ARPTABLES) [M/n/?] m\r\n\r\nARP packet filtering (IP_NF_ARPFILTER) [M/n/?] m\r\n\r\nARP payload mangling (IP_NF_ARP_MANGLE) [M/n/?] m\r\n\r\nConnections/IP limit match support (IP_NF_MATCH_CONNLIMIT) [N/m/?] (NEW) m\r\n提示加入了connlimit的选项,问使用哪一种模式,编译进内核还是模块,输入“m”,编译为模块\r\nCRC16 functions (CRC16) [M/n/y/?] m\r\nCRC32 functions (CRC32) [Y/?] y\r\nCRC32c (Castagnoli, et al) Cyclic Redundancy-Check (LIBCRC32C) [Y/?] y\r\n#\r\n# configuration written to .config\r\n#\r\n\r\n编译模块\r\n# make modules_prepare\r\nscripts/kconfig/conf -s arch/i386/Kconfig\r\n\r\nCHK\r\ninclude/linux/version.h\r\n\r\nCHK\r\ninclude/linux/utsrelease.h\r\n\r\nHOSTCC\r\nscripts/genksyms/genksyms.o\r\n\r\nHOSTCC\r\nscripts/genksyms/lex.o\r\n\r\nHOSTCC\r\nscripts/genksyms/parse.o\r\n\r\nHOSTLD\r\nscripts/genksyms/genksyms\r\n\r\nCC\r\nscripts/mod/empty.o\r\n\r\nMKELF\r\nscripts/mod/elfconfig.h\r\n\r\nHOSTCC\r\nscripts/mod/file2alias.o\r\n\r\nHOSTCC\r\nscripts/mod/modpost.o\r\n\r\nHOSTCC\r\nscripts/mod/sumversion.o\r\n\r\nHOSTLD\r\nscripts/mod/modpost\r\n[root@localhost 2.6.18-8.el5-i686]# mv net/ipv4/netfilter/Makefile \r\nnet/ipv4/netfilter/Makefile.bak\r\n备份原来的文件\r\n\r\n\r\n# make M=net/ipv4/netfilter/\r\n\r\nLD\r\nnet/ipv4/netfilter/built-in.o\r\n\r\nCC [M]\r\nnet/ipv4/netfilter/ipt_connlimit.o\r\n\r\nBuilding modules, stage 2.\r\n\r\nMODPOST\r\n\r\nCC\r\nnet/ipv4/netfilter/ipt_connlimit.mod.o\r\n\r\nLD [M]\r\nnet/ipv4/netfilter/ipt_connlimit.ko\r\n\r\n#\r\ncp net/ipv4/netfilter/ipt_connlimit.ko /lib/modules/2.6.18-8.el5/kernel/net/ipv4/netfilter/\r\n# chmod 744 /lib/modules/2.6.18-8.el5/kernel/net/ipv4/netfilter/ipt_connlimit.ko \r\n\r\n# depmod -a\r\n[root@localhost 2.6.18-8.el5-i686]# modprobe ipt_connlimit\r\n# lsmod |grep conn\r\nip_conntrack_netbios_ns\r\n6977\r\n0\r\nipt_connlimit\r\n7680\r\n6 \r\nip_conntrack\r\n53153\r\n3 ip_conntrack_netbios_ns,xt_state,ipt_connlimit\r\nnfnetlink\r\n10713\r\n1 ip_conntrack\r\nx_tables\r\n17349\r\n8 ipt_recent,xt_state,ipt_REJECT,ipt_connlimit,ip_tables,ip6t_REJECT,xt_tcpudp,ip6_tables\r\n好了,模块安装完毕。可以使用connlimit策略了\n\n[ 本帖最后由 comcn2 于 2009-12-21 14:42 编辑 ]

相关内容: 最新内容:
CC攻击的原理与预防[2014-11-10]
今天打开电脑,发现这样的提示“注意:发现CC攻击行为!”[2014-11-10]
什么是CC攻击?[2014-11-10]
不用防火墙自动对付CC攻击的办法[2014-11-10]
入侵和攻击的概念解析[2014-11-09]
IIS服务器防范攻击安全设置技巧[2014-11-08]
CC攻击的原理与预防[2014-11-10]
今天打开电脑,发现这样的提示“注意:发现CC攻击行为!”[2014-11-10]
十种接近疯狂的站长[2014-11-10]
什么是CC攻击?[2014-11-10]
Windows IIS日志文件分析程序[2014-11-10]
不用防火墙自动对付CC攻击的办法[2014-11-10]