準備工做
一、檢查firewalld是否啓用php
#若是您已經安裝iptables建議先關閉 service iptables stop #查看firewalld狀態 firewall-cmd --state #啓動firewalld systemctl start firewalld #設置開機啓動 systemctl enable firewalld.service
啓用firewalld後會禁止全部端口鏈接,所以請務必放行經常使用的端口,以避免被阻擋在外,如下是放行SSH端口(22)示例,供參考:nginx
#放行22端口 firewall-cmd --zone=public --add-port=22/tcp --permanent #重載配置 firewall-cmd --reload #查看已放行端口 firewall-cmd --zone=public --list-ports
查看哪些ip鏈接了,以及每一個ip有多少個鏈接。左邊的數字是鏈接數:安全
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
二、安裝fail2ban
fail2ban能夠監控系統日誌,而且根據必定規則匹配異常IP後使用firewalld將其屏蔽,尤爲是針對一些爆破/掃描等很是有效。服務器
#CentOS內置源並未包含fail2ban,須要先安裝epel源 yum -y install epel-release #安裝fial2ban yum -y install fail2ban
安裝成功後fail2ban配置文件位於/etc/fail2ban,其中jail.conf爲主配置文件,相關的匹配規則位於filter.d目錄,其它目錄/文件通常不多用到,若是須要詳細瞭解可自行搜索。ssh
fail2ban 結構tcp
/etc/fail2ban ## fail2ban 服務配置目錄
/etc/fail2ban/action.d ## iptables 、mail 等動做文件目錄
/etc/fail2ban/filter.d ## 條件匹配文件目錄,過濾日誌關鍵內容
/etc/fail2ban/jail.conf ## fail2ban 防禦配置文件
/etc/fail2ban/fail2ban.conf ## fail2ban 配置文件,定義日誌級別、日誌、sock 文件位置等wordpress
三、配置規則
新建jail.local來覆蓋fail2ban的一些默認規則:測試
#新建配置 vi /etc/fail2ban/jail.local #默認配置 [DEFAULT] ignoreip = 127.0.0.1/8 bantime = 86400 findtime = 600 maxretry = 5 #這裏banaction必須用firewallcmd-ipset,這是fiewalll支持的關鍵,若是是用Iptables請不要這樣填寫 banaction = firewallcmd-ipset action = %(action_mwl)s
參數說明:spa
ignoreip:IP白名單,白名單中的IP不會屏蔽,可填寫多個以(,)分隔
bantime:屏蔽時間,單位爲秒(s)
findtime:時間範圍
maxretry:最大次數
banaction:屏蔽IP所使用的方法,上面使用firewalld屏蔽端口
防止SSH爆破
若是您還在使用默認SSH端口(22),可能天天都會被掃描,咱們能夠修改端口儘可能避免被掃或者可使用fail2ban將惡意IP屏蔽。.net
繼續修改jail.local這個配置文件,在後面追加以下內容:
[sshd] enabled = true filter = sshd port = 22 action = %(action_mwl)s logpath = /var/log/secure
參數說明:
[sshd]:名稱,能夠隨便填寫
filter:規則名稱,必須填寫位於filter.d目錄裏面的規則,sshd是fail2ban內置規則
port:對應的端口
action:採起的行動
logpath:須要監視的日誌路徑
到這一步,咱們jail.local的規則看起來可能像下面這樣子:
[DEFAULT] ignoreip = 127.0.0.1/8 bantime = 86400 findtime = 600 maxretry = 5 banaction = firewallcmd-ipset action = %(action_mwl)s [sshd] enabled = true filter = sshd port = 22 action = %(action_mwl)s logpath = /var/log/secure
上面的配置意思是若是同一個IP,在10分鐘內,若是連續超過5次錯誤,則使用firewalld將他IP ban了。輸入systemctl start fail2ban啓動fail2ban來試試效果。
使用另外一臺服務器不斷嘗試鏈接SSH,而且不斷的將密碼輸入錯誤,你會發現連續超過5次後直接連不上,說明IP被ban了,能夠輸入:fail2ban-client status sshd查看被ban的IP
防止CC攻擊
這裏僅以Nginx爲例,使用fail2ban來監視nginx日誌,匹配短期內頻繁請求的IP,並使用firewalld將其IP屏蔽,達到CC防禦的做用。
fail2ban在/etc/fail2ban/filter.d這個目錄已經內置了不少規則能夠參考。如:nginx-limit-req.conf,Nginx的limit_req_zone用法詳細請見:https://blog.csdn.net/keketrtr/article/details/75315330
固然也能夠本身新建規則:
#須要先新建一個nginx日誌匹配規則 vi /etc/fail2ban/filter.d/nginx-cc.conf #填寫以下內容 [Definition] failregex = -.*- .*HTTP/1.* .* .*$ ignoreregex =
繼續修改jail.local追加以下內容:
[nginx-cc] enabled = true port = http,https filter = nginx-cc action = %(action_mwl)s maxretry = 20 findtime = 60 bantime = 3600 logpath = /usr/local/nginx/logs/access.log
上面的配置意思是若是在60s內,同一IP達到20次請求,則將其IP ban 1小時,上面只是爲了測試,請根據本身的實際狀況修改。logpath爲nginx日誌路徑。
使用以下命令,能夠測試正則規則的有效性:
fail2ban-regex /usr/local/nginx/logs/access.log /etc/fail2ban/filter.d/nginx-cc.conf
防止Wordpress爆破
若是您常常分析日誌會發現有大量機器人在掃描wordpress登陸頁面wp-login.php,雖然對方可能沒成功,可是爲了不萬一仍是將他IP幹掉爲好。
#須要先新建一個nginx日誌匹配規則 vi /etc/fail2ban/filter.d/wordpress.conf #填寫以下內容 [Definition] failregex = ^ -.* /wp-login.php.* HTTP/1\.." ignoreregex =
繼續修改jail.local追加以下內容:
[wordpress] enabled = true port = http,https filter = wordpress action = %(action_mwl)s maxretry = 20 findtime = 60 bantime = 3600 logpath = /usr/local/nginx/logs/access.log
固然,別忘記輸入systemctl restart fail2ban重啓fail2ban使其生效。
經常使用命令
#啓動 systemctl start fail2ban #中止 systemctl stop fail2ban #啓動 systemctl restart fail2ban #開機啓動 systemctl enable fail2ban #是配置當即生效 systemctl daemon-reload #查看是否開機啓動 systemctl is-enabled fail2ban #查看被ban IP,其中sshd爲名稱,好比上面的[wordpress] fail2ban-client status sshd #刪除被ban IP fail2ban-client set sshd unbanip 192.168.111.111 或 fail2ban-client set sshd delignoreip 192.168.111.111 #若是用以上命令刪除被ban IP發現這個IP仍是沒法鏈接,是由於在臨時策略中的ipset集合,只有電腦重啓或者從這裏面刪除IP才行。 #查看臨時策略中的ipset集合:「ipset list」,刪除ipset集合中IP:「ipset del fail2ban-sshd 192.168.111.111 -exist」 #查看日誌 tail /var/log/fail2ban.log
start | 啓動fail2ban server和監獄 |
reload | 從新加載配置文件 |
stop | 暫停fail2ban和監獄 |
status | 查看運行的監控服務數量和列表 |
set loglevel | 設置日誌等級,有 CRITICAL, ERROR, WARNING,NOTICE, INFO, DEBUG |
get loglevel | 獲取當前日誌的等級 |
set <JAIL> idle on|off | 設置某個監控(監獄)的狀態。 |
set <JAIL> addignoreip <IP> | 設置某個監控(監獄)能夠忽略的ip |
set <JAIL> delignoreip <IP> | 刪除某個監控(監獄)能夠忽略的ip |
set <JAIL> banip <IP> | 將ip加入 監控(監獄) |
set <JAIL> unbanip <IP> | 將ip從監控(監獄)移除 |
fail2ban郵件預警
1.在/etc/mail.rc末尾配置發件人的信息:
set ssl-verify=ignore set from=djx set smtp=smtps://mail.163.com:25 set smtp-auth-user=dj set smtp-auth-password= set smtp-auth=login set nss-config-dir=/root/.certs
2.而後在jail.local(本身的配置文件裏),加入:
mail-whois[name=SSH, dest=收件人@qq.com, sender=發送人@163.com]
注意的問題
問題1-時間文件: 當咱們更改了時區後,而後日誌的時間並無修改過來,致使二者的時間不一致,這樣fail2ban的工做就失效了。
解決辦法:重啓日誌服務:systemctl restart rsyslog,保證二者的時間一致。
問題2-修改端口問題:sshd更改端口號後使用fail2ban須要注意在填寫配置的時候也須要更改端口號。不然會出現就算會將ip添加到防火牆,可是因爲我更改了端口號,是起不到禁止做用的。
解決辦法:在配置文件/etc/fail2ban/jail.local中修改新的端口號。
總結 fail2ban已經內置不少匹配規則,位於filter.d目錄下,包含了常見的SSH、FTP、Nginx、Apache等日誌匹配,若是都還沒法知足您的需求,您也能夠自行新建規則來匹配異常IP。使用fail2ban+Firewalld來阻止惡意IP是行之有效的辦法,可極大提升服務器安全。