越來越多的人使用VPS主機建站,但是與虛擬主機或管理型的伺服器相比,個人VPS主機基本上是無管理型的,即主機商只負責VPS主機的網路暢通,至於技術上的問題都得靠自己來解決。之前用阿里雲的VPS主機經常受到CC和DDOS攻擊,基本上每次一被攻擊就要進入阿里雲的「黑洞」。

阿里雲對待CC和DDOS的VPS主機一般不能防禦太多流量,一旦攻擊流量起來了基本上會清空路由,如果被攻擊的次數多了話甚至會長達一天或幾天的「黑洞」。現在挖站否搬家到了經典CN2 VPS搬運工上,之前有收到過熱心朋友的提醒,搬運工對待CC和DDOS的次數只有3次,超過3次直接封掉VPS。

這次的攻擊事件也讓我知道了將網站放在經典VPS主機上依然要保持一種小心謹慎的態度。在最開始挖站否無法打開,接著受到不少朋友發來的信息提醒,我馬上登錄到主機商後台查看,從監控圖表中可以看出VPS的CPU佔用超過100%,頻寬速度已經超過上百MB,顯然VPS是被主機商給斷網了。

這篇文章就來分享一下使用VPS主機建站的朋友,應對小型的CC和DDOS攻擊的基本步驟,基本上是圍繞防火牆阻止惡意IP來展開的。

VPS主機防攻擊應對CC和DDOS的基本想法-防掃描防火牆阻止策略

更多的關於網站建設的網站安全與經驗,還有:

  1. 五條關於使用免費VPS控制面板的安全建議-不讓駭客有可趁之機
  2. Linux的php-fpm優化心得-php-fpm進程佔用記憶體大和不釋放記憶體問題
  3. DNS網域名稱解析啟用DNSSEC防止DNS劫持-Google Cloud DNS設定DNSSEC

PS:2018年3月6日更新,如果想要阻止特定的IP訪問網站,可以採用該方法:網站屏蔽和阻止特定地區和國家的IP訪問設置方法-PHP代碼/Nginx/ WordPress設定。

PS:2020年3月19日更新,如果你的網站已經被駭了,可以參考以下方法來解決:網站掛木馬和伺服器被黑排查分析-VPS主機和伺服器強化安全方法。

一、應對CC和DDOS要提前做好功課

以下兩個指令大家可以快速對目前攻擊做出判斷:輸入下面指令後查看單一IP的連線數。

netstat -nat|grep -i '80'|wc -l

將連線的IP依連線數量排序,查看TCP連線狀態。

netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

1.1  勤備份-本地與異地備份結合

網站備份是應對CC和DDOS攻擊的萬全之策,無論如何攻擊,只要資料沒有被破壞,我們就可以將損失降低到最少。對於資料更新頻繁的建議一天備份一次,有些主機商還會提供快照備份功能,例如阿里雲、騰訊雲以及之前介紹的Linode快照等。

除了本地備份,自然還是做好異地備份。異地備份可以結合雲端儲存或雲端碟來保存數據,先前分享的Linux VPS掛載Google Drive和Dropbox就可以自動將本VPS上的資料同步上傳到網盤中,或是使用DigitalOcean Spaces雲端儲存、又拍雲、七牛雲端儲存、百度BOS等專業雲端儲存。

1.2  學會查看Linux VPS系統負載

一旦遭受了CC和DDOS攻擊,一般我們都可以透過VPS主機商的控制面板來查看,我們可以看到自己的監控資料有明顯的「異常」。下圖是我遭受攻擊時VPS主機監控顯示的IO、CPU、記憶體等呈現100%佔用的情況。 (點擊放大)

2.2  巧用Fail2ban阻止攻擊IP

fail2ban是由Python語言開發監控軟體,透過監控系統日誌的登入資訊來呼叫iptables來封鎖對應登入IP,以阻止某個IP惡意存取。 fail2ban讀取對應日誌文件,Debian/Ubuntu:/var/log/auth.log、CentOS/Redhat:/var/log/secure。安裝fail2ban:

apt-get install fail2ban

#CentOS内置源并未包含fail2ban,需要先安装epel源
yum -y install epel-release
#安装fial2ban
yum -y install fail2ban

安裝完成後主要的設定檔在/etc/fail2ban目錄下,裡面有兩個檔案和兩個目錄:

fail2ban.conf :設定檔裡面定義了fail2ban記錄的日誌等級、日誌檔案的位置以及socket。

jail.conf 裡面定義了對那些服務進行監控,以及使用的一些策略。

jail.conf 裡面開頭是預設全域設定區塊[DEFAULT],預設設定說明如下:

[DEFAULT]
#忽略哪些IP,可以是具体IP、CIDR类型的地址,多个IP用空格分开
ignoreip = 127.0.0.1

#设置IP被锁住的时间,单位为秒
bantime  = 600

#检测时间,在此时间内超过规定的次数会激活fail2ban
findtime  = 600

#尝试的次数
maxretry = 3

#日志检测机器,有"gamin", "polling" and "auto"三种模式。
backend = polling

#发送报警邮件的地址
destemail = root@localhost #默认的动作执行行为,在action.d目录下有各种行为策略,默认是iptables-#multiport
banaction = iptables-multiport

#0.8.1版本后fail2ban默认用sendmail MTA
mta = sendmail

#默认使用tcp协议
protocol = tcp

#定义了各种行动的参数
#banaction参数在action.d目录下具体定义,name port protocol 也可以自己定义
#只禁止IP
action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
#即禁止IP又发送email
action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
              %(mta)s-whois[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s]
#禁止IP、发送email、报告有关日志			  
action_mwl = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
               %(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s]

#如果没有定义行为,则默认的行为为action,可选择action_,action_mw, action_mwl 等		
action = %(action_)s

默认配置文件含有此模块
#定义子模块名
[ssh]
#是否激活
enabled = true
#定义port,可以是数字端口号表示,也可以是字符串表示
port= ssh
#过滤规则,在filter.d目录下定义
filter	= sshd
#检测日志的路径
logpath  = /var/log/auth.log
#尝试的次数,覆盖了全局配置的
maxretry = 6
#banaction 在action.d目录下定义,此参数值会替换action中选用的默认行为中定义的banaction参数
banaction = iptables-allports
#注意 port protocol banaction 可以不用分开定义,直接使用action定义也可以,例如:
#action   = iptables[name=SSH, port=ssh, protocol=tcp]
#在子模块中定义的port protocol banaction 都会在action_ action_mw, action_mwl中替换成具体的设置值。

Fail2ban其它的目錄功能說明如下:

filter.d 目錄裡面定義的是根據日誌檔進行過濾的規則,主要是利用正規匹配出現錯誤的關鍵字。

action.d目錄裡面是依照過濾的規則對對應的IP採取什麼樣的行為 。

Fail2ban防CC攻擊範例:

#需要先新建一个nginx日志匹配规则
vi /etc/fail2ban/filter.d/nginx-cc.conf
#填写如下内容
[Definition]
failregex = <HOST> -.*- .*HTTP/1.* .* .*$
ignoreregex =

繼續修改jail.local追加以下內容:

[nginx-cc]
enabled = true
port = http,https
filter = nginx-cc
action = %(action_mwl)s
maxretry = 60
findtime = 60
bantime = 3600
logpath = /data/wwwlogs/wzfou.com_nginx.log

上面的設定意思是如果在60s內,同一IP達到60次請求,則將其IP ban 1小時,記得修改你的網站日誌路徑。使用下列指令查看fail2ban狀態,顯示出被禁止IP位址清單。

/usr/local/python/bin/fail2ban-client status ssh-iptables

儲存以上程式碼後,賦予x(執行)權限。要實作該Shell Script在後台類似daemon,就需要使用nohup這個東西了:

nohup 该shell script的位置 >/dev/null 2>&1 &

>/dev/null 2>&1表示把執行該shell script所輸出的資訊(shell script裡的幾個echo,調試是時候用的。)重定向到/dev/null裡面。 最後面的&代表後台執行。這樣的話,即使登出了登錄,該Shell Script也會在背景執行。

三、總結

以上兩個即時偵測網站日誌並自動將異常IP加入到iptables中屏蔽的腳本我之前用過,效果很不錯,足以應付小型的CC攻擊。目前使用Fail2ban用於偵測網站日誌並封鎖惡意IP。三個腳本各有各的優勢,大家可以依照自己的需求來選擇。

但如果遇到較大的DDOS攻擊還是得借用專門的防攻擊服務,例如Cloudflare防攻擊服務就非常有效果,基本上搞VPS這一行的都用到它。如果你的網站一直被攻擊得無法訪問,可以升級Cloudflare到付費版,這樣防護效果會更好。

發表評論