Linux 防止cc syn 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/patch-o-matic-ng/snapshot/patch-o-matic-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/produkte/opensource/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 <[email protected]>

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策略了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章