Ubuntu 启用基础网络过滤规则时,建议先放行 SSH(sudo ufw allow 22/tcp),再执行 sudo ufw enable。启用后系统会默认拒绝所有入站连接、允许所有出站流量,规则会自动排序并持续生效,适合日常服务器防火墙配置。

用 ufw 快速启用基础网络过滤规则
对于绝大多数 Ubuntu 用户来说,通常不需要直接操作 iptables,使用 ufw 就能更高效地完成 Linux 防火墙配置。ufw 本质上是对 iptables 的封装,规则表达更直观,状态管理也更省心。系统默认虽然已安装,但通常并未启用,执行 sudo ufw status verbose 时会看到 Inactive。
在启用防火墙前,建议先放行 SSH 服务,否则远程连接服务器时可能会被直接断开。常见命令是 sudo ufw allow OpenSSH 或 sudo ufw allow 22/tcp。完成后再执行 sudo ufw enable,此时 Ubuntu 会默认拒绝所有入站请求,同时允许出站访问。
- 规则通常按添加顺序进行匹配,但
ufw会自动将allow规则排在deny之前,一般无需手动调整顺序 ufw deny from 192.168.0.5和ufw deny to any port 22的含义并不相同:前者会阻断该 IP 发起的所有入站协议请求,后者仅拦截目标端口为 22 的入站连接- 删除规则时不能只写
ufw delete deny from ...,应先通过sudo ufw status numbered查看规则编号,再执行sudo ufw delete <编号>
用 dumpcap -f 在抓包时做轻量级流量过滤
dumpcap 的 -f 参数并不是防火墙规则,而是基于 BPF 的抓包过滤器,也就是 capture filter。它会在内核收包阶段直接丢弃不匹配的数据包,不进入用户态、不占用额外内存,也不会写入磁盘,因此非常适合做高效网络抓包过滤。这与 Wireshark 中的“显示过滤器”(display filter)完全不同,后者是在抓包完成后再进行筛选,资源已经消耗掉了。
常见错误是直接写成 "http" 或 "dns",但 BPF 并不能识别应用层协议名称,只能识别底层网络字段。正确的过滤写法如下:
- HTTP 流量 →
"tcp port 80"或"tcp port 443"(HTTPS) - 指定主机的进出流量 →
"host 10.0.2.15"(除非明确只抓单向流量,否则不要轻易写成src host或dst host) - 排除广播和多播流量 →
"not broadcast and not multicast" - 组合过滤条件时使用
and/or,括号需要用反斜杠转义:"(tcp port 80) or (udp port 53)"
绕过 ufw 直接配 iptables 的真实场景
虽然 ufw 足以满足多数 Ubuntu 防火墙设置需求,但它并不适用于所有场景。真正需要绕过 ufw、直接配置 iptables 的情况,主要集中在三类:第一类是涉及 PREROUTING 或 POSTROUTING 这样的链操作,例如端口转发和 NAT;第二类是需要对连接状态做更细粒度的控制,比如精确限制只允许 ESTABLISHED+RELATED 的出站流量;第三类则是需要与第三方系统或工具深度联动,例如 Docker 启动时会自动写入底层规则。在这些情况下,直接管理底层规则链顺序和默认策略,通常会比依赖抽象层更稳定、更可控。
如果希望 Ubuntu 主机充当网关并转发网络流量,仅靠 ufw 通常是不够的,还需要补充关键的 iptables 和内核配置。首先执行 sudo iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE 来添加 NAT 规则;其次还要启用内核 IP 转发功能,将 1 写入 /proc/sys/net/ipv4/ip_forward,并同步持久化到 /etc/sysctl.conf,否则服务器重启后该配置不会保留。
-A INPUT表示将规则追加到 INPUT 链末尾,如果前面已经存在DROP规则,那么后添加的allow规则将不会生效- 临时添加的规则在系统重启后会丢失,如需持久化,可使用
iptables-sa ve > /etc/iptables/rules.v4(Ubuntu 22.04+ 默认支持) ufw启用后同样会写入自己的iptables规则,因此混合使用时,建议通过sudo iptables -L -v -n查看最终实际生效的规则顺序
别忽略 Netplan 配置里的路由级过滤线索
Netplan 本身并不提供防火墙或流量过滤能力,但它定义的网卡接口、IP 子网和路由信息,会直接影响哪些流量可以到达本机,这实际上属于网络访问控制中最前置的一层“过滤”。例如已经配置了 routes,却遗漏了 on-link: true,某些直连子网的 ARP 请求就不会被正确发出,后续自然也谈不上继续做防火墙过滤。
一个很典型的配置陷阱是:把 addresses: [192.168.50.10/24] 错写成 /32。这样系统会把该 IP 视为单独主机地址,而不是所在子网的一部分,因此不会响应同一网段其他设备的 ARP 请求。表面上看像是 Ubuntu 防火墙拦截了访问,实际上根本原因是路由与地址配置错误。
- 修改
/etc/netplan/*.yaml后,必须执行sudo netplan apply才会生效,仅重新加载 NetworkManager 并不能完成配置应用 - 如果使用的是
renderer: networkd,那么查看systemd-networkd日志(journalctl -u systemd-networkd)通常会比单纯执行ip a更早发现语法或配置错误 - 在多网卡环境中,
metric数值决定默认路由优先级,数值越小优先级越高;如果两个接口的 metric 完全相同,内核会按字母顺序选择,而不是按照配置书写顺序决定
