Ubuntu 内核通过 netfilter 处理网络数据包,UFW(Uncomplicated Firewall)提供更适合日常管理的简化命令。主机防火墙只负责这台服务器本身,不能替代路由器防火墙、云安全组或应用自身的身份验证。
一、启用前先盘点服务
sudo ufw status verbose
ss -lntup
ss 显示当前监听端口。先弄清 SSH、Web、数据库分别监听什么地址和端口,再写规则。远程服务器最重要的原则是:先放行管理端口,再启用防火墙。
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status verbose
默认拒绝入站(Incoming)、允许出站(Outgoing)适合大多数单机服务器。OpenSSH 是应用配置(Application profile),可用 sudo ufw app list 查看。SSH 若不是默认 22 端口,应明确写成 sudo ufw allow 2222/tcp。
启用后不要立刻关闭当前 SSH,会另开窗口测试登录。若规则有误,旧连接通常还能用来修复。
二、放行和拒绝端口
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw deny 3306/tcp
协议(Protocol)最好明确写 tcp 或 udp。Web 常用 TCP 80/443;DNS 可能同时使用 TCP 和 UDP 53;具体以服务文档为准。deny 会丢弃或拒绝流量,但如果默认入站策略已经是 deny,就不必为每个未开放端口再写一条规则。
放行端口范围:
sudo ufw allow 6000:6010/tcp
范围越大,暴露面越大。只开放业务真实需要的端口,不要因为暂时排障就永久放行整个高端口区间。
三、只允许指定来源
数据库、管理后台等服务通常不该对所有公网地址开放:
sudo ufw allow from 192.168.2.0/24 to any port 22 proto tcp
sudo ufw allow from 192.168.2.10 to any port 3306 proto tcp
第一条允许整个局域网网段访问 SSH,第二条只允许一台主机访问 MySQL。CIDR 中 /24 对应常见的 255.255.255.0 子网掩码。家庭公网 IP 动态变化时,不适合把公网来源写死,必要时可通过 VPN 后再访问管理端口。
规则按方向和匹配条件执行。添加更具体规则后,用状态列表确认是否符合预期:
sudo ufw status numbered
四、删除和修改规则
可以按原规则删除:
sudo ufw delete allow 80/tcp
也可先查看编号,再删除:
sudo ufw status numbered
sudo ufw delete 3
删除后编号会重新排列,因此连续删除多条时每次都重新查看列表。UFW 没有常用的“原地编辑”,通常做法是先添加正确规则、验证成功,再删除旧规则。
sudo ufw disable 只是停用防火墙并保留规则;sudo ufw reset 会重置配置,属于破坏性操作,远程服务器不要在没有控制台退路时使用。
五、日志和故障判断
sudo ufw logging medium
journalctl -k | grep -i ufw | tail -n 50
日志可帮助确认数据包是否被阻止,但详细日志会增加磁盘写入,排障结束后可调回 low。如果端口仍无法访问,按顺序检查:
- 服务进程是否运行。
ss -lntup是否真正监听目标端口。- 服务是否只绑定在
127.0.0.1。 - UFW 是否允许。
- 云安全组或路由器端口映射是否允许。
- 运营商是否屏蔽端口,DNS 是否指向正确地址。
防火墙放行不代表服务一定存在;服务监听也不代表外部路径畅通。分层检查比反复开关 UFW 更容易找到原因。
六、虚拟化、容器和反向代理注意事项
ESXi、Hyper-V 虚拟交换机和宿主机防火墙与虚拟机内 UFW 是不同层。连接失败时要同时确认虚拟机网卡、VLAN、默认网关和虚拟机系统规则。
Docker 等容器工具可能直接操作 iptables/nftables,使部分端口行为与单纯查看 UFW 不完全一致。发现容器端口仍能从外部访问时,不要假设 UFW 已经保护它,应结合容器的发布端口、监听地址和 Docker 防火墙链检查。
最终应维护一张端口清单:端口、协议、程序、允许来源、开放原因和负责人。临时规则写明到期时间并及时回收。
七、限制登录爆破与访问频率
UFW 提供简单的限速(Rate limiting)规则,例如:
sudo ufw limit OpenSSH
它会在短时间出现过多新连接时进行限制,适合减轻简单爆破,但不是完整的入侵防护系统。启用前若已有 allow OpenSSH,应查看编号并避免保留含义冲突的重复规则。公网管理入口更有效的保护仍是 SSH 公钥、禁止 root 密码登录,或仅允许从 VPN 进入。
八、IPv4 与 IPv6 要一起检查
服务器可能同时拥有 IPv4 和 IPv6。sudo ufw status 中带 (v6) 的规则用于 IPv6;/etc/default/ufw 中的 IPV6=yes 决定是否管理 IPv6。只在路由器上挡住 IPv4,却忘记服务器有公网 IPv6,可能让服务从另一条路径暴露。
ip -br address
ss -lntup
重点是盘点每个协议栈的地址、监听和规则,不要为了省事直接禁用 IPv6 而破坏依赖它的应用。
九、出站规则什么时候需要改
默认允许出站适合多数服务器。若业务要求严格限制外连,可为 DNS、NTP、软件仓库和业务接口建立明确规则,但运维复杂度会明显增加。贸然设置 default deny outgoing 可能导致域名解析、时间同步、证书续期和系统更新全部失败。
调整出站策略前先在测试机记录真实依赖,并准备控制台。防火墙规则应服务于清晰的网络设计,而不是“越多越安全”。每条规则都需要能回答允许谁、访问什么、为什么以及何时复查。
本文为中文学习整理。资料来源:Ubuntu Server 官方文档:Firewall。
评论一下?