DDOS的全稱是Distributed Denial of Service,即"分佈式拒絕服務攻擊",是指擊者利用大量「肉雞」對攻擊目標發動大量的正常或非正常請求、耗盡目標主機資源或網絡資源,從而使被攻擊的主機不能爲合法用戶提供服務。linux
DDOS攻擊的本質是:
利用木桶原理,尋找利用系統應用的瓶頸;阻塞和耗盡;當前問題:用戶的帶寬小於攻擊的規模,噪聲訪問帶寬成爲木桶的短板。nginx
能夠參考下面的例子理解下DDOS攻擊。
1)某飯店能夠容納100人同時就餐,某日有個商家惡意競爭,僱傭了200人來這個飯店坐着不吃不喝,致使飯店滿滿當當沒法正常營業。(DDOS攻擊成功)
2)老闆立即大怒,派人把不吃不喝影響正常營業的人全都轟了出去,且再也不讓他們進來搗亂,飯店恢復了正常營業。(添加規則和黑名單進行DDOS防護,防護成功)
3)主動攻擊的商家心存不滿,此次請了五千人逐批次來搗亂,致使該飯店再次沒法正常營業。(增長DDOS流量,改變攻擊方式)
4)飯店把那些搗亂的人轟出去只後,另外一批接踵而來。此時老闆將飯店營業規模擴大,該飯店可同時容納1萬人就餐,5000人同時來搗亂飯店營業也不會受到影響。(增長硬防與其抗衡)web
DDOS攻擊只不過是一個概稱,其下有各類攻擊方式,好比:"CC攻擊、SYN攻擊、NTP攻擊、TCP攻擊、DNS攻擊等等",如今DDOS發展變得愈來愈可怕,NTP服務放大攻擊漸漸成爲主流了,這意味着能夠將每秒的攻擊流量放大幾百倍,好比每秒1G的SYN碎片攻擊換成NTP放大攻擊,就成爲了200G或者更多。
--------------------------------------------------順便介紹下NTP服務放大攻擊--------------------------------------------------------shell
什麼事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攻擊案例:vim
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攻擊行動負責。centos
對於DDOS攻擊的簡單防禦措施: 安全
1)關閉沒必要要的服務和端口;
2)限制同一時間內打開的syn半鏈接數目;
3)縮短syn半鏈接的超時時間;
4)及時安裝系統補丁;
5)禁止對主機非開放服務的訪問;
6)啓用防火牆防DDOS屬性。硬件防火牆價格比較昂貴,能夠考慮利用Linux系統自己提供的防火牆功能來防護。
7)另外也能夠安裝相應的防禦軟件,這裏強烈建議安裝安全狗軟件,防禦性能不錯,而且免費。
8)購買DDOS防護產品,好比阿里雲盾的DDOS防護中的高防IP,這個使用起來,效果也很給力。bash
接下來講下Linux系統下預防DDOS攻擊的操做:服務器
Linux服務器在運行過程當中可能會受到黑客攻擊,常見的攻擊方式有SYN,DDOS等。
經過更換IP,查找被攻擊的站點可能避開攻擊,可是中斷服務的時間比較長。比較完全的解決方法是添置硬件防火牆,可是硬件防火牆價格比較昂貴。能夠考慮利用Linux系統自己提供的防火牆功能來防護。
SYN攻擊是利用TCP/IP協議3次握手的原理,發送大量的創建鏈接的網絡包,但不實際創建鏈接,最終致使被攻擊服務器的網絡隊列被佔滿,沒法被正經常使用戶訪問。
Linux內核提供了若干SYN相關的配置,加大SYN隊列長度能夠容納更多等待鏈接的網絡鏈接數,打開SYN Cookie功能能夠阻止部分SYN攻擊,下降重試次數也有必定效果。
而DDOS則是經過使網絡過載來干擾甚至阻斷正常的網絡通信,經過向服務器提交大量請求,使服務器超負荷,阻斷某一用戶訪問服務器阻斷某服務與特定系統或我的的通信。能夠經過配置防火牆或者使用腳本工具來防範DDOS攻擊;cookie
1)優化幾個sysctl內核參數:
[root@test3-237 ~]# vim /etc/sysctl.conf
......
net.ipv4.tcp_max_syn_backlog = 4096 #表示SYN隊列的長度,加大隊列長度能夠容納更多等待鏈接的網絡鏈接數
net.ipv4.tcp_syncookies = 1 #表示開啓SYN Cookies功能。當出現SYN等待隊列溢出時,啓用cookies來處理,可防範少許SYN攻擊,默認爲0,表示關閉,1表示打開;
net.ipv4.tcp_synack_retries = 2 #下面這兩行表示定義SYN重試次數
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表示"打開"
......
[root@test3-237 ~]# sysctl -p #使上面配置生效
2)利用linux系統自帶iptables防火牆進行預防:
先查看服務器上鍊接web端口(好比80端口)的哪一個ip是最多的,若是發現可疑ip,就果斷將其斷開與服務器鏈接
查看80端口的鏈接狀況
[root@test3-237 ~]# netstat -an | grep ":80" | grep ESTABLISHED
下面的命令表示獲取服務器上ESTABLISHED鏈接數最多的前10個ip,排除了內部ip段192.168|127.0開頭的。
[root@test3-237 ~]# /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.20五、124.65.197.15四、111.205.224.15的這三個ip的包丟棄
[root@test3-237 ~]# iptables -A INPUT -s 140.205.140.205 -p tcp -j DROP
[root@test3-237 ~]# iptables -A INPUT -s 124.65.197.154 -p tcp -j DROP
[root@test3-237 ~]# iptables -A INPUT -s 111.205.224.15 -p tcp -j DROP
[root@test3-237 ~]# service iptables save
[root@test3-237 ~]# service iptables restart
不過上面的方法對於僞造源IP地址的SYN FLOOD攻擊就無效了!
-------------------------------------其餘預防攻擊的設置-------------------------------------
防止同步包洪水(Sync Flood),縮短SYN-Timeout時間:
[root@test3-237 ~]# iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
[root@test3-237 ~]# iptables -A INPUT -i eth0 -m limit --limit 1/sec --limit-burst 5 -j ACCEPT
其中:
--limit 1/s 限制syn併發數每秒1次,能夠根據本身的須要修改防止各類端口掃描
[root@test3-237 ~]# iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
Ping洪水攻擊(Ping of Death)
[root@test3-237 ~]# iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
控制單個IP的最大併發鏈接數。
以下設置表示:容許單個IP的最大鏈接數爲 30
[root@test3-237 ~]# iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j REJECT
控制單個IP在必定的時間(好比60秒)內容許新創建的鏈接數。
以下設置表示:單個IP在60秒內只容許最多新建30個鏈接
[root@test3-237 ~]# iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 30 -j REJECT
[root@test3-237 ~]# 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
[root@test3-237 ~]# cat /sys/module/xt_recent/parameters/ip_pkt_list_tot
20
[root@test3-237 ~]# echo 50 > /sys/module/xt_recent/parameters/ip_pkt_list_tot
[root@test3-237 ~]# cat /sys/module/xt_recent/parameters/ip_pkt_list_tot
50
---------------------------------------------------------------------------------------------------
禁止ping(即禁止從外部ping這臺服務器):
[root@test3-237 ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
用iptables屏蔽IP(以下禁止213.8.166.237鏈接本機的80端口)
[root@test3-237 ~]# 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端口)
[root@test3-237 ~]# 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攻擊?
[root@test3-237 ~]# 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安裝腳本,並執行安裝。
[root@test3-237 ~]# wget http://www.inetbase.com/scripts/ddos/install.sh
[root@test3-237 ~]# chmod 0700 install.sh
[root@test3-237 ~]# ./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 ,內容以下:
[root@test3-237 ~]# 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
FREQ=1 //檢查時間間隔,默認1分鐘。設置檢測時間間隔,默認是分鐘,因爲系統使用crontab功能,最小單位是分鐘
##### 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 (Recommended setting)
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文件,內容以下:
[root@test3-237 ~]# 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變量產生的,若是修改了此值,能夠經過運行以下命令更新(實際也是在安裝是運行了以下命令):
[root@test3-237 ~]# /usr/local/ddos/ddos.sh -c
Stopping crond: [ OK ]
Starting crond: [ OK ]
Stopping crond: [ OK ]
Starting crond: [ OK ]
或者
[root@test3-237 ~]# /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
好比:
[root@test3-237 ~]# /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腳原本定時處理,這纔是比較靠譜的辦法。
[root@test3-237 ~]# mkdir /root/bin
[root@test1-237 ~]# 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。
給腳本添加執行權限
[root@test1-237 ~]# chmod +x /root/bin/dropip.sh
添加到計劃任務,每分鐘執行一次
[root@test1-237 ~]#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攻擊:
[root@test3-237 ~]# setenforce 0 //關閉selinux,不然不能安裝成功 [root@test3-237 ~]# getenforce //永久關閉selinux須要配置/etc/sysconfig/selinux文件,並重啓機器生效!! Permissive 安裝(nginx版)安全狗(safedog) [root@test3-237 ~]# wget http://safedog.cn/safedogwz_linux_Nginx64.tar.gz [root@test3-237 ~]# tar -zvxf safedogwz_linux_Nginx64.tar.gz [root@test3-237 ~]# cd safedogwz_linux_Nginx64 [root@test3-237 safedogwz_linux_Nginx64]# chmod 755 install.py [root@bastion-IDC safedogwz_linux_Nginx64]# ls install_files install.py uninstall.py [root@test3-237 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]時,輸入y