前言

一直用的阿里云的 vps(轻量云和 ECS),有一个独立于 vps 的防火墙服务,一直用的是那个,Debian 的防火墙也一直处于关闭状态,Fail2ban 依赖于 IPtables,也就一直放着没有配置,最近在看 ssh 和 Frps 的登陆记录才发现不停有机器在尝试登录,这才意识到一个防火墙和 Fail2ban 的重要性。
Debian 10 默认的防火墙换成了 IPtables 的替代 nftables, 1 但是对于没有学习过这方面知识的门外汉来说,IPtables 和 Nftables 实在是过于复杂,于是这里就用更容易入门的 UFW,(简易防火墙)。

what is and why firwall

什么是防火墙,为什么要用防火墙。

就像防火墙这个名字一样,是为了防止火烧到自己的庭院的,也就是一个屏蔽和隔离筛选作用。防火墙最著名的一个应用就是一些国家利用这个技术限制网民访问特定网站,当然错不在工具,而在人。
说回正题,在一般的家用宽带下下面的设备,没有公网ip,作恶的人找不到你的门牌号,是很难直接访问你的设备,也就很难进行主动的网络攻击,但是对于完全暴露在公网中的服务器来说,任何人都可以轻松访问,任何人都知道你的家庭住址,如果不关好门,你家里的财产就危险了。
而防火墙就是担当家门这么一个角色,你可以选择关上或者打开某一扇门,是否允许人从这个门进入你的家。

防火墙可以通过识别不同的网络协议阻挡出站或者入站流量。出站流量是你在本地搭建的例如网站服务向别人提供服务的流量,而入站流量则是你使用其他人提供的服务,或者例如 SSH 需要登入服务器的流量,而对于个人服务器来说,为了安全一般是限制入站流量,防止作恶的人登录你的服务器上的服务。

动手部署

这里是在 Debian buster 上安装,通过 SSH。

配置 UFW

安装 UFW

你需要 sudo 权限,UFW可以直接通过官方源安装

sudo apt-get install ufw

为了防止无法远程登入 SSH 等,UFW不会自动启动。

静静等待安装完成,现在你可以检查 UFW 的状态

sudo ufw status verbose

现在输出会类似如下:

Status: inactive

更多命令可以通过 ufw --help 查看。

配置 UFW

通常推荐默认拒绝所有入站流量,允许所有出站流量

$ sudo ufw default deny incoming
Default incoming policy changed to 'deny'
(be sure to update your rules accordingly)

$ sudo ufw default allow outgoing
Default outgoing policy changed to 'allow'
(be sure to update your rules accordingly)

UFW 可以使用应用程序包附带的描述服务的配置文件中包含 UFW 配置,使用 app 配置可以更方便的管理应用程序的 UFW 设置

查看所有的应用程序配置文件:

sudo ufw app list 

查看 app 具体信息

sudo ufw app info OpenSSH  

快捷开放某个程序需要的防火墙设置

sudo ufw allow OpenSSH

所有配置都在 /etc/ufw/applications.d/。如需修改,前往此目录修改即可。
例如OpenSSH的配置:

[OpenSSH]
title=Secure shell server, an rshd replacement
description=OpenSSH is a free implementation of the Secure Shell protocol.
ports=22/tcp

如果你的 SSH 端口自定义了,也可以直接修改,

sudo vim /etc/ufw/applications.d/openssh

修改保存即可

如果 UFW 运行中修改文件,修改保存后,需要执行 sudo ufw reload 应用规则。

开放某个端口,例如

#开放tcp端口
sudo ufw allow 8080/tcp
#UDP
sudo ufw allow 8080/udp

开放端口范围,


sudo ufw allow 8080:8090

启用 UFW

执行

sudo ufw enable

这时会有提醒此操作会阻断已连接的 ssh 链接,输入y确定即可
这时再次输入

sudo ufw status

就会显示 ufw 目前的规则概要

➜  ~ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

安装和配置 Fail2ban

首先安装 Fail2ban

sudo apt-get install fail2ban

Fail2ban 默认启用 ssh 的过滤器,可以在/etc/fail2ban/jail.conf 查看,但是 Fail2ban 更新会覆盖此文件,建议复制一个 jail.local 进行编辑。

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

此后建议编辑 jail.local

对于 jail.local,你能找到许多 unit
例如 sshd 在文件中如此显示

[sshd]
#mode   = normal
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

输入

 sudo fail2ban-client status
Status
|- Number of jail:      1
`- Jail list:   sshd

可以看到,sshd的过滤器已经默认启动了。

更改默认配置

默认配置在 jail.local 的 [DEFAULT] 下,推荐至少在 ignoreip 中加入自己常用的 ip,(如果不常用有固定公网 ip 登录的倒是无所谓)其他一些配置可以根据自己的需要酌情修改

添加配置:

jail.local 中本来就预设了一些配置,如需添加只需按照自己服务器的情况添加配置,同时添加 enabled = true 以启用此 jail

  • nginx 认证登录监控
[nginx-http-auth]

enabled  = true
filter   = nginx-http-auth
port     = http,https
logpath  = /var/log/nginx/error.log
  • 禁止一些恶意机器人
[nginx-badbots]

enabled  = true
port     = http,https
filter   = nginx-badbots
logpath  = /var/log/nginx/access.log
maxretry = 2
  • 如果网络服务没有提供根目录的服务,可以开启以禁止访问根目录
[nginx-nohome]

enabled  = true
port     = http,https
filter   = nginx-nohome
logpath  = /var/log/nginx/access.log
maxretry = 2
  • 防止被当作代理服务器
[nginx-noproxy]

enabled  = true
port     = http,https
filter   = nginx-noproxy
logpath  = /var/log/nginx/access.log
maxretry = 2

需要确认打开 Nginx 的 log 记录,并且正确填写目录

http 和 https 对应你在前文 NFW 中设置的 app

编辑好后

sudo systemctl restart fail2ban

以启用这些 jails