No products in the cart.
前言 ??
?
開互聯網公司的主要成本是服務器和帶寬。産品形態主要是網站和app。搞網站一是軟件産品本身的研發,而是防DDoS攻擊。爲何DDoS是網上主要的攻擊手段?因爲它成本低,不需要破解。 ?
?
網站受到DDoS的症狀 ?
1.服務器CPU被大量占用 ?
如果服務器某段時期能突然出現CPU占用率過高,那麽就可能是網站受到CC攻擊影響。 ?
服務器無響應了: ?
?
2.帶寬被大量占用 ?
占用帶寬資源通常是DDoS攻擊的一個主要手段,畢竟對很多小型企業或者個人網站來說,帶寬的資源可以說非常有限,網絡的帶寬被大量無效數據給占據時,正常流量數據請求很很難被服務器進行處理。如果服務器上行帶寬占用率達到90%以上時,那麽你的網站通常出現被DDoS攻擊的可能。 ?
?
3服務器連接不到,網站也打不開 ?
如果網站服務器被大量DDoS攻擊時,有可能會造成服務器藍屏或者死機,這時就意味著服務器已經連接不上了,網站出現連接錯誤的情況。當然出現這種請求時我們最好是確認一下服務器是否是硬件故障等所導致出現的問題,否者在進行服務器連接時就要做好相關的防禦首段。 ?
?
4.域名ping不出IP ?
可能這種情況站長們可能會比較少考慮到,這其實也是DDoS攻擊的一種表現,只是攻擊著所針對的攻擊目標是網站的DNS域名服務器。在出現這種攻擊時,ping服務器的IP是正常聯通的,但是網站就是不能正常打開,並且在ping域名時會出現無法正常ping通的情況。 ?
?
判斷是否被攻擊 ?
查看網絡連接 ?
?
?
?
?
?
netstat?-ntu?|?awk?‘{print?$5}’?|?cut?-d:?-f1?|?sort?|?uniq?-c?|?sort?-n
netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
輸出:
ESTABLISHED 4
TIME_WAIT 3
netstat -na命令观察到有大量的SYN_RECEIVED、TIME_WAIT、FIN_WAIT_1等状态存在,而ESTABLISHED很少,则可判定肯定是遭受了资源耗尽攻击。 ?
?
如果ESTABLISHED非常地高,那麽可能是有人在惡意攻擊,進一步判斷,可以把下面命令保存爲腳本執行一下: ?
?
?
?
?
?
?
for?i?in?`netstat?-an?|?grep?-i?':80?'|grep?'EST'?|?awk?'{print?$5}'?|?cut?-d?:?-f?1?|?sort?|?uniq?-c?|?awk?'{if($1?>?50)?{print?$2}}'`
do
echo $i
echo $i >> /tmp/evilip
done
?
如果輸出了多個結果,那麽可能表示有人在企圖進行DDOS攻擊,想用TCP連接來拖死你的服務器,輸出的ip就是發出請求的服務器地址,並且保存在了/tmp/evilip裏面。如果沒有結果,可以調整一下阈值,把50改成40試一試。 ?
?
如果SYN_RECV非常高,那麽表示受到了SYN洪水攻擊。 ?
?
如果上面的值看不出什麽異常的話,我們來抓包分析下,可能並非基于TCP的攻擊。抓包命令: ?
?
tcpdump -w tmp.pcap port not 22
抓包感覺差不多了就ctrl+c結束,結果在保存在當前目錄下的tmp.pcap文件中,我們可以使用命令 ?
?
tcpdump -r tmp.pcap -nnA
來查看,也可以拖回本地用wireshark打開分析等,個人喜好了。如果出現大量的ICMP包或者大量的UDP包,那麽可能就是針對性的ICMP洪水以及UDP洪水了。 ?
?
TCP連接攻擊 ?
TCP連接攻擊算是比较古老的了,防御起来也相对比较简单,主要是利用大量的TCP连接来消耗系统的网络资源,通常同一个IP会建立数量比较大的TCP连接,并且一直保持。应对方法也比较简单,可以将以下命令保存为脚本,定时ban掉那些傀儡机ip ?
?
?
?
?
?
?
for?i?in?`netstat?-an?|?grep?-i?':80?'|grep?'EST'?|?awk?'{print?$5}'?|?cut?-d?:?-f?1?|?sort?|?uniq?-c?|?awk?'{if($1?>?50)?{print?$2}}'`
do
echo $i
echo $i >> /tmp/banip
/sbin/iptables -A INPUT -p tcp -j DROP -s $i
done
banip文件裏面記錄了所有被ban的ip地址信息,方面進行反滲透以及證據保存等等。爲了更好地加固系統,我們可以使用iptables來限制一下,單個ip的最大連接數。 ?
?
iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 10 --connlimit-mask 32 -j REJECT
限制每個ip的連接數爲10。如果是大些業務系統的話,需要注意,上面的做法可能導致一些共用IP的用戶訪問中斷。需要謹慎。 ?
?
SYN洪水攻擊 ?
SYN洪水是利用TCP/IP協議的設計缺陷來進行攻擊的,采用一些策略以及配置可以適當的降低攻擊的影響,但並不能完全消除。 ?
?
?
?
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_syn_retries = 0
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
tcp_syncookies設置爲1表示啓用syncookie,可以大大降低SYN攻擊的影響,但是會帶來新的安全缺陷。 ??
?
?
tcp_syn_retries 表示syn重试次数,重传次数设置为0,只要收不到客户端的响应,立即丢弃该连接,默认设置为5次。 ?
?
tcp_max_syn_backlog表示syn等待隊列,改小這個值,使得SYN等待隊列變短,減少對系統以及網絡資源的占用。 ?
?
當攻擊者的資源非常的多,上面這些方法限制可能就沒有什麽防護效果了,面對大流量DDoS攻擊還是要考慮采用多機負載或者選擇墨者安全高防來應對了,一般來說多機負載的成本可能更高,所以大部分人還是選擇高防硬防産品來防禦。 ?
?
防禦措施 ?
目前沒有一招制敵的辦法。只能多措並舉,多管齊下。 ?
?
網站靜態化 ?
備份網站,方便切換。有點靠譜。 ?
隐藏真实IP,采用CDN。源服务器前面有 CDN。如果攻击域名,CDN 可以挡住;如果直接攻击源服务器,可以考虑采用弹性 IP。 ?
加大帶寬,說了白說,小公司哪買得起那麽大的帶寬? ?
安裝專業抗DDoS防火牆。裝不起。 ?
盡量避免NAT的使用。不明白。 ?
買阿裏或華爲的DDoS高防服務。太貴,買不起。 ?
當然,針對Linux服務器,還是能做一些基本防護的。 ?
?
?
?
?
?
?
?
?
?
?
TCP/IP內核參數優化
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表示"打开"
然后运行 sysctl -p 使上面配置生效 ?
?
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.205、124.65.197.154、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)
防止同步包洪水(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@ ~]# 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 ?
?
[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
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文件配置后生效
一個實用的防禦腳本 ?
Linux服務器中一旦受到DDOS的攻擊(比如IDC機房服務器被攻擊了,關機,拔網線,降流量),目前只能通過封IP來源來暫時解決。然而IP來源變化多端,光靠手工來添加簡直是惡夢,所以還是想辦法寫個shell腳本來定時處理,這才是比較靠譜的辦法。 ?
?
?
?
?
?
?
?
#!/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。 ?
?
下面是針對連接數屏蔽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
安裝nginx版安全狗 ?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
[root@icool ~]# wget http://safedog.cn/safedogwz_linux_Nginx64.tar.gz
[root@icool ~]# tar -zvxf safedogwz_linux_Nginx64.tar.gz
[root@icool ~]# cd safedogwz_linux_Nginx64
[root@icool safedogwz_linux_Nginx64]# chmod 755 install.py
[root@icool]# ls
install_files install.py uninstall.py
[root@icool]# ./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 ?