Linux安全之三大攻擊(SYN,DDOS,CC)原理及處理

樑東昇發表於2018-04-11

TCP自從1974年被發明出來之後,歷經30多年發展,目前成為最重要的網際網路基礎協議,但TCP協議中也存在一些缺陷。
SYN攻擊就是利用TCP協議的缺陷,來導致系統服務停止正常的響應。
SYN攻擊原理

TCP在傳遞資料前需要經過三次握手,SYN攻擊的原理就是向伺服器傳送SYN資料包,並偽造源IP地址。
伺服器在收到SYN資料包時,會將連線加入backlog佇列,並向源IP傳送SYN-ACK資料包,並等待ACK資料包,以完成三次握手建立連線。
由於源IP地址是偽造的不存在主機IP,所以伺服器無法收到ACK資料包,並會不斷重發,同時backlog佇列被不斷被攻擊的SYN連線佔滿,導致無法處理正常的連線。
SYN攻擊處理

針對SYN攻擊的幾個環節,提出相應的處理方法:
方式1:減少SYN-ACK資料包的重發次數(預設是5次):
sysctl -w net.ipv4.tcp_synack_retries=3
sysctl -w net.ipv4.tcp_syn_retries=3
方式2:使用SYN Cookie技術:
sysctl -w net.ipv4.tcp_syncookies=1
方式3:增加backlog佇列(預設是1024):
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
方式4:限制SYN併發數:
iptables -A INPUT -p tcp –syn -m limit –limit 1/s -j ACCEPT –limit 1/s
SYN攻擊模擬

可以用之前介紹的hping工具來模擬SYN攻擊,參見《Linux常用網路工具:hping高階主機掃描》;
還有一款synkill也可以用來模擬SYN攻擊。

使用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檔案配置後生效
CC攻擊

cc攻擊主要攻擊頁面,模擬很多使用者來不斷的訪問網站,導致系統資源被大量佔用,那麼在Linux系統中,我們要如何知道自己是否被cc攻擊了呢?

檢視所有80埠的連線數
  netstat -nat|grep -i “80”|wc -l
  對連線的IP按連線數量進行排序
  netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n
  檢視TCP連線狀態
  netstat -nat |awk ‘{print $6}’|sort|uniq -c|sort -rn
  netstat -n | awk ‘/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}’
  netstat -n | awk ‘/^tcp/ {++state[$NF]}; END {for(key in state) print key,“ ”,state[key]}’
  netstat -n | awk ‘/^tcp/ {++arr[$NF]};END {for(k in arr) print k,“ ”,arr[k]}’
  netstat -n |awk ‘/^tcp/ {print $NF}’|sort|uniq -c|sort -rn
  netstat -ant | awk ‘{print $NF}’ | grep -v ‘[a-z]’ | sort | uniq -c
  檢視80埠連線數最多的20個IP
  netstat -anlp|grep 80|grep tcp|awk ‘{print $5}’|awk -F: ‘{print $1}’|sort|uniq -c|sort -nr|head -n20
  netstat -ant |awk ‘/:80/{split($5,ip,“:”);++A[ip[1]]}END{for(i in A) print A,i}’ |sort -rn|head -n20
  用tcpdump嗅探80埠的訪問看看誰最高
  tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F“。” ‘{print $1“。”$2“。”$3“。”$4}’ | sort | uniq -c | sort -nr |head -20
  查詢較多time_wait連線
  netstat -n|grep TIME_WAIT|awk ‘{print $5}’|sort|uniq -c|sort -rn|head -n20
  查詢較多的SYN連線
  netstat -an | grep SYN | awk ‘{print $5}’ | awk -F: ‘{print $1}’ | sort | uniq -c | sort -nr | more
  封單個IP的命令是:
  iptables -I INPUT -s 211.1.0.0 -j DROP
  封IP段的命令是:
  iptables -I INPUT -s 211.1.0.0/16 -j DROP
  iptables -I INPUT -s 211.2.0.0/16 -j DROP
  iptables -I INPUT -s 211.3.0.0/16 -j DROP
  封整個段的命令是:
  iptables -I INPUT -s 211.0.0.0/8 -j DROP
  封幾個段的命令是:
  iptables -I INPUT -s 61.37.80.0/24 -j DROP
  iptables -I INPUT -s 61.37.81.0/24 -j DROP
  想在伺服器啟動自執行的話有三個方法:
  1、把它加到/etc/rc.local中
  2、iptables-save 》/etc/sysconfig/iptables可以把你當前的iptables規則放到/etc/sysconfig/iptables中,系統啟動iptables時自動執
  行。
  3、service iptables save 也可以把你當前的iptables規則放/etc/sysconfig/iptables中,系統啟動iptables時自動執行。
  後兩種更好此,一般iptables服務會在network服務之前啟來,更安全。
  解封的話:
  iptables -D INPUT -s IP地址 -j REJECT
  iptables -F 全清掉了


相關文章