安装Fail2ban方法:
1、如果服务器是有安装宝塔面板,可在宝塔后台安装,如图。 2、手动安装“Fail2ban”:
Centos7:(Centos8安装会报错,还没找到解决方法,应该下载源码包安装可以解决,还没测试)
Ubuntu/Debian:yum -y install fail2ban
设置开机自启并启动(centos和乌班图通用)sudo apt update
sudo apt install fail2ban
systemctl enable fail2ban
systemctl start fail2ban
查看是否启动:
显示“active (running)”这表示启动。systemctl status fail2ban
配置Fail2ban:
1、宝塔面板中配置:
宝塔后台点击左侧“软件商店”然后点击点击上方的“已安装”中找到“fail2ban”点击右侧“设置”这里很简单就不介绍了,都是字面意思,需要注意的是,在对网站设置防cc攻击时设置合理一些,以免将自己的出口ip封停了无法访问(曾经多次遇到过把自己的出口ip屏蔽了导致无法访问),这个预防cc还是比较鸡肋的,建议使用waf防火墙或第三方cdn实现。
2、手动配置:
重要提醒:该工具需要调用Firewalld防火墙来屏蔽ip,如果Firewalld没启动,则不会拦截成功,启动防火墙前请将常见端口放行,不然启动后你也无法登录服务器。
firewalld放行端口方法:(将22换成您自己的端口,若有多个端口重复执行如下命令)
启动firewalld并设置开机自启:firewall-cmd --permanent --add-port=22/tcp
firewall-cmd --reload
service firewalld restart
systemctl enable firewalld.service
开始配置fail2ban
编辑配置文件
增加如下内容:(下面只是一个范例,请根据自己情况配置)vi /etc/fail2ban/jail.local
说明:上面一共4部分分别是:默认配置、配置SSH暴力破解、配置FTP暴力破解、网站cc暴力破解。#DEFAULT-START
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 600
findtime = 300
maxretry = 5
banaction = firewallcmd-ipset
action = %(action_mwl)s
#DEFAULT-END
#sshd-START
[sshd]
enabled = true
filter = sshd
port = 22
maxretry = 5
findtime = 300
bantime = 86400
action = %(action_mwl)s
logpath = /var/log/secure
#sshd-END
#ftpd-START
[ftpd]
enabled = true
filter = pure-ftpd
port = 21
maxretry = 5
findtime = 300
bantime = 86400
action = %(action_mwl)s
logpath = /var/log/messages
#ftpd-END
#blog.tag.gg-cc-START
[blog.tag.gg-cc]
enabled = true
filter = aaP_blog.tag.gg_cc
port = 80,443
maxretry = 30
findtime = 300
bantime = 600
action = %(action_mwl)s
logpath = /www/wwwlogs/blog.tag.gg.log
#blog.tag.gg-cc-END
默认配置部分说明:#DEFAULT-START
- ignoreip:本部分允许我们列出 IP 地址列表,Fail2Ban 不会禁止与列表中的地址匹配的主机
- bantime:主机被禁止的秒数
- findtime:如果在最近 findtime 秒期间已经发生了 maxretry 次重试,则主机会被禁止
- maxretry:是主机被禁止之前的失败次数
- enabled: 确定服务是打开还是关闭。
- filter:这个参数定义了过滤器文件的名称,用于过滤掉不需要封锁的IP地址。
- port:指明特定的服务。 如果使用默认端口,则服务名称可以放在这里。 如果使用非传统端口,则应该是端口号。
- maxretry:这个参数定义了在封锁一个IP地址之前允许的最大重试次数。
- findtime:这个参数定义了在封锁一个IP地址之前允许的最大登录失败时间,单位是秒。默认值是3600秒,即一小时。这里设置300秒。
- bantime:这个参数定义了被封锁的IP地址在多少秒内无法再次登录。默认值是3600秒,即一小时。这里设置86400秒,即24小时。
- action:达到阈值后的动作
- logpath:提供服务日志的位置
- backend:指定用于获取文件修改的后端。
意思与上面一样。
如果您需要监控其他端口,相应添加规则即可。
网站cc暴力破解:
网站cc这个值请谨慎设置,以免设置太小屏蔽了所有访问,同时也请不要将自己ip屏蔽了,本人遇到过很多次了。
修改配置后重启服务
或:systemctl restart fail2ban
fail2ban-client reload
Fail2ban常见命令:
1、查看当前Fail2ban配置的有那些服务。
显示如下:sudo fail2ban-client status
说明:表示一共配了3个规则,分别是ftpd, sshd,blog.tag.gg-cc[root@blog.tag.gg fail2ban]# sudo fail2ban-client status
Status
|- Number of jail: 3
`- Jail list: blog.tag.gg-cc, ftpd, sshd
2、查看某个服务是否有拦截ip,例如查看sshd。
执行后显示如下:sudo fail2ban-client status sshd
[root@blog.tag.gg fail2ban]# sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 2
| `- File list: /var/log/secure
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 119.89.68.118
说明:
- Total failed: 2:总的失败次数,这里是一共尝试了2次失败。所有累计。
- File list:ssh:登录是依赖于/var/log/secure日志的。
- Currently banned: 1:当前禁止ip的数量,这里表示禁止了一个ip。
- Total banned: 1 到目前为止一共禁止的ip数量。
- Banned IP list:已禁止的IP。
3、解除对某个ip的屏蔽,可用如下命令[root@blog.tag.gg fail2ban]# sudo fail2ban-client status blog.tag.gg-cc
Status for the jail: blog.tag.gg-cc
|- Filter
| |- Currently failed: 1
| |- Total failed: 33
| `- File list: /www/wwwlogs/blog.tag.gg.log
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 88.212.88.178
例如我要解除119.89.68.118对ssh访问
执行后显示如下:sudo fail2ban-client set sshd unbanip 119.89.68.118
若要同时解除多个ip,ip后面加空格然后写上ip即可。[root@blog.tag.gg fail2ban]# sudo fail2ban-client set sshd unbanip 119.89.68.118
1
4、默认日志:
5、查看fail2ban配置的规则是否已经生效。/var/log/fail2ban.log
执行后显示如下则表示生效。firewall-cmd --direct --get-all-rules
6、查看在fail2ban黑名单里的IP是否已经加到了firewall中。[root@blog.tag.gg ~]# firewall-cmd --direct --get-all-rules
ipv4 filter INPUT_direct 0 -p tcp -m multiport --dports 22 -m set --match-set f2b-sshd src -j REJECT --reject-with icmp-port-unreachable
执行后如下:ipset list
7、检查匹配规则是否正确(请将日志和配置文件更换自己的)[root@blog.tag.gg ~]# ipset list
Name: f2b-sshd
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 65536 timeout 0
Size in memory: 312
References: 1
Number of entries: 2
Members:
118.89.68.135 timeout 0
141.98.11.90 timeout 0
执行后如下:fail2ban-regex /var/log/secure /etc/fail2ban/filter.d/sshd.conf
说明:如果显示“17 matched”则表示有规则匹配,如果现实“0”则说明没有规则匹配[root@blog.tag.gg ~]# fail2ban-regex /var/log/secure /etc/fail2ban/filter.d/sshd.conf
Running tests
=============
Use failregex filter file : sshd, basedir: /etc/fail2ban
Use maxlines : 1
Use datepattern : {^LN-BEG} : Default Detectors
Use log file : /var/log/secure
Use encoding : UTF-8
Results
=======
Prefregex: 93 total
| ^(?P<mlfid>(?:\[\])?\s*(?:<[^.]+\.[^.]+>\s+)?(?:\S+\s+)?(?:kernel:\s?\[ *\d+\.\d+\]:?\s+)?(?:@vserver_\S+\s+)?(?:(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:?)\s+)?(?:\[ID \d+ \S+\]\s+)?)(?:(?:error|fatal): (?:PAM: )?)?(?P<content>.+)$
`-
Failregex: 27 total
|- #) [# of hits] regular expression
| 4) [16] ^Failed (?:<F-NOFAIL>publickey</F-NOFAIL>|\S+) for (?P<cond_inv>invalid user )?<F-USER>(?P<cond_user>\S+)|(?(cond_inv)(?:(?! from ).)*?|[^:]+)</F-USER> from <HOST>(?: (?:port \d+|on \S+)){0,2}(?: ssh\d*)?(?(cond_user): |(?:(?:(?! from ).)*)$)
| 6) [1] ^[iI](?:llegal|nvalid) user <F-USER>.*?</F-USER> from <HOST>(?: (?:port \d+|on \S+|\[preauth\])){0,3}\s*$
| 14) [6] ^<F-NOFAIL>pam_[a-z]+\(sshd:auth\):\s+authentication failure;</F-NOFAIL>(?:\s+(?:(?:logname|e?uid|tty)=\S*)){0,4}\s+ruser=<F-ALT_USER>\S*</F-ALT_USER>\s+rhost=<HOST>(?:\s+user=<F-USER>\S*</F-USER>)?(?: (?:port \d+|on \S+|\[preauth\])){0,3}\s*$
| 19) [1] ^<F-NOFAIL>Received <F-MLFFORGET>disconnect</F-MLFFORGET></F-NOFAIL> from <HOST>(?: (?:port \d+|on \S+)){0,2}:\s*11:
| 20) [1] ^<F-NOFAIL><F-MLFFORGET>(Connection closed|Disconnected)</F-MLFFORGET></F-NOFAIL> (?:by|from)(?: (?:invalid|authenticating) user <F-USER>\S+|.*?</F-USER>)? <HOST>(?:(?: (?:port \d+|on \S+|\[preauth\])){0,3}\s*|\s*)$
| 21) [2] ^<F-MLFFORGET><F-MLFGAINED>Accepted \w+</F-MLFGAINED></F-MLFFORGET> for <F-USER>\S+</F-USER> from <HOST>(?:\s|$)
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [93] {^LN-BEG}(?:DAY )?MON Day %k:Minute:Second(?:\.Microseconds)?(?: ExYear)?
`-
Lines: 93 lines, 10 ignored, 17 matched, 66 missed
[processed in 0.01 sec]
|- Ignored line(s):
| Oct 14 11:14:16 host-192-168-0-81 sshd[7599]: Accepted password for root from 171.212.91.178 port 57102 ssh2
| Oct 14 11:17:44 host-192-168-0-81 sshd[7926]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=118.89.88.88 user=root
| Oct 14 11:23:43 host-192-168-0-81 sshd[8182]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=141.98.11.90
| Oct 14 11:28:59 host-192-168-0-81 sshd[7599]: Received disconnect from 171.212.91.178 port 57102:11:
| Oct 14 11:28:59 host-192-168-0-81 sshd[7599]: Disconnected from 171.212.91.178 port 57102
8、限制8.8.8.8ip登录ssh:
sudo fail2ban-client set sshd banip 8.8.8.8
另外,也可以执行命令“iptables -L -n”查看是否有启用fail2ban。
很简单,希望对新手有帮助,好记性不如烂笔头,也方便自己查看。[root@blog.tag.gg fail2ban]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 22 match-set f2b-sshd src reject-with icmp-port-unreachable
REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443 match-set f2b-blog.tag.gg-cc src reject-with icmp-port-unreachable
文章评论 本文章有个评论