- 論壇徽章:
- 6
|
下面我談?wù)劤R奃DOS的檢測和防止方法(上硬件設(shè)備就不談了。)
一、DDoS的檢測方法
下面介紹如何判斷服務(wù)器是否受到DDoS攻擊。使用如下幾個簡單的步驟可以進行判斷。
◆ 最明顯的感覺是服務(wù)器響應(yīng)緩慢,一般直接可以從服務(wù)器提供的頁面顯示速度上察覺。
◆ 登錄服務(wù)器,用“netstat”命令查看,發(fā)現(xiàn)服務(wù)器有大量等待的TCP連接。
◆ 利用Sniffer、Tcpdump等嗅探工具會發(fā)現(xiàn)網(wǎng)絡(luò)中充斥著大量源地址為假的偽裝數(shù)據(jù)包。
◆ 可以看出服務(wù)器的數(shù)據(jù)流量猛增,造成網(wǎng)絡(luò)擁塞,服務(wù)器甚至不能正常地與外界通信。
◆ 嚴重時會造成系統(tǒng)死機。下面以一臺RHEL AS 5的服務(wù)器為例,使用系統(tǒng)自帶的netstat工具來檢測DDoS攻擊。
#netstat -n -p TCP
tcp 0 0 10.11.11.11:23 124.173.152.8:25882 SYN_RECV-
tcp 0 0 10.11.11.11:23 236.15.133.204:2577 SYN_RECV-
tcp 0 0 10.11.11.11:23 127.160.6.129:51748 SYN_RECV-
tcp 0 0 10.11.11.11:23 222.220.13.25:47393 SYN_RECV-
上面是在Linux系統(tǒng)中看到的輸出結(jié)果,很多連接處于SYN-RECV狀態(tài)(在Windows系統(tǒng)中是SYN-RECEIVED狀態(tài)), 源IP地址都是隨機的(也可能是同一個IP的很多SYN—RECV連接狀態(tài)),表明這是一種帶有IP欺騙的SYN攻擊。通過下面的命令也可以直接查看Linux環(huán)境下某個端口的未連接隊列條目數(shù):
#netstat -atun |grep SYN_RECV |grep:80 |wc –l
結(jié)果顯示了TCP 80端口的未連接數(shù)請求及個數(shù), 雖然還遠未達到系統(tǒng)極限, 但應(yīng)該引起管理員的注意。
二、防范DDoS攻擊
幾乎所有的主機平臺都有抵御DDoS的設(shè)置。以Linux操作系統(tǒng)為例,其防范技術(shù)主要分為三大類,第一類是通過合理配置系統(tǒng),達到資源最優(yōu)化和利用最大化,第二類是通過加固TCP/IP協(xié)議棧來防范DDoS;第三類是通過防火墻、路由器等過濾網(wǎng)關(guān),有效地探測攻擊類型并阻擊攻擊。
必須明確的是,DDoS攻擊在TCP連接原理上是合法的,除非TCP協(xié)議重新設(shè)計, 明確定義DDoS和其他正常請求有何不同,否則不可能完全阻止DDOS攻擊,我們所做的只是盡可能地減輕DDoS攻擊的危害。
1.服務(wù)器設(shè)置
除了防范他人攻擊外, 也要提防不要成為被人利用的對象。可以通過以下方法來實現(xiàn):
◆ 安全配置系統(tǒng),杜絕攻擊漏洞,及時安裝系統(tǒng)補丁程序;
◆ 關(guān)閉不必要的服務(wù),并優(yōu)化服務(wù);
◆ 有規(guī)律地查看日志;
◆ 利用工具檢查文件完整陛
2.加固TCP/IP協(xié)議棧
這里通過修改TCP/IP參數(shù)來控制連接資源的利用。
◆ SYN cookies技術(shù)
限制同時打開的SYN 半連接數(shù)。
以Red Hat Linux為例,通過在啟動環(huán)境中設(shè)置以下命令來啟用SYN cookies
#echo 1> /proc/sys/net/ipv4/tcp_syncookies
也可以通過修改其他參數(shù),或者使用/proc/sys/net/ipv4/netfilter/ip_contrack_*來實現(xiàn)。
◆ 增加最大半連接數(shù)
加大未連接隊列空間。
Linux 使用變量tcp-max-syn_backlog來定義backlog隊列容納的最大半連接數(shù)。在Red Hat Linux中,該變量的默認值為256,在RHEL AS Linux中則是1024。該數(shù)值是遠遠不夠的,一次強度不大的SYN攻擊就能使半連接隊列占滿。通過以下命令可以修改此變量值:
#sysctl -W net.ipv4.tcp_max_syn_backlog="2048"
◆ 縮短SYN半連接的Timeout時間
Red Hat Linux使用變量tcP_synack_retries定義重傳次數(shù),其默認值是5,總超時時間需要3分鐘。
#sysctl -W net.ipv4.tcp_synack_retries="0"
◆ 及時更新系統(tǒng)補丁
可以添加如下腳本到Linux的/etc/sysctl.conf文件,重啟后會自動啟動,達到防御DDoS的效果。
## add by geminis for syn crack
net.ipv4.tcp_syncookied=1
net.ipv4.tcp_max_syn_backlog="2048"
net.ipv4.tcp_synack_retries="1"
三 防火墻防御
網(wǎng)關(guān)超時設(shè)置將防火墻SYN轉(zhuǎn)發(fā)超時參數(shù)設(shè)置為小于服務(wù)器的Timeout。如果客戶端在防火墻的Timeout時間內(nèi)無響應(yīng),防火墻將發(fā)送終止RST消息給服務(wù)器,使服務(wù)器從隊列中刪除該半連接,節(jié)省開銷。需要注意的是,網(wǎng)關(guān)超時參數(shù)設(shè)置不宜過小也不宜過大,超時參數(shù)設(shè)置過小會影響正常的通信,設(shè)置過大則會影響防范SYN drome攻擊的效果,必須更具所處的網(wǎng)絡(luò)環(huán)境來設(shè)置參數(shù)。
◆ SYN 網(wǎng)關(guān):SYN網(wǎng)關(guān)的原理是代替客戶端發(fā)送ACK消息,然后轉(zhuǎn)發(fā)數(shù)據(jù)。SYN網(wǎng)關(guān)收到服務(wù)器的SYN/ACK包后,將該包轉(zhuǎn)發(fā)給客戶端,同時以客戶端的名義給服務(wù)器發(fā)ACK確認包。此時,服務(wù)器由半連接狀態(tài)進入連接狀態(tài)。當客戶端確認包到達時,如果有數(shù)據(jù)則轉(zhuǎn)發(fā),否則丟棄。一般服務(wù)器所能承受的連接數(shù)量比半連接數(shù)量要大得多,所以這種方法能有效地減輕對服務(wù)器的攻擊。
◆ SYN 代理:當客戶端SYN包到達過濾網(wǎng)關(guān)時,SYN代理并不轉(zhuǎn)發(fā)SYN包,而是以服務(wù)器的名義主動回復(fù)SYN+ACK包給客戶。收到客戶的ACK 包表明是正常訪問,此時防火墻向服務(wù)器發(fā)送ACK包,并完成三次握手, 。這里的防火墻作為獨立的服務(wù)器,需要有較強的抵抗DDoS攻擊的能力。使用專用NP (網(wǎng)絡(luò)處理器)及專用操作系統(tǒng)的高檔防火墻都會具備這種功能。
#!/bin/sh
#定義變量
MAX_TOTAL_SYN_RECV="1000"
MAX_PER_IP_SYN_RECV="20"
MARK="SYN_RECV"
#定義鏈接狀態(tài)為"SYN_RECV"
PORT="80"
LOGFILE="/var/og/netstat_$MARK-$PORT"
LOGFILE_IP="/var/log/netstat_connect_ip.log"
DROP_IP_LOG="/var/log/netstat_syn_drop_ip.log"
#iptables初始化,拒絕非法包和不明狀態(tài)包,允許請求包和已連接的包進入
iptable -F -t filter
iptable -A INPUT -p TCP --syn -m stat --state NEW -j DROP
iptables -A INPUT -p ALL - m state --state INVALID -j DROP
iptables -A INPUT -p ALL -m state -state ESTABLISHED,RELATED -j ACCEPT
#初始化變量
if [-z $MARK];then
MARK="LISTEN"
fi
if [-z $PORT];then
SPRT="tcp"
else
SPORT=" PORT"
fi
#end
#保存netstat結(jié)果到指定記錄文件中便于分析
netstat -atun|grep $MARK |grep $SPORT 2>/dev/null >$LOGFILE
if [-s $DROP_IP_LOG];then
for i in `less$DROP_IP_LOG|awk '{print $1}`;
do
/sbin/iptables -A INPUT -p ALL -s $i -j DROP
done
fi
for i in 'less $LOGFILE_IP';
#統(tǒng)計同一IP的SYN-RECV狀態(tài)
REPEAT_CONNECT_NUM='grep $i $LOGFILE|wc -l'
#如果超過預(yù)設(shè)的統(tǒng)一IP連接數(shù),則拒絕此IP連接包進入
if [$REPEAT_CONNECT_NUM -gt $MAX_PER_IP_SYN_RECV];then
echo "$I $REPEAT_CONNEC_NUM" >> $DROP_IP_LOG
iptables -A INPUT -p ALL -s $i -j DROP
fi
done
#統(tǒng)計所有狀態(tài)為SN_RECV的數(shù)據(jù)包,如果數(shù)量超過預(yù)設(shè)則重置狀態(tài)
ALL_CONNETC='uniq -u $LOGFILE|wc -l '
echo $ALL_CONNECT
if [$ALL_CONNECT -gt $MAX_TOTAL_SYN_REC];then
echo $ALL_CONNECT
exit
fi
簡單說明一下上述腳本。該腳本一旦發(fā)現(xiàn)有惡意連接的IP地址后會馬上生效,利用iptables命令阻止該IP地址的任何請求,直到管理員手動去除為止。但是這種做法在某些情況下顯得過于嚴格,因為該IP也可能是一個公共出口。解決方法是再配合一個釋放IP ,運行于任務(wù)管理中,設(shè)置成每隔一段時間自動從iptables規(guī)則中去掉該IP地址,時間可以根據(jù)具體網(wǎng)絡(luò)連接情況設(shè)置。
|
|