教程:网站被入侵 两款防火墙让你成为铜墙铁壁

上次网站被入侵,害我花费了非常多的时间去整理数据,然后重装系统。因此本篇文章主要讲讲如何构建一套属于自己的服务器防御体系。当然最重要的还是介绍两款防火墙ufw和fail2ban。

有经验的朋友,相信都或多或少的听说过这两款防火墙。

UFW是Linux系统中一个非常常用的防火墙管理工具。它本质上是对底层防火墙(iptables 或 nftables)的一个简化封装,让你不用写复杂规则,也能快速构建安全策略。

Fail2Ban则是一款专门用来防御暴力破解和恶意扫描的安全工具。它通过实时分析日志文件,自动识别可疑行为,并把攻击者的IP拉黑,送进监狱。

接下来讲一下如何安装和使用方法:

Fail2Ban使用教程:

一.安装Fail2Ban

a.更新系统(建议先做)

1
2
3

sudo apt update && sudo apt upgrade -y

b.安装 Fail2Ban

1
2
3

sudo apt install fail2ban -y

安装完成后,它会自动启动。

c.查看运行状态

1
2
3

sudo systemctl status fail2ban

如果看到:

active (running)

说明已经正常运行

二.配置Fail2Ban

a.Fail2Ban不要直接改原配置文件,正确方式是复制一份,并命名jail.local:

1
2
3

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

b.修改默认的全局配置

找到DEFAULT选项,修改为:

1
2
3
4
5
6
7
8
9
10
11
12

[DEFAULT]

# 封禁时间(秒)
bantime = 3600

# 检测时间窗口(10分钟)
findtime = 600

# 最大失败次数
maxretry = 5

此处还是解释一下:

bantime就是默认的封禁时间

如果封禁10分钟,就是10m

如果封禁1小时,就是3600,也可以写成1h

如果封禁1天,就是1d

如果永久封禁,就是-1,表示永久(不会自动解封)

findtime就是默认的检测时间窗口

就是检查日志中的时间,比如10分钟内发现该ip扫描5次错误,就封禁

这个你可以配合日志进行更改,有的脚本很奸诈,比如它每10分钟内只扫描3次,你不修改findtime,规则那就起不到作用了

maxretry就是最大失败次数,这个不用解释了,就是字面意思了,都懂

c.自然是修改监狱jails

启用SSH防护(必须开)

找到sshd,修改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

[sshd]

# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
#mode = normal
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
bantime = 30d
action = iptables-allports[name=sshd]


enabled是启用的意思

port是监听端口,ssh默认是22端口

logpath日志路径,相当于/var/log/auth.log

backend日志读取方式,通常是:systemd或auto,一般不用动,默认就好

bantime封禁时间,这里会覆盖刚刚的default

action自然就是封禁方式,这里的意思是封禁这个IP的所有端口访问。需要的,前往/etc/fail2ban/action.d文件夹查看修改

d.修改Nginx网站的防护规则:

启用nginx-http-auth规则,修改为:

1
2
3
4
5
6
7

[nginx-http-auth]
enabled = true
port = http,https,1100:1200
logpath = /www/wwwlogs/*.log
action = iptables-multiport[name=nginx-http-auth, port="http,https,1100:1200", chain="DOCKER-USER"]

规则的作用是:防止网站登录接口,后台被暴力破解。这对于启用了basic auth的网站很有作用

启用nginx-botsearch规则,修改为:

1
2
3
4
5
6

[nginx-botsearch]
enabled = true
port = http,https
logpath = /www/wwwlogs/*.log

规则的作用是:拦截扫描器 / 恶意爬虫 / 探测路径的机器人

启用phpmyadmin-nginx规则,修改为:

1
2
3
4
5
6
7

[phpmyadmin-nginx]
enabled = true
port = http,https
logpath = /www/wwwlogs/*.log
filter = phpmyadmin-syslog

启用mysqld-auth规则,修改为:

1
2
3
4
5
6
7
8
9
10

[mysqld-auth]
enabled = true
port = 3306
logpath = /www/server/data/xxx.err
backend = auto
bantime = 10m
findtime = 10m
maxretry = 5

e.你可以自定义规则,举个例子

假如你有一个网站,你需要添加规则,那么在jail.local文件里面新增一个nginx-login

1
2
3
4
5
6
7
8
9
10
11
12
13

[nginx-login]
enabled = true
port = http,https
filter = nginx-login
logpath = /www/wwwlogs/xxx.com*.log
#action = iptables-multiport[name=nginx-login, port="http,https,1100:1200", protocol=tcp]
#action = ufw[name=nginx-login, port=http,https, protocol=tcp]
#action = ufw[name=nginx-login, port=any, protocol=all]
#action = iptables-allports[name=nginx-login]
#action = iptables-allports[name=nginx-login, chain="DOCKER-USER"]
action = iptables-multiport[name=nginx-login, port="http,https,1100:1200", chain="DOCKER-USER"]

之后在filter.d目录下新建一个nginx-login.conf,配合你的日志=进行规则更改

1
2
3
4
5

[Definition]
failregex = ^<HOST> - .* "POST /admin/api/account/login\.php HTTP/.*" 401 .*$
ignoreregex =

再然后再action.d目录下新建iptables-multiport.conf,添加需要的规则即可,不过一般默认就可以了

三.重启服务 查看状态 测试封禁 解除封禁 忽略自己

直接给出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

sudo systemctl restart fail2ban (重启)

systemctl status fail2ban (确认fail2ban 正常运行)

sudo fail2ban-client status sshd (查看sshd封禁状态)

sudo fail2ban-client status nginx-http-auth (查看nginx-http-auth封禁状态)

sudo fail2ban-client status nginx-botsearch (查看nginx-botsearch封禁状态)

sudo fail2ban-client get sshd bantime (查看封禁时间)

sudo fail2ban-client status(检查监狱是否启用)

sudo fail2ban-client -t (查看哪里出了问题)

sudo fail2ban-client set sshd banip 1.2.3.4 (手动触发封禁)

sudo fail2ban-client set sshd unbanip 1.2.3.4 (解封)

sudo fail2ban-client set nginx-botsearch unbanip 1.2.3.4

sudo fail2ban-client set nginx-http-auth unbanip 1.2.3.4

sudo fail2ban-client set nginx-login unbanip 1.2.3.4

ignoreip = 127.0.0.1/8 ::1 172.22.0.0/16 192.168.0.0/16 (忽略自己的ip)

四.还有一件事,就是你如果使用了docker容器,比如使用docker安装nginx proxy manager反代理。那么需要在你网站的nginx目录下,获取真实的ip地址,然后在action添加chain,才能获取到真实ip。而且每次修改规则后,都需要重启才能生效。因为我用的是aapanel宝塔面板,所以日志在/www/wwwlogs/目录下。

UFW使用教程:

UFW是Ubuntu系统上最简单易用的防火墙工具,它本质是iptables的前端封装。用UFW,你可以轻松控制谁可以访问你的服务器端口

aapanel宝塔面板默认安装的,我就简单介绍一下流程

一.安装UFW

1
2
3
4

sudo apt update
sudo apt install ufw -y

二.查看UFW状态

1
2
3

sudo ufw status verbose

三.启用 UFW

1
2
3

sudo ufw enable

四.允许防火墙端口

1
2
3
4

sudo ufw allow 222/tcp
sudo ufw allow 222/udp

五.删除对旧端口的允许

1
2
3
4

sudo ufw delete allow 22/tcp
sudo ufw delete allow 22/udp

六.重启

1
2
3

sudo ufw reload

作用:重新加载 /etc/ufw/ 下的规则

给网站添加basic auth密码验证

一.在网站根目录新建一个.htpasswd

二.粘贴用户名密码代码,账号和密码都是666

1
2
3

666:$apr1$R6H2hP8H$CjJQW6VYJ9p7F6sFzY3zA/

三.在本地nginx配置里设置

/www/server/panel/vhost/nginx/xxx.com.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 获取真实ip(关键)
set_real_ip_from 172.16.0.0/12;
real_ip_header X-Forwarded-For;
real_ip_recursive on;


location / {
auth_basic "Restricted Area"; # 显示在弹窗上的提示文字
auth_basic_user_file /www/wwwroot/xxx.com/.htpasswd;

# 处理 OPTIONS 预检请求
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}


}

设置ssh秘钥登录

开始之前输入命令:

1
2
3

ssh-keygen -A #更新身份证

如果禁止root登录,那么用户在/home/xxx/.ssh

1.先打开vps的ssh密码登录,然后运行以下命令来生成 SSH 密钥对:

1
2
3
4
5

ssh-keygen -t rsa -b 4096

文件在/root/.ssh/authorized_keys

2.完成后运行:

1
2
3

cat ~/.ssh/id_rsa.pub

屏幕上会显示一长串字符,那是公钥内容。复制下来备用。

3.继续在PuTTY里敲命令:

1
2
3
4

cd .ssh
cat id_rsa.pub >> authorized_keys

注意那个>>符号,是把公钥内容追加到authorized_keys文件里。

设置正确的文件权限(虽然系统一般会自动设好):

1
2
3
4

chmod 600 authorized_keys
chmod 700 ~/.ssh

4.进入/root/.ssh/目录,把id_rsa这个文件下载到本地保存好。这就是你以后登录的钥匙。

5.配置 SSH 服务禁用密码登录:

编辑服务器上的 SSH 配置文件:

1
2
3

sudo vim /etc/ssh/sshd_config

修改或添加以下配置项:

禁用密码验证:

1
2
3

PasswordAuthentication no

确保以下选项启用:

1
2
3
4
5

PubkeyAuthentication yes

AuthorizedKeysFile .ssh/authorized_keys

6.重启 SSH 服务:

1
2
3

sudo systemctl restart ssh

7.PuTTY登录:

a.需要使用puttygen将id_rsa生成id_rsa.ppk

b.输入IP和端口

c.左侧菜单选:Connection—SSH—Auth—Credentials

d.在”Private key file for authentication”那里选择你的私钥文件

e.点Open连接。输入用户名即可自动登录

结束语录:

其实还有一款防火墙CSF,因为可能会和ufw起冲突,所以我这里就不介绍了,需要的自己去研究安装,哈哈。

说到底UFW是控制入口。Fail2Ban是自动反击,封禁攻击者ip。再给网站加密码验证。再使用秘钥登录。简直就是铜墙铁壁,神仙都难攻。哈哈