防火墙配置:ufw / firewalld / iptables 基础

用 ufw(Ubuntu)、firewalld(RHEL)或底层 iptables 给你的服务器放行必要端口、拦掉其余流量,并避免把自己锁在门外。

防火墙决定哪些网络流量能进出你的服务器。不同发行版自带的管理工具不同:Ubuntu/Debian 常用 ufw,RHEL/CentOS/Rocky/AlmaLinux 常用 firewalld,两者底层都是内核的 iptables(或更新的 nftables)。下面分开讲,别把命令用混。

ufw(Ubuntu / Debian)

ufw 是「简化版防火墙」,语法直观。常用操作:

sudo ufw allow 22/tcp        # 放行 22 端口(SSH)
sudo ufw allow OpenSSH       # 用应用名放行,等价于上一条
sudo ufw allow 80,443/tcp    # 放行 HTTP/HTTPS
sudo ufw deny 23             # 拦截 23 端口(Telnet)
sudo ufw enable              # 开启防火墙
sudo ufw status verbose      # 查看规则与默认策略
sudo ufw delete allow 80     # 删除某条规则

ufw 默认策略通常是「拒绝入站、允许出站」,所以开启后没显式 allow 的端口都会被挡。

firewalld(RHEL / CentOS / Rocky / Alma)

firewalld 以「区域(zone)」和「服务(service)」为核心,区分运行时和永久两套配置。

sudo firewall-cmd --add-service=http --permanent   # 永久放行 HTTP 服务
sudo firewall-cmd --add-port=8080/tcp --permanent  # 永久放行 8080 端口
sudo firewall-cmd --reload                          # 重载,使永久规则生效
sudo firewall-cmd --list-all                        # 查看当前区域的所有规则

要点:带 --permanent 的改动写入配置文件但不会立刻生效,必须 --reload 才应用;不带 --permanent 的改动立即生效但重启后丢失。想两者都要,可先加运行时规则确认无误,再加 --permanent 固化。

iptables 基础

iptables 是底层引擎,ufw 和 firewalld 本质上都在替你生成 iptables 规则。理解几个概念即可:

  • 表(table):最常用的是 filter 表,负责放行/拒绝。
  • 链(chain):INPUT(进入本机)、OUTPUT(本机发出)、FORWARD(转发)。
  • 规则(rule):按顺序匹配,命中即执行 ACCEPT / DROP / REJECT。

查看当前规则:

sudo iptables -L -n -v       # 列出所有链和规则(-n 不做 DNS 反查,更快)

日常运维建议用 ufw 或 firewalld,除非有特殊需求,一般不必手写 iptables。

千万别把自己锁在门外

远程管理服务器全靠 SSH。如果先启用防火墙却没放行 SSH 端口,连接会立刻中断,而且你再也 SSH 不上去。正确顺序:

  • 先放行 SSH 端口(默认 22/tcp,若改过端口就放行实际端口)。
  • 确认规则已存在(ufw status 或 firewall-cmd --list-all)。
  • 再 enable 或 reload。

真被锁在门外时,别慌——通过 VPS 服务商控制台的 VNC / 网页终端 / 救援模式登录,可以绕过 SSH 直接改回防火墙规则。

安全组 ≠ 主机防火墙

云平台的安全组运行在虚拟机外面的网络层,由平台统一管控;而 ufw/firewalld 是跑在操作系统里面的主机防火墙。一个数据包要进入你的服务,必须两层都放行。排查「端口不通」时,记得两边都查:安全组少开一个端口,主机内配置再对也没用;反过来同理。

小结

Ubuntu 用 ufw、RHEL 用 firewalld,底层都是 iptables。任何改动前先确保 SSH 端口已放行,再启用或重载,避免自锁。同时记住安全组(平台层)和主机防火墙(系统层)是两道独立的门,两道都放行,流量才真正通得过。