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
。