Skip to content

🏗️ 实战场景

场景一:Web 服务器

你的服务器运行 Nginx + Node.js + MySQL,需要开放 Web 端口,限制数据库访问。

使用 UFW(Ubuntu):

bash
# 开启防火墙
sudo ufw enable

# 允许 SSH(限制来源更安全)
sudo ufw allow from 203.0.113.0/24 to any port 22

# 允许 Web 服务
sudo ufw allow "Nginx Full"

# 只允许本机访问 MySQL
# (MySQL 默认只监听 127.0.0.1,这是额外保障)
sudo ufw allow from 127.0.0.1 to any port 3306

# 允许内网访问 Node.js 调试端口
sudo ufw allow from 192.168.1.0/24 to any port 9229

# 查看最终规则
sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    203.0.113.0/24
80,443/tcp (Nginx Full)    ALLOW IN    Anywhere
3306                       ALLOW IN    127.0.0.1
9229                       ALLOW IN    192.168.1.0/24

使用 firewalld(CentOS):

bash
# 启动 firewalld
sudo systemctl start firewalld
sudo systemctl enable firewalld

# 开放 Web 服务
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https

# 限制 SSH 来源
sudo firewall-cmd --permanent --add-rich-rule='
  rule family="ipv4"
  source address="203.0.113.0/24"
  port protocol="tcp" port="22"
  accept'

# 允许内网访问 MySQL
sudo firewall-cmd --permanent --add-rich-rule='
  rule family="ipv4"
  source address="192.168.1.0/24"
  port protocol="tcp" port="3306"
  accept'

sudo firewall-cmd --reload

# 验证
sudo firewall-cmd --list-all
public (active)
  target: default
  interfaces: eth0
  services: dhcpv6-client http https
  rich rules:
    rule family="ipv4" source address="203.0.113.0/24" port port="22" protocol="tcp" accept
    rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept

场景二:数据库服务器

数据库服务器只允许应用服务器访问,完全对外不暴露。

bash
# UFW 方案
sudo ufw default deny incoming
sudo ufw allow from 192.168.1.100 to any port 3306    # 应用服务器 1
sudo ufw allow from 192.168.1.101 to any port 3306    # 应用服务器 2
sudo ufw allow from 10.0.0.0/24 to any port 22        # 管理网段 SSH
sudo ufw allow 9100/tcp                                # Prometheus 监控
sudo ufw enable

# firewalld 方案
sudo firewall-cmd --permanent --set-default-zone=drop   # 最严格

# 只信任内网管理 SSH
sudo firewall-cmd --permanent --zone=drop --add-rich-rule='
  rule family="ipv4"
  source address="10.0.0.0/24"
  port protocol="tcp" port="22"
  accept'

# 只允许应用服务器访问 MySQL
sudo firewall-cmd --permanent --zone=drop --add-rich-rule='
  rule family="ipv4"
  source address="192.168.1.100"
  port protocol="tcp" port="3306"
  accept'

sudo firewall-cmd --permanent --zone=drop --add-rich-rule='
  rule family="ipv4"
  source address="192.168.1.101"
  port protocol="tcp" port="3306"
  accept'

sudo firewall-cmd --reload

场景三:DMZ 设置

DMZ(非军事区)就像小区的访客接待室——外面的人可以进来,但不能进到你家里面。

bash
# 使用 firewalld 的 dmz 区域
sudo firewall-cmd --permanent --zone=dmz --add-service=http
sudo firewall-cmd --permanent --zone=dmz --add-service=https
sudo firewall-cmd --permanent --zone=dmz --add-service=ssh

# 把 DMZ 接口绑定到 dmz 区域
sudo firewall-cmd --permanent --zone=dmz --change-interface=eth0

# 内网接口绑定到 trusted 区域
sudo firewall-cmd --permanent --zone=trusted --change-interface=eth1

# DMZ 服务器可以访问内网的数据库(特定端口)
sudo firewall-cmd --permanent --zone=dmz --add-rich-rule='
  rule family="ipv4"
  destination address="192.168.1.200"
  port protocol="tcp" port="3306"
  accept'

# 开启伪装(NAT),让内网机器能上网
sudo firewall-cmd --permanent --zone=external --add-masquerade

sudo firewall-cmd --reload

# 查看 DMZ 配置
sudo firewall-cmd --zone=dmz --list-all
dmz (active)
  target: default
  interfaces: eth0
  services: http https ssh
  rich rules:
    rule family="ipv4" destination address="192.168.1.200"
    port port="3306" protocol="tcp" accept

💡 提示: 💡 安全最佳实践总结:默认拒绝所有入站,只开放需要的端口SSH 限制来源 IP,不要对全世界开放数据库端口只允许应用服务器访问使用非标准端口(如 SSH 用 2222)减少扫描定期检查防火墙规则,清理不再需要的开启日志,监控异常连接测试规则时先用临时规则,确认无误再永久化