Uncomplicated Firewall
来自项目 主页
- Ufw 是 Uncomplicated Firewall 的缩写,它是一个用于管理 netfilter 防火墙的程序。它提供命令行界面,旨在简洁易用。
nft 接受 iptables 语法(例如在 /etc/ufw/before.rules 中),习惯使用 UFW 管理规则的用户无需学习 iptables 或 nftables 的底层调用。安装
安装 ufw 包。
启动并启用 ufw.service 使其在启动时可用。请注意,如果 iptables.service 也被启用(及其 ipv6 对应项),这将不起作用。
基本配置
一个非常简单的配置,默认拒绝所有,允许来自 192.168.0.1-192.168.0.255 LAN 的任何协议,并允许来自 *任何地方* 的传入 Deluge 和 *速率限制* 的 SSH 流量。
# ufw default deny # ufw allow from 192.168.0.0/24 # ufw allow Deluge # ufw limit ssh
要从 *任何地方* 允许一个端口,请使用以下示例允许端口 51312 UDP 和 TCP,仅端口 51312 UDP,或端口范围从 51312 到 51314。
# ufw allow 51312 # ufw allow 51312/udp # ufw allow 51312:51314
第一次安装包后,只需要执行下面这一行。
# ufw enable
ufw.service 已被启用。最后,通过 status 命令查询正在应用的规则。
# 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
以及 manpage 中列出的进一步报告。由于这些报告还总结了流量,因此可能有些难以阅读。另一种检查已接受流量的方法是
# 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 文件,并使用默认设置作为指南来包含所需数据。
示例:deluge 的自定义 TCP 端口范围为 20202-20205。
[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(含)和 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 进行速率限制
ufw 能够拒绝在过去 30 秒内尝试发起 6 次或更多连接的 IP 地址的连接。用户应考虑为 SSH 等服务使用此选项。
使用上述基本配置,要启用速率限制,只需将 allow 参数替换为 limit 参数。新规则将替换之前的规则。
# 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
用户规则
所有用户规则分别存储在 IPv4 的 etc/ufw/user.rules 和 IPv6 的 etc/ufw/user6.rules 中。
技巧与提示
禁用远程 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 中。
禁用 IPv6 处理
在 /etc/default/ufw 中将 IPV6=yes 更改为 IPV6=no 并重新加载规则。这将删除先前生成的规则以及新规则的生成。
禁用 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。图形化前端
如果您正在使用 KDE Plasma,您可以直接进入 *Wi-Fi & Networking > Firewall* 来访问和调整防火墙配置,前提是已安装 plasma-firewall。
Gufw
gufw 是 Ufw 的一个 GTK 前端,旨在让 Linux 防火墙的管理尽可能易于访问和使用。它具有常见端口和 p2p 应用程序的预设。它需要 python、ufw 和 GTK 支持。
参见
- Ubuntu UFW 文档
- ufw(8)
- 使用 ipsets 向 ufw 添加阻止列表:https://github.com/poddmo/ufw-blocklist