Loading
0

通过Fail2ban防SSH暴力破解及网站CC攻击方法

技术小学生微信公众号
腾讯云服务器大促销。
华为服务器
前言:Linux系统中,22端口经常被恶意扫描登录出现各种问题,以及网站被CC攻击等问题。本教程介绍通过Fail2ban实现预防ssh被暴力破解以及预防网站被cc攻击方法。
安装Fail2ban方法:
1、如果服务器是有安装宝塔面板,可在宝塔后台安装,如图。

2、手动安装“Fail2ban”:
Centos7:(Centos8安装会报错,还没找到解决方法,应该下载源码包安装可以解决,还没测试

yum -y install fail2ban

Ubuntu/Debian:

sudo apt update
sudo apt install fail2ban

设置开机自启并启动(centos和乌班图通用)

systemctl enable fail2ban
systemctl start fail2ban


查看是否启动:

systemctl status fail2ban

显示“active (running)”这表示启动。
配置Fail2ban:
1、宝塔面板中配置:
宝塔后台点击左侧“软件商店”然后点击点击上方的“已安装”中找到“fail2ban”点击右侧“设置”这里很简单就不介绍了,都是字面意思,需要注意的是,在对网站设置防cc攻击时设置合理一些,以免将自己的出口ip封停了无法访问(曾经多次遇到过把自己的出口ip屏蔽了导致无法访问),这个预防cc还是比较鸡肋的,建议使用waf防火墙或第三方cdn实现。
2、手动配置:
重要提醒:该工具需要调用Firewalld防火墙来屏蔽ip,如果Firewalld没启动,则不会拦截成功,启动防火墙前请将常见端口放行,不然启动后你也无法登录服务器。
firewalld放行端口方法:(将22换成您自己的端口,若有多个端口重复执行如下命令)

firewall-cmd --permanent --add-port=22/tcp 
firewall-cmd --reload

启动firewalld并设置开机自启:

service firewalld restart
systemctl enable firewalld.service


开始配置fail2ban
编辑配置文件

vi /etc/fail2ban/jail.local

增加如下内容:(下面只是一个范例,请根据自己情况配置

#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

说明:上面一共4部分分别是:默认配置、配置SSH暴力破解、配置FTP暴力破解、网站cc暴力破解。
默认配置部分说明:#DEFAULT-START
  • ignoreip:本部分允许我们列出 IP 地址列表,Fail2Ban 不会禁止与列表中的地址匹配的主机
  • bantime:主机被禁止的秒数
  • findtime:如果在最近 findtime 秒期间已经发生了 maxretry 次重试,则主机会被禁止
  • maxretry:是主机被禁止之前的失败次数
配置SSH暴力破解:#sshd-START
  • enabled: 确定服务是打开还是关闭。
  • filter:这个参数定义了过滤器文件的名称,用于过滤掉不需要封锁的IP地址。
  • port:指明特定的服务。 如果使用默认端口,则服务名称可以放在这里。 如果使用非传统端口,则应该是端口号。
  • maxretry:这个参数定义了在封锁一个IP地址之前允许的最大重试次数。
  • findtime:这个参数定义了在封锁一个IP地址之前允许的最大登录失败时间,单位是秒。默认值是3600秒,即一小时。这里设置300秒。
  • bantime:这个参数定义了被封锁的IP地址在多少秒内无法再次登录。默认值是3600秒,即一小时。这里设置86400秒,即24小时。
  • action:达到阈值后的动作
  • logpath:提供服务日志的位置
  • backend:指定用于获取文件修改的后端。
配置SSH暴力破解:#ftpd-START
意思与上面一样。
如果您需要监控其他端口,相应添加规则即可。
网站cc暴力破解:
网站cc这个值请谨慎设置,以免设置太小屏蔽了所有访问,同时也请不要将自己ip屏蔽了,本人遇到过很多次了。
修改配置后重启服务

systemctl restart fail2ban

或:

fail2ban-client reload


Fail2ban常见命令:
1、查看当前Fail2ban配置的有那些服务。

sudo fail2ban-client status

显示如下:

[root@blog.tag.gg fail2ban]# sudo fail2ban-client status
Status
|- Number of jail:      3
`- Jail list:   blog.tag.gg-cc, ftpd, sshd

说明:表示一共配了3个规则,分别是ftpd, sshd,blog.tag.gg-cc
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。
网站cc防护拦截如下:

[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

3、解除对某个ip的屏蔽,可用如下命令
例如我要解除119.89.68.118对ssh访问

sudo fail2ban-client set sshd unbanip 119.89.68.118

执行后显示如下:

[root@blog.tag.gg fail2ban]# sudo fail2ban-client set sshd unbanip 119.89.68.118
1

若要同时解除多个ip,ip后面加空格然后写上ip即可。
4、默认日志:

/var/log/fail2ban.log

5、查看fail2ban配置的规则是否已经生效。

firewall-cmd --direct --get-all-rules

执行后显示如下则表示生效。

[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

6、查看在fail2ban黑名单里的IP是否已经加到了firewall中。

ipset list

执行后如下:

[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

7、检查匹配规则是否正确(请将日志和配置文件更换自己的)

fail2ban-regex /var/log/secure /etc/fail2ban/filter.d/sshd.conf

执行后如下:

[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

说明:如果显示“17 matched”则表示有规则匹配,如果现实“0”则说明没有规则匹配
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

很简单,希望对新手有帮助,好记性不如烂笔头,也方便自己查看。
 
技术小学生微信公众号
华为服务器
腾讯云服务器大促销。

声明:站长码字很辛苦啊,转载时请保留本声明及附带文章链接:https://blog.tag.gg/showinfo-3-36309-0.html
亲爱的:若该文章解决了您的问题,可否收藏+评论+分享呢?

最后编辑于:2023-10-13 21:50:50作者:

上一篇:解决:Linux SSH登录pam_tally2(sshd:auth): user root()tallu 21.denu 10方法
下一篇:关闭Linux系统Tab补全功能取消tab补全命令