歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux管理 >> Linux維護 >> linux檢測及防止DDOS攻擊的技巧

linux檢測及防止DDOS攻擊的技巧

日期:2017/3/2 10:27:12   编辑:Linux維護

身為一個網站的站長,不僅要保證網站的流量提升,還要預防DDOS攻擊,那麼在Linux系統下要如何檢測DDOS攻擊呢?又該如何防止DDOS攻擊呢?這都是一門學問。

1、利用netstat 工具來檢測查看SYN連接

netstat -n -p -t

Active Internet connections (w/o servers)

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

tcp 0 0 192.168.0.200:5050 192.168.0.38:48892 TIME_WAIT -

tcp 0 0 192.168.0.200:5050 192.168.0.38:36604 TIME_WAIT -

tcp 0 0 192.168.0.200:5050 192.168.0.38:52988 TIME_WAIT -

tcp 0 0 192.168.0.200:5050 192.168.0.38:38911 TIME_WAIT -

tcp 0 0 192.168.0.200:5050 192.168.0.38:58623 TIME_WAIT -

tcp 0 0 192.168.0.200:43690 192.168.0.200:61616 ESTABLISHED 10415/java

當然我上面的都是正常連接。當然TIME_WAIT如果占比過多,肯定也是不正常的。(要麼受到了攻擊,要麼需要參數調優。)

而受到DDOS惡意攻擊的情況下會在系統中看到的,很多連接處於SYN_RECV狀態(在WINDOWS系統中是SYN_RECEIVED狀態)源IP地址都是隨機的,表明這是一種帶有IP欺騙的SYN攻擊。

tcp 0 10.11.11.11:23 124.173.152.8:25882 SYN_RECV-

tcp 0 10.11.11.11:23 236.15.133.204:2577 SYN_RECV-

tcp 0 10.11.11.11:23 127.160.6.129:51748 SYN_RECV-

具體主機的端口狀態有以下幾種:

CLOSED:無連接是活動的或正在進行

LISTEN:服務器在等待進入呼叫

SYN_RECV:一個連接請求已經到達,等待確認

SYN_SENT:應用已經開始,打開一個連接

ESTABLISHED:正常數據傳輸狀態

FIN_WAIT1:應用說它已經完成

FIN_WAIT2:另一邊已同意釋放

ITMED_WAIT:等待所有分組死掉

CLOSING:兩邊同時嘗試關閉

TIME_WAIT:另一邊已初始化一個釋放

LAST_ACK:等待所有分組死掉

稍微更詳細的說明可以看下百度百科上對ESTABLISHED狀態的解釋及延伸。

具體SYN_RECV狀態的統計比較多,我這裡介紹兩種腳本的寫法:

netstat -an | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’

上面的腳本會列出所有狀態的連接數。

netstat -n -p -t | grep SYN_RECV | grep :80 | wc -l

當然,上面80是特指web站點受到DDOS攻擊。

2、LINUX下DDOS SYN攻擊的防范

防范也主要從兩方面入手,一是sysctl的自身的關於syn方面的配置,二是防火牆策略上。

sysctl -w net.ipv4.tcp_syncookies=1 # tcp syncookie,默認關閉

sysctl -w net.ipv4.tcp_max_syn_backlog=1280 # syn隊列,默認1024,》 1280可能工作不穩定,需要修改內核源碼參數

sysctl -w net.ipv4.tcp_synack_retries=2 # syn-ack握手狀態重試次數,默認5,遭受syn-flood攻擊時改為1或2

sysctl -w net.ipv4.tcp_syn_retries=2 # 外向syn握手重試次數,默認4

以上四處是網上經常提到的幾個地方,當然還有未提到的也可以通過下列命令查看。

[root@web3 nginx]# sysctl -a|grep syn

net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv = 60

net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_sent = 120

net.ipv4.tcp_max_syn_backlog = 1024

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_synack_retries = 5

net.ipv4.tcp_syn_retries = 5

fs.quota.syncs = 25

如未受到攻擊,上面的參數不建議修改。據說有增加主機的不穩定性的風險。

防火牆策略:

#縮短SYN- Timeout時間:

iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

iptables -A INPUT -i eth0 -m limit --limit 1/sec --limit-burst 5 -j ACCEPT

#每秒最多3個syn封包進入:

iptables -N syn-floodiptables -A INPUT -p tcp --syn -j syn-flood

iptables -A syn-flood -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j RETURNiptables -A syn-flood -j REJECT

方法二,利用iptables防ddos攻擊更詳細版本

RH 8.0以上開始啟用iptables替代ipchains,兩者非常類似,也有差別的地方。

* 啟用iptables

如果/etc/sysconfig/下沒有iptables文件,可以創建:

# Firewall configuration written by lokkit

# Manual customization of this file is not recommended.

# Note: ifup-post will punch the current nameservers through the

# firewall; such entries will *not* be listed here.

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

:RH-Lokkit-0-50-INPUT - [0:0]

-A INPUT -j RH-Lokkit-0-50-INPUT

-A RH-Lokkit-0-50-INPUT -i lo -j ACCEPT

-A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport ftp -j ACCEPT

-A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport ssh -j ACCEPT

-A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport http -j ACCEPT

-A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport smtp -j ACCEPT

-A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport pop3 -j ACCEPT

-A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport mysql -j ACCEPT

-A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport 2001 -j ACCEPT

-A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport domain -j ACCEPT

-A RH-Lokkit-0-50-INPUT -p udp -m udp --dport domain -j ACCEPT

-A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport 0:1023 --syn -j REJECT

-A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport 2049 --syn -j REJECT

-A RH-Lokkit-0-50-INPUT -p udp -m udp --dport 0:1023 -j REJECT

-A RH-Lokkit-0-50-INPUT -p udp -m udp --dport 2049 -j REJECT

-A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport 6000:6009 --syn -j REJECT

-A RH-Lokkit-0-50-INPUT -p tcp -m tcp --dport 7100 --syn -j REJECT

COMMIT

以上配置允許了ftp, ssh, http, smtp, pop3, mysql, 2001(Prima的ACA端口),domain端口。

* 啟動iptables

/etc/init.d/iptables start

* 設置iptables為自動啟動

chkconfig --level 2345 iptables on

* 用iptables屏蔽IP

iptables -I RH-Lokkit-0-50-INPUT 1 -p tcp -m tcp -s 213.8.166.227 --dport 80 --syn -j REJECT

注意到,和ipchains的區別是:

-I 後面跟的規則名稱的參數和ipchains不同,不是統一的input,而是在/etc/sysconfig/iptables裡定義的那個

多了-m tcp

指定端口的參數是--dport 80

多了--syn參數,可以自動檢測sync攻擊

使用iptables禁止ping:

-A INPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 2 -j ACCEPT

-A INPUT -p icmp -m icmp --icmp-type 8 -j REJECT --reject-with icmp-port-unreachable

允許某ip連接

-I RH-Firewall-1-INPUT 1 -p tcp -m tcp -s 192.168.0.51 --syn -j ACCEPT

注:具體的端口需要根據自己的網絡來進行相應的修改。

方法三,利用自動屏蔽DDOS攻擊者IP的軟件:DDoS deflate

、安裝DDoS deflate

wget http://www.inetbase.com/scripts/ddos/install.sh //下載DDoS deflate

chmod 0700 install.sh //添加權限

。/install.sh //執行

2、配置DDoS deflate

下面是DDoS deflate的默認配置位於/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分鐘

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

NO_OF_CONNECTIONS=150 //最大連接數,超過這個數IP就會被屏蔽,一般默認即可

##### 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=1 //使用APF還是iptables。推薦使用iptables,將APF_BAN的值改為0即可。

##### 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被屏蔽時給指定郵箱發送郵件,推薦使用,換成自己的郵箱即可

##### Number of seconds the banned ip should remain in blacklist.

BAN_PERIOD=600 //禁用IP時間,默認600秒,可根據情況調整用戶可根據給默認配置文件加上的注釋提示內容,修改配置文件。

用戶可根據給默認配置文件加上的注釋提示內容,修改配置文件。

查看/usr/local/ddos/ddos.sh文件的第117行

netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -nr 》 $BAD_IP_LIST

修改為以下代碼即可!

netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sed -n ‘/[0-9]/p’ | sort | uniq -c | sort -nr 》 $BAD_IP_LIST

用戶也可以用Web壓力測試軟件測試一下效果,相信DDoS deflate還是能給你的VPS或服務器抵御一部分DDOS攻擊,給你的網站更多的保護。

上面就是Linux檢測和防止DDOS攻擊的方法介紹了,防范勝於治療,及早防止DDOS攻擊比DDOS攻擊後再處理更方便。

Copyright © Linux教程網 All Rights Reserved