ubuntu ufw防火墙

Ubuntu 自带的防火墙配置工具全名叫作 Uncomplicated Firewall 的 ufw,意思就是简单的、不复杂的防火墙。

ufw其实只是一个iptables的前端设定程序,最后的规则都还是会走iptables,而且比较复杂的功能还是要直接透过iptables才有办法做到! 如果想看 ufw 设定完的 iptables 结果只要用这个命令就可以看到了:iptables -L -n

安装 UFW

UFW 是标准 Ubuntu 20.04 安装过程中的一部分,它应该已经在你的系统上存在。如果因为某些原因,它没有被安装,你可以通过输入下面的命令安装它:

$ sudo apt update
$ sudo apt install ufw

启停 UFW 及查看状态

检查是否启动关键字状态是 status:

$ sudo ufw status
Status: inactive

提示 inactive 是不活跃没有启动的。启停UFW的关键字分别是 enable 和 disable,也就是启用和停用。

关闭防火墙:

$ sudo ufw disable 
Firewall stopped and disabled on system startup

启动防火墙:

$ sudo ufw enable
Firewall is active and enabled on system startup

启动 ufw 后,再次执行ufw status会看到类似以下信息:

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere                  
22/tcp (v6)                ALLOW       Anywhere (v6)  

查看 ufw 相关的查看详细信息:

$ sudo ufw status verbose

查看带编号的服务信息 [用于 remove 时的编号参数]:

$ sudo ufw status numbered

设置默认行为

设置默认行为,也就是对于没有手动设定规则的连接该怎么处理。

比较安全的设置方式,建议把默认连入设置为 deny,也就是没有手动设置允许通过的连接就会被挡下来:

$ sudo ufw default deny

明确一点默认禁止所有其它主机连接该主机:

$ sudo ufw default deny incoming

默认允许该主机所有对外连接请求

$ sudo ufw default allow outgoing

默认行为这部份在ufw status看不到结果,但是我们加上 verbose 请 ufw 列出详细信息就看的到了:

$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere                  
22/tcp (v6)                ALLOW IN    Anywhere (v6) 

对端口或服务设定规则

基本语法如下,port可以换成服务名称:

ufw <allow/deny>

也就是跟 ufw 说你要允许或是拒绝某個连接或是服务就可以了,假如要开放http服务 ufw 知道 http 預設是使用 80 port:
(关于 port / serveice 的对应可以參考 /etc/services )

$ sudo ufw allow http
Rule added
Rule added (v6)

设置后可以通过ufw status进行确认:

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere                  
80/tcp                     ALLOW       Anywhere                  
22/tcp (v6)                ALLOW       Anywhere (v6)             
80/tcp (v6)                ALLOW       Anywhere (v6)             

如果想要禁止 http 连接连入就可以:

$ sudo ufw deny http

如果要进一步指定在 tcp 或 udp 的连接可以这样:

$ sudo ufw allow http/tcp
$ sudo ufw allow http/udp

刚刚预设的规则默认对是”连入“方向进行设置, ufw 可以在 deny / allow 后面接上 in / out 来表示连入或者连出。禁止本机通过的 http / https port 连接到外部,可以使用以下命令:

$ sudo ufw deny out http
$ sudo ufw deny out https

再次ufw status查看 ufw 状态:

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere                  
80/tcp                     DENY        Anywhere                  
22/tcp (v6)                ALLOW       Anywhere (v6)             
80/tcp (v6)                DENY        Anywhere (v6)             

80/tcp                     DENY OUT    Anywhere                  
443/tcp                    DENY OUT    Anywhere                  
80/tcp (v6)                DENY OUT    Anywhere (v6)             
443/tcp (v6)               DENY OUT    Anywhere (v6)  

允许特定端口范围:

$ sudo ufw allow 6000:6007/tcp
$ sudo ufw allow 6000:6007/udp

应用配置

大部分应用都附带一份应用配置,它描述了服务,并且包含了 UFW 设置。这个规则在软件包安装的时候,被自动创建在/etc/ufw/applications.d目录下。

想要列举出你系统上所有的应用配置,可以通过sudo ufw app list查看:

$ sudo ufw app list
Available applications:
  OpenSSH

列出的数量与系统上安装的软件包有关系。想要查找更多关于OpenSSh指定配置和包含规则的信息,使用sudo ufw app info 'OpenSSH'命令查看:

$ sudo ufw app info 'OpenSSH'
Profile: OpenSSH
Title: Secure shell server, an rshd replacement
Description: OpenSSH is a free implementation of the Secure Shell protocol.

Port:
  22/tcp

针对 IP 连接的设置

语法为:

ufw <allow/deny> <from/to>

这里 from / to 和刚刚的 in / out 有点像,例如想要对所有私网IP对这台机器进行连接,可以这样做:

$ sudo ufw allow from 10.0.0.0/8
$ sudo ufw allow from 172.16.0.0/12
$ sudo ufw allow from 192.168.0.0/16

如果想要禁止从 192.168.1.123 这个 IP 来的连接:

$ sudo ufw deny from 192.168.1.123

也可以加上 port :

$ sudo ufw deny from 192.168.1.1 port 22

假设我对外只有一个IP 192.168.1.1,而我要禁止这个IP连接到其他主机 http / https 默认的 80 / 443 port,除了刚刚的范例 (ufw deny out http),也可以这样做:

$ sudo ufw deny from 192.168.1.1 to any port 80
$ sudo ufw deny from 192.168.1.1 to any port 443

假如指定允许192.168.1.0/24网段访问本机的22端口的TCP协议:

$ sudo ufw allow proto tcp from 192.168.1.0/24 to any port 22

禁止所有 IP 连入 192.168.1.1 的 ssh 端口,来达到跟前面范例ufw deny ssh一样的效果:

$ sudo ufw deny from any to 192.168.1.1 port 22

禁止 192.168.1.1 到 192.168.1.104 的连接:

$ sudo ufw deny from 192.168.1.1 to 192.168.1.104

删除规则

删除禁止本机通过的 http / https port 连接到外部:

$ sudo ufw delete deny out http/tcp
$ sudo ufw delete deny out https/tcp
$ sudo ufw delete deny  http/tcp

删除禁止 192.168.1.1 到 192.168.1.104 的连接:

$ sudo ufw delete deny from 192.168.1.1 to 192.168.1.104

也可以让 ufw 告诉我们规则的编号,再进行删除:

$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere                  
[ 2] 80/tcp                     DENY OUT    Anywhere                   (out)
[ 3] 443/tcp                    DENY OUT    Anywhere                   (out)
[ 4] 443/tcp                    DENY IN     Anywhere                  
[ 5] Anywhere                   DENY IN     192.168.1.123             
[ 6] Anywhere                   DENY IN     192.168.1.1 22            
[ 7] 22/tcp (v6)                ALLOW IN    Anywhere (v6)             
[ 8] 80/tcp (v6)                DENY OUT    Anywhere (v6)              (out)
[ 9] 443/tcp (v6)               DENY OUT    Anywhere (v6)              (out)
[10] 443/tcp (v6)               DENY IN     Anywhere (v6)             

假设删除第二条:

$ sudo ufw delete 2
Deleting:
 deny out 80/tcp
Proceed with operation (y|n)? y
Rule deleted

可以通过reset删除所有规则,重设 ufw:

$ sudo ufw reset

配置 UFW

让ufw命令操作同时对IPv4和IPv6都生效:
修改/etc/default/ufw文件,‘IPV6=yes’,然后重启防火墙sudo ufw disable然后sudo ufw enable