1. 程式人生 > >Linux下防禦DDOS攻擊的操作梳理

Linux下防禦DDOS攻擊的操作梳理

DDOS的全稱是Distributed Denial of Service,即"分散式拒絕服務攻擊",是指擊者利用大量“肉雞”對攻擊目標發動大量的正常或非正常請求、耗盡目標主機資源或網路資源,從而使被攻擊的主機不能為合法使用者提供服務。

DDOS攻擊的本質是:
利用木桶原理,尋找利用系統應用的瓶頸;阻塞和耗盡;當前問題:使用者的頻寬小於攻擊的規模,噪聲訪問頻寬成為木桶的短板。

可以參考下面的例子理解下DDOS攻擊。
1)某飯店可以容納100人同時就餐,某日有個商家惡意競爭,僱傭了200人來這個飯店坐著不吃不喝,導致飯店滿滿當當無法正常營業。
(DDOS攻擊成功)
2)老闆當即大怒,派人把不吃不喝影響正常營業的人全都轟了出去,且不再讓他們進來搗亂,飯店恢復了正常營業。
(新增規則和黑名單進行DDOS防禦,防禦成功)
3)主動攻擊的商家心存不滿,這次請了五千人逐批次來搗亂,導致該飯店再次無法正常營業。(增加DDOS流量,改變攻擊方式)
4)飯店把那些搗亂的人轟出去只後,另一批接踵而來。此時老闆將飯店營業規模擴大,該飯店可同時容納1萬人就餐,
5000人同時來搗亂飯店營業也不會受到影響。(增加硬防與其抗衡)

DDOS攻擊只不過是一個概稱,其下有各種攻擊方式,比如:"CC攻擊、SYN攻擊、NTP攻擊、TCP攻擊、DNS攻擊等等",
現在DDOS發展變得越來越可怕,NTP服務放大攻擊漸漸成為主流了,這意味著可以將每秒的攻擊流量放大幾百倍,
比如每秒1G的SYN碎片攻擊換成NTP放大攻擊,就成為了200G或者更多。
--------------------------------------------------順便介紹下NTP服務放大攻擊--------------------------------------------------------

什麼事NTP服務?
網路時間協議NTP(Network Time Protocol)是用於網際網路中時間同步的標準網際網路協議。
NTP伺服器通過NTP服務向網路上的計算機或其他裝置提供標準的授時服務,以保證這些服務系統的時鐘能夠同步。通常NTP服務使用UDP 123埠提供標準服務。

什麼是NTP服務放大攻擊?
標準NTP 服務提供了一個 monlist查詢功能,也被稱為MON_GETLIST,該功能主要用於監控 NTP 伺服器的服務狀況,
當用戶端向NTP服務提交monlist查詢時,NTP 伺服器會向查詢端返回與NTP 伺服器進行過時間同步的最後 600 個客戶端的 IP
,響應包按照每 6 個 IP 進行分割,最多有 100 個響應包。由於NTP服務使用UDP協議,攻擊者可以偽造源發地址向NTP服務進行
monlist查詢,這將導致NTP伺服器向被偽造的目標傳送大量的UDP資料包,理論上這種惡意導向的攻擊流量可以放大到偽造查詢流量的100倍。

NTP是用UDP傳輸的,所以可以偽造源地址。NTP協議中有一類查詢指令,用短小的指令即可令伺服器返回很長的資訊,
放大攻擊就是基於這類指令的。
比如:
小明以吳一帆的名義問李雷"我們班有哪些人?" ,李雷就回答吳一帆說"有誰誰誰和誰誰誰……"”"(幾百字),那麼小明就以8個字的成本
,令吳一帆收到了幾百字的資訊,所以叫做放大攻擊。
(也就是說:對方伺服器是個話嘮,你以小明的身份問他一個問題,他回答小明一千句,結果小明崩潰了)

網路上一般NTP伺服器都有很大的頻寬,攻擊者可能只需要1Mbps的上傳頻寬欺騙NTP伺服器,即可給目標伺服器帶來幾百上千Mbps的攻擊流量
,達到借刀殺人的效果。
所以現在新的ntpd已經可以通過配置檔案,關掉除時間同步以外的查詢功能。而時間同步的查詢和返回大小相同(沒記錯的話)
,所以沒辦法用作放大攻擊。

如何檢視是否遭受NTP放大攻擊?
如果網路上檢測到大流量的UDP 123埠的資料,就可以確認正在遭受此類攻擊。

如何防範NTP放大攻擊?
1)升級服務程式版本
將系統中的NTP服務升級到 ntpd 4.2.7p26 或之後的版本,因為 ntpd 4.2.7p26 版本後,服務預設是關閉monlist查詢功能的。

2)關閉服務的monlist查詢功能:
首先查詢問題主機的REQ_MON_GETLIST和REQ_MON_GETLIST_1請求是否可用。具體操作方法:
# ntpq -c rv<localhost/remotehost>
# ntpdc -c sysinfo<localhost/remotehost>
# ntpdc -n -c monlist<localhost/remotehost>

如果上述功能可用,可嘗試通過修改ntp.conf檔案解決問題,具體操作建議是在上述配置檔案中增加下面的配置:
IPV4: restrict default kod nomodify notrap nopeer noquery
IPv6: restrict -6 default kod nomodify notrap nopeer noquery

允許發起時間同步的IP,與本伺服器進行時間同步,但是不允許修改ntp服務資訊,也不允許查詢伺服器的狀態資訊(如monlist)*/

另外,還可以配置限制訪問命令,如:

restrict default noquery #允許普通的請求者進行時間同步,但是不允許查詢ntp服務資訊*/

修改並儲存配置檔案之後,請重啟ntpd服務。近年來,一些重大的DDOS攻擊案例:
1)2000年2月,包括雅虎、CNN、亞馬遜、eBay、http://Buy.com、ZDNet,以及E*Trade和Datek等網站均遭受到了DDOS攻擊,
並致使部分網站癱瘓。
2)2007年5月,愛沙尼亞三週內遭遇三輪DDOS攻擊,總統府、議會、幾乎全部政府部門、主要政黨、主要媒體和2家大銀行和通訊
公司的網站均陷入癱瘓,為此北約頂級反網路恐怖主義專家前往該國救援。
3)2009年519斷網事件導致南方六省運營商伺服器全部崩潰,電信在南方六省的網路基本癱瘓。2009年7月,韓國主要網站三天
內遭遇三輪猛烈的DDOS攻擊,韓國宣佈提前成立網路司令部。
4)比較著名的案例還有有:
全球三大遊戲平臺:暴雪戰網、Valve Steam和EA Origin遭到大規模DDoS攻擊,致使大批玩家無法登入與進行遊戲。
隨後名為DERP的黑客組織聲稱對此次大規模的DDoS攻擊行動負責。

對於DDOS攻擊的簡單防護措施:

1)關閉不必要的服務和埠;
2)限制同一時間內開啟的syn半連線數目;
3)縮短syn半連線的超時時間;
4)及時安裝系統補丁;
5)禁止對主機非開放服務的訪問;
6)啟用防火牆防DDOS屬性。硬體防火牆價格比較昂貴,可以考慮利用Linux系統本身提供的防火牆功能來防禦。
7)另外也可以安裝相應的防護軟體,這裡強烈建議安裝安全狗軟體,防護效能不錯,並且免費。
8)購買DDOS防禦產品,比如阿里雲盾的DDOS防禦中的高防IP,這個使用起來,效果也很給力。

接下來說下Linux系統下預防DDOS攻擊的操作:

Linux伺服器在執行過程中可能會受到黑客攻擊,常見的攻擊方式有SYN,DDOS等。
通過更換IP,查詢被攻擊的站點可能避開攻擊,但是中斷服務的時間比較長。比較徹底的解決方法是添置硬體防火牆,
但是硬體防火牆價格比較昂貴。可以考慮利用Linux系統本身提供的防火牆功能來防禦。
SYN攻擊是利用TCP/IP協議3次握手的原理,傳送大量的建立連線的網路包,但不實際建立連線,最終導致被攻擊伺服器的網路佇列被佔滿,
無法被正常使用者訪問。
Linux核心提供了若干SYN相關的配置,加大SYN佇列長度可以容納更多等待連線的網路連線數,開啟SYN Cookie功能可以阻止部分SYN攻擊
,降低重試次數也有一定效果。
而DDOS則是通過使網路過載來干擾甚至阻斷正常的網路通訊,通過向伺服器提交大量請求,使伺服器超負荷
,阻斷某一使用者訪問伺服器阻斷某服務與特定系統或個人的通訊。可以通過配置防火牆或者使用指令碼工具來防範DDOS攻擊;

1)優化幾個sysctl核心引數:
[[email protected] ~]# vim /etc/sysctl.conf
......
#表示SYN佇列的長度,加大佇列長度可以容納更多等待連線的網路連線數
net.ipv4.tcp_max_syn_backlog = 4096
#表示開啟SYN Cookies功能。當出現SYN等待佇列溢位時,啟用cookies來處理,可防範少量SYN攻擊,預設為0,表示關閉,1表示開啟;
net.ipv4.tcp_syncookies = 1
#下面這兩行表示定義SYN重試次數
net.ipv4.tcp_synack_retries = 2

net.ipv4.tcp_syn_retries = 2

提高TCP連線能力

net.ipv4.tcp_rmem = 32768
net.ipv4.tcp_wmem = 32768
net.ipv4.tcp_sack = 0 #開啟tcp_sack功能,1表示"關閉",0表示"開啟"

......[[email protected] ~]# sysctl -p #使上面配置生效

2)利用linux系統自帶iptables防火牆進行預防:

先檢視伺服器上連線web埠(比如80埠)的哪個ip是最多的,如果發現可疑ip,就果斷將其斷開與伺服器連線

檢視80埠的連線情況
[[email protected] ~]# netstat -an | grep ":80" | grep ESTABLISHED

下面的命令表示獲取伺服器上ESTABLISHED連線數最多的前10個ip,排除了內部ip段192.168|127.0開頭的。
[[email protected] ~]#
/bin/netstat -na|grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -rn|head -10|grep -v -E '192.168|127.0'
4001 140.205.140.205
2388 124.65.197.154
1807 111.205.224.15
18 10.51.58.16
.......

將上面140.205.140.205、124.65.197.154、111.205.224.15的這三個ip的包丟棄
[[email protected] ~]# iptables -A INPUT -s 140.205.140.205 -p tcp -j DROP
[[email protected] ~]# iptables -A INPUT -s 124.65.197.154 -p tcp -j DROP
[[email protected] ~]# iptables -A INPUT -s 111.205.224.15 -p tcp -j DROP
[[email protected] ~]# service iptables save
[[email protected] ~]# service iptables restart

不過上面的方法對於偽造源IP地址的SYN FLOOD攻擊就無效了!

-------------------------------------其他預防攻擊的設定-------------------------------------
防止同步包洪水(Sync Flood),縮短SYN-Timeout時間:
[[email protected] ~]# iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
[[email protected] ~]# iptables -A INPUT -i eth0 -m limit --limit 1/sec --limit-burst 5 -j ACCEPT

其中:
--limit 1/s 限制syn併發數每秒1次,可以根據自己的需要修改防止各種埠掃描
[[email protected] ~]# iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT

Ping洪水攻擊(Ping of Death)
[[email protected] ~]# iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT 控制單個IP的最大併發連線數。
如下設定表示:允許單個IP的最大連線數為 30
[[email protected] ~]# iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j REJECT

控制單個IP在一定的時間(比如60秒)內允許新建立的連線數。
如下設定表示:單個IP在60秒內只允許最多新建30個連線
[[email protected] ~]# iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 30 -j REJECT
[[email protected] ~]# iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --set -j ACCEPT
---------------------------------------------------------------------------------------------------
如果出現報錯:
iptables: Invalid argument. Run `dmesg' for more information.

解決辦法:
增加 xt_recent模組的引數值即可,預設是20
[[email protected] ~]# cat /sys/module/xt_recent/parameters/ip_pkt_list_tot
20
[[email protected] ~]# echo 50 > /sys/module/xt_recent/parameters/ip_pkt_list_tot
[[email protected] ~]# cat /sys/module/xt_recent/parameters/ip_pkt_list_tot
50
---------------------------------------------------------------------------------------------------

禁止ping(即禁止從外部ping這臺伺服器):
[[email protected] ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

用iptables遮蔽IP(如下禁止213.8.166.237連線本機的80埠)
[[email protected] ~]# iptables -A INPUT -s 213.8.166.227 -p tcp -m tcp -m state --state NEW --dport 80 --syn -j REJECT

允許某ip連線(如下允許13.78.66.27連線本機的80埠)
[[email protected] ~]# iptables -A INPUT -s 13.78.66.27 -p tcp -m tcp -m state --state NEW --dport 80 --syn -j ACCEPT

3)使用DDoS deflate指令碼自動遮蔽攻擊ip

DDoS deflate是一款免費的用來防禦和減輕DDoS攻擊的指令碼。它通過netstat監測跟蹤建立大量網路連線的IP地址,
在檢測到某個結點超過預設的限制時,該程式會通過APF或IPTABLES禁止或阻擋這些IP.
DDoS deflate其實是一個Shell指令碼,使用netstat和iptables工具,對那些連結數過多的IP進行封鎖,能有效防止通用的惡意掃描器
,但它並不是真正有效的DDoS防禦工具。

DDoS deflate工作過程描述:
同一個IP連結到伺服器的連線數到達設定的伐值後,所有超過伐值的IP將被遮蔽,同時把遮蔽的IP寫入ignore.ip.list檔案中,
與此同時會在tmp中生成一個指令碼檔案,這個指令碼檔案馬上被執行,但是一
執行就遇到sleep預設的秒,當睡眠了這麼多的時間後,解除被遮蔽的IP,同時把之前寫入ignore.ip.list檔案中的這個被封鎖的IP刪除
,然後刪除臨時生成的檔案。
一個事實:如果被遮蔽的IP手工解遮蔽,那麼如果這個IP繼續產生攻擊,那麼指令碼將不會再次遮蔽它(因為加入到了ignore.ip.list)
,直到在預設的時間之後才能起作用,加入到了ignore.ip.list中的
IP是檢測的時候忽略的IP。可以把IP寫入到這個檔案以避免這些IP被堵塞,已經堵塞了的IP也會加入到ignore.ip.list中,
但堵塞了預定時間後會從它之中刪除。

如何確認是否受到DDOS攻擊?
[[email protected] ~]# netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
1 Address
1 servers)
2 103.10.86.5
4 117.36.231.253
4 19.62.46.24
6 29.140.22.18
8 220.181.161.131
2911 167.215.42.88

每個IP幾個、十幾個或幾十個連線數都還算比較正常,如果像上面成百上千肯定就不正常了。比如上面的167.215.42.88,
這個ip的連線有2911個!這個看起來就很像是被攻擊了!

下面就說下通過DDoS deflate指令碼來自動遮蔽DDOS攻擊的ip
1)下載DDoS deflate安裝指令碼,並執行安裝。
[[email protected] ~]# wget http://www.inetbase.com/scripts/ddos/install.sh
[[email protected] ~]# chmod 0700 install.sh
[[email protected] ~]# ./install.sh


解除安裝DDos default的操作如下:

wget http://www.inetbase.com/scripts/ddos/uninstall.ddos

chmod 0700 uninstall.ddos

# ./uninstall.ddos

2)配置DDoS deflate下面是DDoS deflate的預設配置位於/usr/local/ddos/ddos.conf ,內容如下:
[[email protected] ~]# cat /usr/local/ddos/ddos.conf

Paths of the script and other files

PROGDIR="/usr/local/ddos"
PROG="/usr/local/ddos/ddos.sh"
IGNORE_IP_LIST="/usr/local/ddos/ignore.ip.list" //IP地址白名單
CRON="/etc/cron.d/ddos.cron" //定時執行程式
APF="/etc/apf/apf"
IPT="/sbin/iptables"

frequency in minutes for running the script
Caution: Every time this setting is changed, run the script with --cron
option so that the new frequency takes effect

//檢查時間間隔,預設1分鐘。設定檢測時間間隔,預設是分鐘,由於系統使用crontab功能,最小單位是分鐘

FREQ=1

How many connections define a bad IP? Indicate that below.

NO_OF_CONNECTIONS=150
//最大連線數,超過這個數IP就會被遮蔽,一般預設即可。預設是150,這是一個經驗值,如果伺服器效能比較高,可以設定200以上,以避免誤殺

APF_BAN=1 (Make sure your APF version is atleast 0.96)
APF_BAN=0 (Uses iptables for banning ips instead of APF)

APF_BAN=0
//使用APF還是iptables遮蔽IP。推薦使用iptables,將APF_BAN的值改為0即可。設定為1表示使用APF,如果使用APF則需要先安裝,centos中預設就沒有安裝

KILL=0 (Bad IPs are'nt banned, good for interactive execution of script)

KILL=1
//是否遮蔽IP,預設即可

An email is sent to the following address when an IP is banned.
Blank would suppress sending of mails

EMAIL_TO="root"
//當IP被遮蔽時給指定郵箱傳送郵件,推薦使用,換成自己的郵箱即可。如果不希望傳送郵件,設定為空,即EMAIL_TO=""

Number of seconds the banned ip should remain in blacklist.

BAN_PERIOD=600
//禁用IP時間(鎖定ip的時間),預設600秒,可根據情況調整 需要注意的是:
DDos default安裝完成後在/usr/local/ddos目錄下產生了ddos.conf、ddos.sh、ignore.ip.list和LICENSE這四個檔案,其中:
ddos.conf是配置檔案,ddos.sh是一個Shell檔案,ignore.ip.list是存放忽略IP的檔案,LICENSE是版權宣告檔案
,安裝完成後還在/etc/cron.d/下生產了ddos.cron檔案,內容如下:

[[email protected] ~]# cat /etc/cron.d/ddos.cron
SHELL=/bin/sh
0-59/1 * * * * root /usr/local/ddos/ddos.sh >/dev/null 2>&1

意思是每隔一分鐘執行一下/usr/local/ddos/ddos.sh,這個指令碼是關鍵!
這個cron任務是依賴ddos.conf檔案中的NO_OF_CONNECTIONS變數產生的
,如果修改了此值,可以通過執行如下命令更新(實際也是在安裝是運行了如下命令):
[[email protected] ~]# /usr/local/ddos/ddos.sh -c
Stopping crond: [ OK ]
Starting crond: [ OK ]
Stopping crond: [ OK ]
Starting crond: [ OK ]

或者
[[email protected] ~]# /usr/local/ddos/ddos.sh --cron
Stopping crond: [ OK ]
Starting crond: [ OK ]
Stopping crond: [ OK ]
Starting crond: [ OK ]3)DDos default選項

/usr/local/ddos/ddos.sh -h #檢視選項

/usr/local/ddos/ddos.sh -k n #殺掉連線數大於n的連線。n預設為配置檔案的NO_OF_CONNECTIONS

比如:
[[email protected] ~]# /usr/local/ddos/ddos.sh -k 150
2 103.110.186.75
1 servers)
1 Address

/usr/local/ddos/ddos.sh -c #按照配置檔案建立一個執行計劃。使得ddos.conf檔案配置後生效

4)分享一個防禦DDOS攻擊的shell指令碼
Linux伺服器中一旦受到DDOS的攻擊(比如IDC機房伺服器被攻擊了,關機,拔網線,降流量),目前只能通過封IP來源來暫時解決。
然而IP來源變化多端,光靠手工來新增簡直是惡夢,所以還是想辦法寫個shell指令碼來定時處理,這才是比較靠譜的辦法。

[[email protected] ~]# mkdir /root/bin
[[email protected] ~]# cat /root/bin/dropip.sh //此指令碼自動提取攻擊ip,然後自動遮蔽

!/bin/bash

/bin/netstat -na|grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -rn|head -10|grep -v -E '192.168|127.0'|awk '{if ($2!=null && $1>4) {print $2}}'>/tmp/dropip
for i in $(cat /tmp/dropip)
do
/sbin/iptables -A INPUT -s $i -j DROP
echo “$i kill at date”>>/var/log/ddos
done

以上指令碼中最重要的是第二行,即:
獲取ESTABLISHED連線數最多的前10個ip並寫入臨時檔案/tmp/dropip,排除了內部ip段192.168|127.0開頭的
.通過for迴圈將dropip裡面的ip通過iptables全部drop掉,然後寫到日誌檔案/var/log/ddos。給指令碼新增執行許可權
[[email protected] ~]# chmod +x /root/bin/dropip.sh

新增到計劃任務,每分鐘執行一次
[[email protected] ~]#crontab -e
/1 * * * /root/bin/dropip.sh


下面是針對連線數遮蔽IP

!/bin/sh

/bin/netstat -ant |grep 80 |awk '{print $5}' |awk -F":" '{print $1}' |sort |uniq -c |sort -rn |grep -v -E '192.168|127.0' |awk '{if ($2!=null && $1>50)}' > /root/drop_ip.txt
for i in cat /root/drop_ip.txt
do
/sbin/iptables -I INPUT -s $i -j DROP;
done

5)Linux下使用safedog(安全狗)軟體防禦DDOS攻擊:

[[email protected] ~]# setenforce 0 //關閉selinux,否則不能安裝成功
[[email protected] ~]# getenforce //永久關閉selinux需要配置/etc/sysconfig/selinux檔案,並重啟機器生效!!
Permissive

安裝(nginx版)安全狗(safedog)
[[email protected] ~]# wget http://safedog.cn/safedogwz_linux_Nginx64.tar.gz
[[email protected] ~]# tar -zvxf safedogwz_linux_Nginx64.tar.gz
[[email protected] ~]# cd safedogwz_linux_Nginx64
[[email protected] safedogwz_linux_Nginx64]# chmod 755 install.py
[[email protected] safedogwz_linux_Nginx64]# ls
install_files install.py uninstall.py
[[email protected] safedogwz_linux_Nginx64]# ./install.py -A //解除安裝安全狗就用uninstall.py
.......
step 3.5, start service... [ok]
step 3.6, save safedog install info... [ok]
Tips:
(1)Run the command to setup Server Defense Module: sdui
(2)Explore more features by tapping the command to join Cloud Management Center (fuyun.safedog.cn) with your account: sdcloud -h

If you need any help about installation,please tap the command: ./install.py -h
Install Completely!溫馨提示:
1)安裝完成後,記得一定要重新啟動Nginx服務,網站安全狗軟體即可生效。
2)執行時,安裝指令碼預設將自動獲取Nginx服務的安裝路徑;若自動獲取失敗則將提示輸入Nginx服務的安裝路徑(絕對路徑)
,需要根據所安裝的Nginx的目錄,填寫真實的安裝路徑。
3)當出現提示:Are you sure to uninstall?[y/n]時,輸入yhttps://cloud.tencent.com/developer/article/1027280