UFW 即 Uncomplicated Firewall ,是 iptables 一个接口,旨在简化防火墙的配置过程。UFW 默认安装在 Ubuntu 上,如果由于某种原因已经卸载,可以使用 apt install ufw -y 命令来安装之。本文简单介绍如何在 Ubuntu 18.04 上使用 UFW 设置防火墙。以下操作是在 root 账号下进行的, 非 root 账号需提升到 root 权限。

启用 IPv6 支持

如果服务器已启用 IPv6 ,请确保将 UFW 配置为支持 IPv6 ,以便除 IPv4 之外还管理 IPv6 的防火墙规则。使用如下命令修改 UFW 的配置文件:

vim /etc/default/ufw

IPV6=no修改为IPV6=yes,输入:wq保存并退出。

启用防火墙

输入以下命令查看防火墙的状态:

ufw status verbose

如果终端中返回 Status: inactive ,说明防火墙未启用。默认情况下,UFW 将阻止所有传入连接并允许所有传出连接。也就是说,除非专门打开特定端口,否则任何尝试对服务器的访问都无法连接,但服务器上运行的应用程序和服务却能够对外访问。在启用防火墙之前,首先添加允许 ssh 通过防火墙的规则,以避免启用防火墙之后将自己锁在服务器之外的惨剧发生。使用如下命令添加允许 ssh 通过防火墙的规则:

ufw allow ssh

如果修改了 ssh 连接的默认端口,例如已经将端口改成了 666 ,则使用如下命令对端口 666 放行:

ufw allow 666

使用如下命令启用防火墙并设置开机启动:

ufw enable

命令执行后终端提示可能会中断 ssh 连接,由于我们已经添加了允许 ssh 通过防火墙的规则,此处输入 y 继续。输入以下命令查看防火墙状态:

ufw status verbose

命令执行的结果如下:

root@timelate:~# ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
666                        ALLOW IN    Anywhere                  
666 (v6)                   ALLOW IN    Anywhere (v6)             

在返回的结果中我们可以看到刚刚添加的允许端口 666 通过防火墙的规则,且防火墙的状态已经变成了 active 。

防火墙应用示例

通过 allow 允许连接

允许特定端口通过防火墙,例如允许端口 888 通过防火墙:

ufw allow 888      #同时放行888端口的 tcp 和 udp
ufw allow 888/tcp  #放行888端口的 tcp
ufw allow 888/udp  #放行888端口的 udp

允许 http 通过防火墙:

ufw allow http

ufw allow 80/tcp

允许 https 通过防火墙:

ufw allow https

ufw allow 443/tcp

同时允许 http 和 https 通过防火墙:

ufw allow proto tcp from any to any port 80,443  #同时添加多个端口的时候需要指明协议  

允许特定端口范围通过防火墙
使用 UFW 指定端口范围时,必须指定规则适用的协议( tcp 或 udp ),以下为示例:

ufw allow 10000:10100/tcp  #允许 10000~10100 端口的 tcp 通过防火墙
ufw allow 10000:10100/udp  #允许 10000~10100 端口的 udp 通过防火墙

允许特定 ip 地址的连接
通过添加 from 后跟 ip 地址的方式来允许特定 ip 的连接,如允许来自 123.123.123.123 的连接:

ufw allow from 123.123.123.123

通过添加 to any port 后跟端口号方式来允许特定IP地址连接到特定端口,如允许来自 123.123.123.123 到端口 888 的连接:

ufw allow from 123.123.123.123 to any port 888

允许子网连接
使用 CIDR 表示法指定网络掩码,允许子网连接,如允许从 192.168.1.1 到 192.168.1.254 子网的连接:

ufw allow from 192.168.1.0/24

通过添加 to any port 后跟端口号方式来允许子网连接到特定端口,如允许 192.168.1.1 到 192.168.1.254 子网到服务器 3306 端口(MySQL)的连接:

ufw allow from 192.168.1.0/24 to any port 3306

通过 deny 拒绝连接

拒绝连接到特定端口
如果更改了防火墙的默认策略,例如允许所有传入连接,可通过 deny 拒绝连接到特定端口,例如拒绝连接到端口 888 :

ufw deny 888      #同时拒绝888端口的 tcp 和 udp
ufw deny 888/tcp  #拒绝888端口的 tcp
ufw deny 888/udp  #拒绝888端口的 udp

拒绝来自特定ip的连接
有时网站正遭受攻击,可添加如下规则拒绝来自特定 ip 的连接,如拒绝来自 123.123.123.123 的连接:

ufw deny from 123.123.123.123

拒绝子网的连接
有时候想阻止某个子网的连接,如阻止从 192.168.1.1 到 192.168.1.254 子网的连接,可通过以下方式添加规则:

ufw deny from 192.168.1.0/24

通过 delete 删除规则

有时某条规则不再适用,想将其从规则列表中删除,可通过以下的方式进行删除:
首先执行 ufw status verbose 命令查看防火墙状态,返回结果如下:

root@timelate:~# ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
666                        ALLOW IN    Anywhere                  
80/tcp                     ALLOW IN    Anywhere                  
443/tcp                    ALLOW IN    Anywhere  
Anywhere                   ALLOW IN    123.123.123.123                
666 (v6)                   ALLOW IN    Anywhere (v6)             
80/tcp (v6)                ALLOW IN    Anywhere (v6)             
443/tcp (v6)               ALLOW IN    Anywhere (v6)    

例如,要删除允许来自 ip 123.123.123.123 连接的规则,执行如下命令即可:

ufw delete allow from 123.123.123.123

也可以通过查询规则编号,通过规则编号删除规则。通过以下命令查询规则编号:

ufw status numbered

命令执行后返回结果如下:

root@timelate:~# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 666                        ALLOW IN    Anywhere                  
[ 2] 80/tcp                     ALLOW IN    Anywhere                  
[ 3] 443/tcp                    ALLOW IN    Anywhere                  
[ 4] Anywhere                   ALLOW IN    123.123.123.123           
[ 5] 666 (v6)                   ALLOW IN    Anywhere (v6)             
[ 6] 80/tcp (v6)                ALLOW IN    Anywhere (v6)             
[ 7] 443/tcp (v6)               ALLOW IN    Anywhere (v6)             

允许来自 ip 123.123.123.123 连接的规则编号为 4 ,通过以下命令删除规则:

ufw delete 4

命令执行后返回结果如下,询问是否继续。输入 y 并回车继续:

root@timelate:~# ufw delete 4
Deleting:
 allow from 123.123.123.123
Proceed with operation (y|n)? y
Rule deleted

启用防火墙日志

启用防火墙的时候默认是开启日志的,可通过 ufw status verbose 命令查看日志开启状态,如果返回结果中显示 Logging: on (low) ,则说明日志模式已开启;如果结果中显示 Logging: off ,则说明日志模式未开启,使用如下命令开启防火墙日志:

ufw logging on

可以通过运行 ufw logging low|medium|high 设计日志级别,可以选择 lowmedium 或者 high 三种级别。默认级别是 low 。日志默认保存在 /var/log/ufw.log 中,使用如下命令查看防火墙日志:

tail -f /var/log/ufw.log

常规日志类似下面这样:

Nov 12 05:49:43 <hostname> kernel: [83258.797472] [UFW BLOCK] IN=eth0 OUT= MAC=9a:29:20:d7:40:78:30:7c:5e:93:1c:70:08:00 SRC=212.253.85.147 DST=138.96.248.64 LEN=40 TOS=0x00 PREC=0x00 TTL=50 ID=36516 PROTO=TCP SPT=41599 DPT=23 WINDOW=37967 RES=0x00 SYN URGP=0

前面的值列出了服务器的日期、时间、主机名,剩下的重要信息说明如下:

  • [UFW BLOCK]:这是记录事件描述的开始位置,在此例中,它表示阻止了连接
  • IN:如果它包含一个值,那么代表该事件是传入事件
  • OUT:如果它包含一个值,那么代表事件是传出事件
  • MAC:目的地和源 MAC 地址的组合
  • SRC:包源的 IP
  • DST:包目的地的 IP
  • LEN:数据包长度
  • TTL:数据包 TTL,或称为 time to live。在找到目的地之前,它将在路由器之间跳跃,直到它过期
  • PROTO:数据包的协议
  • SPT:包的源端口
  • DPT:包的目标端口
  • WINDOW:发送方可以接收的数据包的大小
  • SYN URGP:指示是否需要三次握手, 0 表示不需要

停用防火墙

如果决定不再使用防火墙,可通过以下命令停用之:

ufw disable

执行以上命令后使用 UFW 创建的任何规则将不再处于活动状态。如果以后需要激活它们,可以随时运行 ufw enable 命令启用防火墙以使规则生效。

重置防火墙

如果想将防火墙初始化为系统默认状态,可以通过以下命令对防火墙进行重置:

ufw reset

执行以上命令后终端会提示所有规则将会被设置为默认值,询问是否继续。输入 y 并回车以完成防火墙重置。防火墙重置后不仅规则被设置为默认值,而且防火墙的状态也被设置为停用,通过 ufw status verbose 命令查询可知,防火墙的状态为 inactive

本文简单介绍了如何在 Ubuntu 18.04 上使用 UFW 设置防火墙,如需更详细的设置,请参考官方文档,点此查看官方文档。

文章目录