服務(wù)器防御DDOS攻擊方案
一、DDOS防范
1、一般的DDOS攻擊可以修改/proc/sys/net/ipv4/tcp_max_syn_backlog里的參數(shù)就行了,默認參數(shù)一般都很小,設(shè)為8000以上,一般的DDOS攻擊就可以解決了。
2、如果上升到timeout階段,可以將/proc/sys/net/ipv4/tcp_fin_timeout設(shè)小點。
3、比較徹底的解決方法是添置硬件防火墻。不過,硬件防火墻價格比較昂貴?梢钥紤]利用Linux系統(tǒng)本身提供的防火墻功能來防御。
①防止syn攻擊(DDOOS攻擊的一種)
代碼如下
iptables -I INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
iptables -I FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT 防止同步包洪水(Sync Flood)
②防止各種端口掃描
代碼如下
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
③Ping洪水攻擊(Ping of Death)
代碼如下
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
④、Linux下設(shè)置
如果你的服務(wù)器配置不太好,TCPTIME_WAIT套接字數(shù)量達到兩、三萬,服務(wù)器很容易被拖死。通過修改Linux內(nèi)核參數(shù),可以減少服務(wù)器的TIME_WAIT套接字數(shù)量。
TIME_WAIT查看命令: netstat-an | grep "TIME_WAIT" | wc -l
在Linux下,如CentOS,可以通過修改/etc/sysctl.conf文件來達到目的。
查看SYN相關(guān)的配置
/sbin/sysctl -a |grep syn
vim /etc/sysctl.conf
增加以下幾行:以下是代碼片段:
代碼如下
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_fin_timeout 修改系統(tǒng)默認的TIMEOUT 時間。
net.ipv4.tcp_keepalive_time= 1200 表示當keepalive起用的時候,TCP發(fā)送keepalive消息的頻度。缺省是2小時,改為20分鐘。
net.ipv4.tcp_syncookies= 1 表示開啟SYNCookies。當出現(xiàn)SYN等待隊列溢出時,啟用cookies來處理,可防范少量SYN攻擊,默認為0,表示關(guān)閉;
net.ipv4.tcp_tw_reuse= 1 表示開啟重用。允許將TIME-WAIT sockets重新用于新的TCP連接,默認為0,表示關(guān)閉;
net.ipv4.tcp_tw_recycle= 1 表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關(guān)閉;
net.ipv4.ip_local_port_range= 10000 65000 表示用于向外連接的端口范圍。缺省情況下很。32768到61000,改為10000到65000。(注意:這里不要將最低值設(shè)的太低,否則可能會占用掉正常的端口!)
net.ipv4.tcp_max_syn_backlog= 8192 表示SYN隊列的長度,默認為1024,加大隊列長度為8192,可以容納更多等待連接的網(wǎng)絡(luò)連接數(shù)。
net.ipv4.tcp_max_tw_buckets= 5000 表示系統(tǒng)同時保持TIME_WAIT的最大數(shù)量,如果超過這個數(shù)字,TIME_WAIT將立刻被清除并打印警告信息。默認為180000,改為5000。對于Apache、Nginx等服務(wù)器,上幾行的參數(shù)可以很好地減少TIME_WAIT套接字數(shù)量,但是對于 Squid,效果卻不大。此項參數(shù)可以控制TIME_WAIT的最大數(shù)量,避免Squid服務(wù)器被大量的TIME_WAIT拖死。
net.ipv4.tcp_synack_retries 為了打開對端的連接,內(nèi)核需要發(fā)送一個SYN并附帶一個回應(yīng)前面一個SYN的ACK。也就是所謂三次握手中的第二次握手。這個設(shè)置決定了內(nèi)核放棄連接之前發(fā)送SYN+ACK包的數(shù)量。
net.ipv4.tcp_syn_retries 在內(nèi)核放棄建立連接之前發(fā)送SYN包的數(shù)量
加大SYN隊列長度可以容納更多等待連接的網(wǎng)絡(luò)連接數(shù),打開SYN Cookie功能可以阻止部分SYN攻擊,降低重試次數(shù)也有一定效果。
=========================================================================================================
二、檢測SYN攻擊
1、# netstat -n -p -t
tcp0 0 10.11.11.11:23124.173.152.8:25882 SYN_RECV-
tcp0 0 10.11.11.11:23236.15.133.204:2577 SYN_RECV-
tcp0 0 10.11.11.11:23127.160.6.129:51748 SYN_RECV-
…
LINUX系統(tǒng)中看到的,很多連接處于SYN_RECV狀態(tài)(在WINDOWS系統(tǒng)中是SYN_RECEIVED狀態(tài)),源IP地址都是隨機的,表明這是一種帶有IP欺騙的SYN攻擊。
2、# netstat -n -p -t | grep SYN_RECV | grep :80 | wc -l
324
查看在LINUX環(huán)境下某個端囗的未連接隊列的條目數(shù),顯示TCP端囗22的未連接數(shù)有324個,雖然還遠達不到系統(tǒng)極限,但應(yīng)該引起管理員的注意。
3、# netstat -na | grep SYN_RECV
tcp 0 0 58.193.192.20:80 221.0.108.162:32383 SYN_RECV
tcp 0 0 58.193.192.20:80 125.85.118.231:2601 SYN_RECV
tcp 0 0 58.193.192.20:80 222.242.171.215:2696 SYN_RECV
tcp 0 0 58.193.192.20:80 116.52.10.51:2629 SYN_RECV
tcp 0 0 58.193.192.20:80 218.171.175.157:1117
4、# netstat -na | grep SYN_RECV |wc
11 66 979
=========================================================================================================
三、SYN配置
1、查看系統(tǒng)SYN相關(guān)的配置
# /sbin/sysctl -a | grep syn
net.ipv6.conf.default.max_desync_factor = 600
net.ipv6.conf.all.max_desync_factor = 600
net.ipv6.conf.eth0.max_desync_factor = 600
net.ipv6.conf.lo.max_desync_factor = 600
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 = 1280
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 5
fs.quota.syncs = 18
2、SYN相關(guān)配置
防范SYN攻擊設(shè)置,縮短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-flood
iptables -A INPUT -p tcp –syn -j syn-flood
iptables -A syn-flood -p tcp –syn -m limit –limit 1/s –limit-burst 3 -j RETURN
iptables -A syn-flood -j REJECT
#設(shè)置syncookies:
sysctl -w net.ipv4.conf.all.send_redirects=0
sysctl -w net.ipv4.conf.all.accept_redirects=0
sysctl -w net.ipv4.conf.all.forwarding=0
/sbin/sysctl -w net.ipv4.conf.default.accept_source_route=0 # 禁用icmp源路由選項
/sbin/sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 # 忽略icmp ping廣播包,應(yīng)開啟
/sbin/sysctl -w net.ipv4.icmp_echo_ignore_all=1 # 忽略所有icmp ping數(shù)據(jù),覆蓋上一項
=========================================================================================================
四、受到DDOS攻擊后,如何處理和切換
1、使用iptables屏蔽攻擊IP
首先使用以下代碼,找出攻擊者IP
netstat -ntu | awk'{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
以下命令將顯示所有打開你的服務(wù)器的活躍連接,如果它顯示連接超過500,那么將肯定有問題。
使用以下代碼顯示連接到80段口的活躍的網(wǎng)絡(luò)連接
netstat -n | grep:80 |wc -l
以下命令結(jié)果是100或以上,那么服務(wù)器可能被同步攻擊。
netstat -n | grep:80 | grep SYN |wc -l
一旦你獲得了攻擊你的服務(wù)器的IP列表,你可以很容易地阻止它。
使用下面的命令來阻止IP或任何其他特定的IP:
route addipaddress reject
一旦你在服務(wù)器上阻止了一個特定IP的訪問,你可以檢查對它的阻止是否有效
通過使用下面的命令:
route -n |grepIPaddress
當你發(fā)現(xiàn)攻擊你服務(wù)器的IP你可以使用下面的命令來關(guān)閉他們的連接:
iptables -A INPUT1 -s $IPADRESS -j DROP/REJECT
請注意你必須用你使用netstat命令找到的IP數(shù)替換$IPADRESS
service iptablesrestart
service iptablessave
上面的命令執(zhí)行后,停止httpd連接,重啟httpd服務(wù)
使用下面的命令:
killall -KILLhttpd
service httpdstartssl
2、軟件解決
㈠、使用DDoS deflate+iptables
DDoS deflate是一款免費的用來防御和減輕DDoS攻擊的腳本。它通過netstat監(jiān)測跟蹤創(chuàng)建大量網(wǎng)絡(luò)連接的IP地址,在檢測到某個結(jié)點超過預(yù)設(shè)的限制時,該程序會通過APF或IPTABLES禁止或阻擋這些IP.
安裝DDoS deflate
wget http://www.inetbase.com/scripts/ddos/install.sh //下載DDoSdeflate
chmod 0700 install.sh //添加權(quán)限
./install.sh //執(zhí)行
配置DDoS deflate
下面是DDoS deflate的默認配置位于/usr/local/ddos/ddos.conf,默認如下:
##### Paths of thescript 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" //定時執(zhí)行程序
APF="/etc/apf/apf"
IPT="/sbin/iptables"
##### frequency inminutes 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 manyconnections define a bad IP? Indicate that below.
NO_OF_CONNECTIONS=150 //最大連接數(shù),超過這個數(shù)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 (BadIPs are'nt banned, good for interactive execution of script)
##### KILL=1 (Recommended setting)
KILL=1 //是否屏蔽IP,默認即可
##### An email issent to the following address when an IP is banned.
##### Blank would suppress sending of mails
EMAIL_TO="root" //當IP被屏蔽時給指定郵箱發(fā)送郵件,推薦使用,換成自己的郵箱即可
##### Number ofseconds the banned ip should remain in blacklist.
BAN_PERIOD=600 //禁用IP時間,默認600秒,可根據(jù)情況調(diào)整
用戶可根據(jù)給默認配置文件加上的注釋提示內(nèi)容,修改配置文件。
查看/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
測試防御ddos攻擊效果
NO_OF_CONNECTIONS=3
#這里為了方便測試,設(shè)置為3。生產(chǎn)環(huán)境下,幾十到幾百都可以理解為正常,上千肯定就是不正常了,除非是應(yīng)用內(nèi)部各個服務(wù)器之間的通信
通過一臺固定ip的機器ssh連接該服務(wù)器,當連接到超過3甚至更多時,不會立刻顯示連不上,因為ddos.sh默認一分鐘運行一次,當過不到一分鐘時,會發(fā)現(xiàn)連接掉了,查看部署了防ddos軟件的服務(wù)器上可以看到iptables的策略中多了:
DROP all --31.210.16.29.broad.cs.gd.dynamic.163data.com.cn anywhere
說明確實生效了,當10分鐘后,iptables上這條策略會被取消的
關(guān)于如何查看單個IP的連接數(shù)目可以通過如下命令查看,依次排列:
netstat -na|grep ESTABLISHED|awk'{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -r -n
..............
40 127.0.0.1
1 121.9.252.28
1 173.117.140.69
ddos攻擊很常見,攻擊效果也很好,比如像前段時間由于維基創(chuàng)始人引發(fā)的那次大范圍的攻擊。
如果有專門防止ddos的硬件設(shè)備的話最好,沒有的話就利用DDoS-Deflate結(jié)合iptables在一定程度上防范ddos攻擊也是一種很好的策略。
㈡、使用智能dns解析,自動解析到好的服務(wù)器
需要在dnspod.cn購買
㈢、使用負載均衡
兩臺或兩臺服務(wù)器以上,LVS+Keepalive或LVS+heartbeat實現(xiàn)雙機或多機熱備