防火墙与端口管理规范
2026/3/20大约 6 分钟
防火墙与端口管理规范
[!warning] > 默认拒绝,显式允许 —— 防火墙配置的黄金法则。只开放必要的端口,其他一律拒绝。
核心原则
- 最小暴露原则:只开放业务必需的端口
- 分层防护:云安全组 + 系统防火墙双重防护
- 内外分离:内部服务不暴露到公网
- 记录审计:所有规则变更都应该有记录
端口规划
常用端口分类
| 端口范围 | 用途 | 示例 |
|---|---|---|
| 1-1023 | 系统保留端口 | 22(SSH), 80(HTTP), 443(HTTPS) |
| 1024-49151 | 注册端口 | 3000(Node), 3306(MySQL), 5432(PostgreSQL) |
| 49152-65535 | 动态/私有端口 | 临时连接使用 |
推荐的端口规划
公网暴露(必须):
├── 22 → SSH(建议改为非标准端口)
├── 80 → HTTP(重定向到 HTTPS)
└── 443 → HTTPS
仅内网/本地(禁止公网暴露):
├── 3306 → MySQL
├── 5432 → PostgreSQL
├── 6379 → Redis
├── 27017 → MongoDB
├── 9200 → Elasticsearch
└── 3000-9000 → 应用服务端口
UFW(Ubuntu/Debian 推荐)
基础操作
# 查看状态
sudo ufw status verbose
# 启用防火墙
sudo ufw enable
# 禁用防火墙
sudo ufw disable
# 重置所有规则
sudo ufw reset
初始化配置
# 1. 设置默认策略:拒绝入站,允许出站
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 2. 允许 SSH(重要!否则会被锁在外面)
sudo ufw allow ssh
# 或指定端口
sudo ufw allow 22/tcp
# 3. 允许 HTTP/HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 4. 启用防火墙
sudo ufw enable
常用规则
# 允许特定端口
sudo ufw allow 3000/tcp
# 允许端口范围
sudo ufw allow 8000:8100/tcp
# 允许特定 IP
sudo ufw allow from 192.168.1.100
# 允许特定 IP 访问特定端口
sudo ufw allow from 192.168.1.100 to any port 3306
# 允许子网
sudo ufw allow from 192.168.1.0/24
# 允许特定网卡
sudo ufw allow in on eth1 to any port 3306
# 删除规则
sudo ufw delete allow 3000/tcp
# 按编号删除
sudo ufw status numbered
sudo ufw delete 3
应用配置文件
# 查看可用的应用配置
sudo ufw app list
# 查看应用详情
sudo ufw app info 'Nginx Full'
# 允许应用
sudo ufw allow 'Nginx Full'
sudo ufw allow 'OpenSSH'
firewalld(CentOS/RHEL 推荐)
基础操作
# 查看状态
sudo firewall-cmd --state
# 重新加载配置
sudo firewall-cmd --reload
# 查看所有规则
sudo firewall-cmd --list-all
# 查看所有区域
sudo firewall-cmd --get-zones
# 查看默认区域
sudo firewall-cmd --get-default-zone
初始化配置
# 1. 设置默认区域为 public
sudo firewall-cmd --set-default-zone=public
# 2. 允许 SSH
sudo firewall-cmd --permanent --add-service=ssh
# 3. 允许 HTTP/HTTPS
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# 4. 重新加载
sudo firewall-cmd --reload
常用规则
# 添加端口(permanent 表示永久生效)
sudo firewall-cmd --permanent --add-port=3000/tcp
# 添加端口范围
sudo firewall-cmd --permanent --add-port=8000-8100/tcp
# 添加服务
sudo firewall-cmd --permanent --add-service=mysql
# 允许特定 IP
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" accept'
# 允许特定 IP 访问特定端口
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="3306" accept'
# 删除端口
sudo firewall-cmd --permanent --remove-port=3000/tcp
# 删除服务
sudo firewall-cmd --permanent --remove-service=mysql
# 记得重新加载
sudo firewall-cmd --reload
区域管理
# 创建自定义区域
sudo firewall-cmd --permanent --new-zone=apps
# 将网卡绑定到区域
sudo firewall-cmd --permanent --zone=internal --change-interface=eth1
# 查看区域配置
sudo firewall-cmd --zone=internal --list-all
iptables(底层/传统方式)
提示
除非有特殊需求,否则推荐使用 ufw 或 firewalld,它们底层都是基于 iptables/nftables 实现的。
基础操作
# 查看规则
sudo iptables -L -n -v
# 查看规则(带行号)
sudo iptables -L -n --line-numbers
# 保存规则(Ubuntu)
sudo iptables-save > /etc/iptables/rules.v4
# 恢复规则
sudo iptables-restore < /etc/iptables/rules.v4
基础规则配置
# 清空所有规则
sudo iptables -F
# 设置默认策略
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
# 允许回环接口
sudo iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的连接
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许 SSH
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许 HTTP/HTTPS
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许 ping
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
云服务商安全组
注意
云安全组是第一道防线,必须配置!即使系统防火墙配置正确,安全组不放行也无法访问。
阿里云安全组配置
入方向规则:
| 优先级 | 端口范围 | 授权对象 | 描述 |
|---|---|---|---|
| 1 | 22/22 | 公司 IP | SSH 仅限公司 |
| 1 | 80/80 | 0.0.0.0/0│ HTTP | |
| 1 | 443/443 | 0.0.0.0/0│ HTTPS | |
| 100 | -1/-1 | 0.0.0.0/0│ 拒绝所有 |
AWS 安全组配置
Inbound Rules:
| Type | Port Range | Source |
|---|---|---|
| SSH | TCP 22 | My IP |
| HTTP | TCP 80 | 0.0.0.0/0 |
| HTTPS | TCP 443 | 0.0.0.0/0 |
最佳实践
1. 只暴露必要端口
# ❌ 错误:开放所有端口
sudo ufw allow 1:65535/tcp
# ✅ 正确:只开放需要的端口
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
2. 数据库端口只允许内网访问
# MySQL 只允许本机访问
sudo ufw allow from 127.0.0.1 to any port 3306
# 或只允许内网
sudo ufw allow from 10.0.0.0/8 to any port 3306
# ❌ 绝对不要这样做
sudo ufw allow 3306/tcp # 暴露数据库到公网
3. SSH 端口加固
# 修改 SSH 端口(可选)
# 编辑 /etc/ssh/sshd_config: Port 22222
# 只允许特定 IP 访问 SSH
sudo ufw allow from 203.0.113.50 to any port 22
# 或限制访问频率(防暴力破解)
sudo ufw limit ssh
4. 应用服务端口规划
# 应用只监听 127.0.0.1,通过 Nginx 反向代理
# Node.js: app.listen(3000, '127.0.0.1')
# 这样即使防火墙配置错误,服务也不会暴露
# Nginx 反向代理
# location / {
# proxy_pass http://127.0.0.1:3000;
# }
故障排查
检查端口是否开放
# 检查本机端口监听状态
ss -tlnp
netstat -tlnp
# 检查防火墙规则
sudo ufw status
sudo firewall-cmd --list-all
# 从外部检测端口
nc -zv your-server-ip 80
nmap -p 80,443 your-server-ip
# 检查云安全组(登录云控制台查看)
连接不上的排查步骤
1. 检查服务是否在运行
→ systemctl status nginx
2. 检查服务监听地址
→ ss -tlnp | grep nginx
→ 确认是 0.0.0.0:80 而不是 127.0.0.1:80
3. 检查系统防火墙
→ sudo ufw status
→ 确认端口已开放
4. 检查云安全组
→ 登录云控制台检查入站规则
5. 检查网络连通性
→ ping server-ip
→ traceroute server-ip
实战脚本
初始化防火墙脚本(UFW)
#!/bin/bash
# init-firewall.sh - 初始化防火墙配置
set -e
echo "=== 初始化 UFW 防火墙 ==="
# 重置规则
sudo ufw --force reset
# 设置默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 允许 SSH(重要!)
sudo ufw allow ssh
# 允许 HTTP/HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 允许内网访问所有端口(可选)
# sudo ufw allow from 10.0.0.0/8
# 启用防火墙
sudo ufw --force enable
# 显示状态
sudo ufw status verbose
echo "=== 防火墙初始化完成 ==="