------------------------本文爲本身實踐所總結,概念性的東西不全,這裏粗劣提下而已,網上不少,本文主要說下目前較流行的syn洪水攻擊和cc攻擊-------------------------------------web
SYN Flood是一種廣爲人知的DoS(拒絕服務攻擊)是DDoS(分佈式拒絕服務攻擊)的方式之一,這是一種利用TCP協議缺陷,發送大量僞造的TCP鏈接請求,從而使得被攻擊方資源耗盡(CPU滿負荷或內存不足)的攻擊方式(TCP協議的缺陷,因此沒辦法根除,除非重作TCP協議,目前不可能)。vim
正常原理是:一、TCP三次握手,客戶端向服務器端發起鏈接的時候發送一個包含SYN標誌的TCP報文,SYN即同步(Synchronize),同步報文會指明客戶端使用的端口以及TCP鏈接的初始序號服務器
二、服務器在收到客戶端的SYN報文後,將返回一個SYN+ACK的報文,表示客戶端的請求被接受,同時TCP序號被加一,ACK即確認(Acknowledgment),夾帶也發送一個SYN包給客戶端,而且服務器分配資源給該鏈接。cookie
三、客戶端也返回一個確認報文ACK給服務器端,一樣TCP序列號被加一,到此一個TCP鏈接完成。網絡
syn flood攻擊利用TCP三次握手的缺陷,在TCP鏈接的第三次握手中,當服務器收到客戶端的SYN包後而且返回客戶端ACK+SYN包,因爲客戶端是假冒IP,對方永遠收不到包且不會迴應第三個握手包。致使被攻擊服務器保持大量SYN_RECV狀態的「半鏈接」,而且會有重試默認5次迴應第二個握手 包,塞滿TCP等待鏈接隊列,資源耗盡(CPU滿負荷或內存不足),讓正常的業務請求鏈接不進來。一般SYN Flood會和ARP欺騙一塊兒使用,這樣就形成了SYN攻擊。tcp
CC攻擊(Challenge Collapsar)是DDOS(分佈式拒絕服務)的一種,也是一種常見的網站攻擊方法,攻擊者經過代理服務器或者肉雞(被黑客黑的電腦)向受害主機不停地發大量數據包,形成對方服務器資源耗盡,一直到宕機崩潰。CC主要是用來攻擊頁面的,每一個人都有這樣的體驗:當一個網頁訪問的人數特別多的時候,打開網頁就慢了,CC就是模擬多個用戶(多少線程就是多少用戶)不停地進行訪問那些須要大量數據操做(就是須要大量CPU時間)的頁面,形成服務器資源的浪費,CPU長時間處於100%,永遠都有處理不完的鏈接直至就網絡擁塞,正常的訪問被停止。分佈式
當你發現發服務器很卡,web訪問很慢 甚至連SSH操做都開始有點卡的時候,你就要很是注意了。工具
檢測能夠這樣作:網站
top 查看CPU使用率和CPU負載狀況spa
負載通常小於CPU核數*0.7算正常,負載內等於或者稍大於核數。說明CPU負載開始嚴重了,若是超過,說明有問題。
看看哪些程序CPU使用率較高,是否爲正常佔用,可使用 pidof 進程名 查看該進程名的全部進程號,而後ll /proc/進程號/exe、fd查看是否爲正常信息。
netstat查看端口狀態
netstat -n | grep "^tcp" | awk '{print $6}' | sort | uniq -c | sort -n
1 SYN_RECV
13 FIN_WAIT1
64 TIME_WAIT
149 ESTABLISHED
能夠查看當前鏈接狀態的數量,從而進行判斷。
還有vmstat、sar、等檢測命令,網上有使用方法!
第一種:縮短SYN Timeout時間,因爲SYN Flood攻擊的效果取決於服務器上保持的SYN半鏈接數,這個值=SYN攻擊的頻度 x SYN Timeout,因此經過縮短從接收到SYN報文到肯定這個報文無效並丟棄改鏈接的時間。
第二種:設置SYN Cookie,就是給每個請求鏈接的IP地址分配一個Cookie,若是短期內連續受到某個IP的重複SYN報文,就認定是受到了攻擊,之後從這個IP地址來的包會被丟棄。
(缺陷:縮短SYN Timeout時間僅在對方攻擊頻度不高的狀況下生效,SYN Cookie更依賴於對方使用真實的IP地址,若是攻擊者以數萬/秒的速度發送SYN報文,同時利用ARP欺騙隨機改寫IP報文中的源地址,以上的方法將毫無用武之地。)
vim /etc/sysctl.conf
增長或者修改以下:(修改保存後記得sysctl -p 使之生效)
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_max_syn_backlog = 262144
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_keepalive_time = 30
iptables性質防護:
限制syn的請求速度(這個方式須要調節一個合理的速度值,否則會影響正經常使用戶的請求)
iptables -N syn-flood (新建一條鏈)
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -A syn-flood -p tcp -m limit --limit 2/s --limit-burst 50 -j RETURN
iptables -A syn-flood -j DROP
Tips:攻擊這東西只能防護不能徹底根除!只能緩解,下降到最低的風險。有錢能夠上第三方公司的產品服務!嘿嘿。
一、通常而言,CC攻擊都是真實的IP,因此通常的作法通俗點就是封IP
二、更改web端口,默認CC攻擊都是攻擊服務器的80端口
三、域名欺騙,咱們可使用cdn等加速工具代理咱們的服務器,從而實現防護,(網上有人說把域名解析到127.0.0.1 讓攻擊者本身攻擊本身,不知道有沒有用,沒試過。並且正式業務,你怎麼可能去作這樣的解析,那業務怎麼辦?)
使用抓包命令,抓取訪問服務器80的IP數
tcpdump -tnn dst port 80 -c 100 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -n -r |head -20
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
100 packets captured
101 packets received by filter
0 packets dropped by kernel
78 IP 221.239.28.142
17 IP 124.65.101.82
13 IP 14.123.162.69
7 IP 183.238.49.188
7 IP 120.234.19.186
能夠看到221.239.28.142的包最多,因此咱們進行封IP處理。
iptables -I INPUT -s 221.239.28.142 -j REJECT
#防護太多DOS攻擊鏈接,能夠容許外網每一個IP最多15個初始鏈接,超過的丟棄,第二條是在第一條的基礎上容許已經創建的鏈接和子鏈接容許
iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 --connlimit-mask 32 -j DROP (--connlimit-mask 32爲主機掩碼,32即爲一個主機ip,也能夠是網段)
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
#抵禦DDOS ,容許外網最多24個初始鏈接,而後服務器每秒新增12個,訪問太多超過的丟棄,第二條是容許服務器內部每秒1個初始鏈接進行轉發
iptables -A INPUT -p tcp --syn -m limit --limit 12/s --limit-burst 24 -j ACCEPT
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
#容許單個IP訪問服務器的80端口的最大鏈接數爲 20
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 -j REJECT
#對訪問本機的22端口進行限制,每一個ip每小時只能鏈接5次,超過的拒接,1小時候從新計算次數
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --rcheck --seconds 3600 --hitcount 5 -j DROP
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --set -j ACCEPT
(上面recent規則只適用於默認規則爲DROP中,若是要適用默認ACCEPT的規則,須要--set放前面 而且無-j ACCEPT)