越來越多的人使用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控制面板的安全建議-不讓駭客有可趁之機
- Linux的php-fpm優化心得-php-fpm進程佔用記憶體大和不釋放記憶體問題
- 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到付費版,這樣防護效果會更好。