来自项目主页:
- Ufw(即 Uncomplicated Firewall 的缩写)是一个管理网络防火墙的程序。它提供了一个命令行界面,并旨在简单(uncomplicated)易用。
nft
接受 iptables 语法(例如在 /etc/ufw/before.rules
中),因此使用 UFW 管理规则的用户无需学习怎么对 iptables 或者 nftables 进行底层调用。安装
启动并启用 ufw.service
使其开机自启。注意,如果 iptables.service
(或者其 ipv6 部分)也被启用了,ufw.service
将不会生效。
基本配置
以下是一个非常简单的配置示例,它将会默认拒绝所有连接,允许来自 192.168.0.1-192.168.0.255 局域网内的所有连接,允许所有目标为 Deluge(一个 BitTorrent 客户端)的连接,并启用了来自任何地方的 SSH 连接速率限制:
# ufw default deny # ufw allow from 192.168.0.0/24 # ufw allow Deluge # ufw limit ssh
要想允许一个端口而不是任何地方进行连接,请参考下面的例子。这三条命令分别允许端口 51312 的 UDP 和 TCP 连接,允许端口 51313 的 UDP 连接,和允许范围从 51312 到 51314 端口的连接:
# ufw allow 51312 # ufw allow 51312/udp # ufw allow 51312:51314
仅当首次安装后第一次使用 UFW 时需要执行:
# ufw enable
ufw.service
已经被启用。最后,使用以下命令确认更改已被应用:
# ufw status
Status: active To Action From -- ------ ---- Anywhere ALLOW 192.168.0.0/24 Deluge ALLOW Anywhere SSH LIMIT Anywhere
使用以下命令来查看额外信息(包括默认策略):
# ufw status verbose
但这依然限制于用户指定的规则。为了查看所有设置的规则,可以使用:
# ufw show raw
或者手册中列出的其他报告。由于这些报告也总结了流量情况,其输出有些难以阅读,为了方便阅读,你可以使用另一种检查传入流量的方法:
# iptables -S | grep ACCEPT # ip6tables -S | grep ACCEPT
请注意,只要你还在使用 ufw
来管理 iptables
,就不要将后者启用。
/etc/sysctl.d/*
中设置了特殊的网络环境变量,请相应更新 /etc/ufw/sysctl.conf
中的内容(因为此配置会覆盖默认配置)。转发策略
如果你需要使用 VPN(例如 OpenVPN 或 WireGuard),可以将 /etc/default/ufw
中的 DEFAULT_FORWARD_POLICY 变量从 "DROP" 调整到 "ACCEPT",以便无论用户如何设置如何都能转发所有数据包。要针对特定接口(例如 wg0)进行转发,用户可以在 *filter 块中添加以下行:
/etc/ufw/before.rules
# End required lines -A ufw-before-forward -i wg0 -j ACCEPT -A ufw-before-forward -o wg0 -j ACCEPT
你可能还需要取消以下行的注释:
/etc/ufw/sysctl.conf
net/ipv4/ip_forward=1 net/ipv6/conf/default/forwarding=1 net/ipv6/conf/all/forwarding=1
添加其他应用
软件包还提供了一些常见守护进程和程序的默认端口配置。可以通过查看 /etc/ufw/applications.d
目录下的文件或使用如下指令查看:
# ufw app list
如果用户正在使用非标准端口运行任何应用程序,建议创建 /etc/ufw/applications.d/custom
文件,并按照默认配置做模板添加所需的数据。
例如,使用自定义的 TCP 端口范围 20202-20205 进行 deluge 下载:
[Deluge-my] title=Deluge description=Deluge BitTorrent client ports=20202:20205/tcp
如果需要为同一应用程序定义 TCP 和 UDP 端口,只需使用竖线进行分隔,如下所示:该应用程序打开 TCP 端口 10000-10002 和 UDP 端口 10003:
ports=10000:10002/tcp|10003/udp
还可以使用逗号来定义端口。此示例打开 TCP 端口 10000-10002(包括端口 10000 和 10002)以及 UDP 端口 10003 和 10009:
ports=10000:10002/tcp|10003,10009/udp
删除应用
根据上面的 Deluge/Deluge-my 示例,以下操作将删除标准的 Deluge 规则,并用上面示例中的 Deluge-my 规则替换它们:
# ufw delete allow Deluge # ufw allow Deluge-my
通过 status 指令查询结果:
# ufw status
Status: active To Action From -- ------ ---- Anywhere ALLOW 192.168.0.0/24 SSH ALLOW Anywhere Deluge-my ALLOW Anywhere
IP地址黑名单
将 IP 地址添加到黑名单可能是一个可取的做法,可以简单地编辑 /etc/ufw/before.rules
文件,在文件底部在 "COMMIT" 的上方插入一个 iptables DROP 行来轻松实现。
/etc/ufw/before.rules
... ## blacklist section # block just 199.115.117.99 -A ufw-before-input -s 199.115.117.99 -j DROP # block 184.105.*.* -A ufw-before-input -s 184.105.0.0/16 -j DROP # don't delete the 'COMMIT' line or these rules won't be processed COMMIT
连接速率限制
ufw 有能力拒绝来自在过去 30 秒内尝试建立 6 次或更多连接的 IP 地址的连接。用户应该考虑在 SSH 之类的服务中使用这个选项。
利用上述基本配置,要启用速率限制,我们只需用 limit 参数替换 allow 参数。然后新规则将取代先前的规则。
# ufw limit SSH
Rule updated
# ufw status
Status: active To Action From -- ------ ---- Anywhere ALLOW 192.168.0.0/24 SSH LIMIT Anywhere Deluge-my ALLOW Anywhere
用户规则
所有的用户规则都储存在 etc/ufw/user.rules
和 etc/ufw/user6.rules
中,分别用于 IPv4 与 IPv6。
技巧和窍门
禁用远程 ping
在以下文件中将 ACCEPT
改为 DROP
:
/etc/ufw/before.rules
# ok icmp codes ... -A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT
如果你正在使用 IPv6, 请一同更改 /etc/ufw/before6.rules
中的规则。
禁用 UFW 日志
禁用 UFW 日志可以让 UFW 停止填充内核(dmesg)和消息日志:
# ufw logging off
UFW 与 Docker
Docker 在默认状态下会编写 iptables 规则并忽视 ufw 规则,这可能会造成一些安全隐患。一种解决方案是使用 https://github.com/chaifeng/ufw-docker 。
ufw-docker install
来自动修复 iptables 规则。这个脚本也能帮你管理 Docker 相关的 ufw 规则,详细参见 ufw-docker help
。
GUI 前端
如果你在使用 KDE Plasma,可以安装 plasma-firewall包,然后直接在 Wi-Fi & Networking > Firewall 中调整防火墙配置。
Gufw
gufw包 是一个用于 Ufw 的 GTK 前端,旨在使 Linux 防火墙的管理尽可能简单易用。它具有常见端口和 p2p 应用程序的预设设置。其依赖于软件包 python包,ufw包 以及 GTK 支持。
参考
- Ubuntu UFW 文档
- ufw(8)
- 使用 ipsets 为 ufw 添加屏蔽列表:https://github.com/poddmo/ufw-blocklist