结论: 开放服务器端口必须同时通过两道关卡——云厂商的安全组(Security Group)和系统内的防火墙(ufw / firewalld / iptables),任意一层未放行都不通。正确的操作顺序是:先用 ss -lntp 确认服务已在监听,再开安全组,最后开系统防火墙,并从外部网络验证结果。
引言:九成的"端口开了却连不上"都出在双层模型
新手最常遇到的场景是这样的:在服务器上执行了 firewall-cmd --add-port=8080/tcp,本机 curl localhost:8080 也正常,但同事从外面就是访问不了。原因是云服务器有两层独立的访问控制:
- 第一层:云安全组,运行在虚拟化层,是云厂商提供的虚拟防火墙。报文在到达你的操作系统之前就先被它过滤,你在系统内敲任何命令都感知不到它的存在。
- 第二层:系统防火墙,即 Linux 内核 netfilter 的 iptables/nftables 规则,由 ufw、firewalld 等工具管理。
两层是"与"的关系,必须都放行。更麻烦的是,某些云厂商的默认安全组只放行 22 和 3389,如果你忘了这一层,就会陷入"配置明明没错"的死循环。
常用端口放行清单
先给结论:数据库、缓存、容器管理端口默认绝对不要对公网开放。下表是常见端口的放行建议(截至 2026 年通用实践)。
| 端口 | 服务 | 是否建议对公网开放 | 说明 |
|---|---|---|---|
| 22 | SSH | 开放,但需加固 | 改端口 + 禁密码 + 密钥登录 + fail2ban |
| 80 | HTTP | 开放 | 通常 301 跳转到 443 |
| 443 | HTTPS | 开放 | Web 服务标准端口 |
| 21 | FTP | 不建议 | 明文传输,改用 SFTP(22) |
| 25 | SMTP | 视需求 | 入站可开,出站常被云厂商封禁 |
| 3306 | MySQL | 不建议 | 仅监听 127.0.0.1 或内网 |
| 5432 | PostgreSQL | 不建议 | 同上 |
| 6379 | Redis | 严禁 | 未授权访问可直接拿 shell |
| 27017 | MongoDB | 严禁 | 历史上大规模勒索事件源头 |
| 11211 | Memcached | 严禁 | 可被用于 DDoS 反射放大 |
| 8080 | Tomcat / 应用 | 视需求 | 建议用 Nginx 反代,不直接暴露 |
| 2375 | Docker daemon | 严禁 | 无认证远程控制,等同于交出 root |
| 2376 | Docker daemon TLS | 仅内网 | 需配置证书 |
| 9200 | Elasticsearch | 不建议 | 无认证版本可直接读写数据 |
| 9000 | PHP-FPM / MinIO | 不建议 | 仅限本机或内网访问 |
| 3389 | Windows RDP | 限制源 IP | 暴力破解重灾区 |
判断原则很简单:这个服务是给"人"用的还是给"程序"用的? 给人用的(Web、SSH、游戏)才需要公网端口;给程序用的(数据库、缓存、注册中心)应当只监听内网或本机。
第一步:先确认服务真的在监听
结论:端口放行的前提是进程已经监听了该端口。先确认监听状态与监听地址,再谈放行。
sudo ss -lntup # 查看所有 TCP/UDP 监听与对应进程
sudo ss -lntp | grep ':8080' # 精确查某个端口
sudo lsof -i :8080 # 另一种查法
ps aux | grep -E 'nginx|java|node' # 确认进程存活重点看 Local Address 这一列:
0.0.0.0:8080—— 监听所有网卡,公网可达。127.0.0.1:8080—— 只监听本机,无论防火墙怎么开,外部都连不上。这是数据库默认该有的状态。:::8080—— IPv6 全地址监听。
如果服务只监听 127.0.0.1,需要修改应用配置(如 MySQL 的 bind-address、Spring Boot 的 server.address)为 0.0.0.0 或具体内网 IP。
第二步:云安全组放行
结论:安全组在云控制台操作,优先级高于系统内一切配置;规则支持按端口、协议、源 IP 三个维度精确控制。
通用操作路径:云控制台 → 云服务器 / 实例 → 安全组 → 添加入站规则。填写要点:
- 协议类型:TCP / UDP / ICMP 要选对,DNS、游戏服、QUIC 多用 UDP。
- 端口范围:单个填
8080,连续段填8000-8100,多个离散端口通常是建多条规则。 - 授权对象(源):填具体 IP 或网段比
0.0.0.0/0安全得多。SSH、数据库这类只给运维用的端口,务必限定为你公司的出口 IP。 - 优先级:多数厂商支持数字优先级,显式拒绝规则的优先级应高于放行规则。
建议的最小开放集:
- 22(限定源 IP)
- 80、443(0.0.0.0/0)
- 业务需要的自定义端口
其余一律不开放,先靠内网或 SSH 隧道访问。
第三步:用 ufw 放行(Ubuntu / Debian 首选)
结论:ufw(Uncomplicated Firewall)是 iptables 的封装,语法最简单,适合单机管理。
sudo apt install -y ufw
# 设置默认策略:拒绝所有入站,允许所有出站
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 先放行 SSH,避免把自己锁在门外(改过端口就填改后的)
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'
# 连续端口段与协议
sudo ufw allow 8000:8100/tcp
# 只允许指定 IP 访问某端口(数据库、SSH 推荐)
sudo ufw allow from 203.0.113.5 to any port 3306 proto tcp
sudo ufw allow from 203.0.113.0/24 to any port 22 proto tcp
# 启用并查看
sudo ufw enable
sudo ufw status numbered管理规则:
sudo ufw status numbered # 列出带编号的规则
sudo ufw delete 3 # 按编号删除
sudo ufw delete allow 8080/tcp # 按规则删除
sudo ufw reload
sudo ufw disable # 关闭(排错时临时用)注意:ufw 默认同时管理 IPv4 与 IPv6,若不需要 IPv6 可编辑 /etc/default/ufw 把 IPV6=no。
第四步:用 firewalld 放行(CentOS / Rocky / AlmaLinux)
结论:firewalld 引入"区域(zone)"概念,网卡归属于某个区域,规则按区域生效,比 iptables 更适合动态管理。
sudo systemctl enable --now firewalld
sudo firewall-cmd --state
sudo firewall-cmd --get-active-zones
# 放行端口与服务(--permanent 写入持久配置)
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-port=8000-8100/tcp
# 只有永久规则需要 reload 才生效
sudo firewall-cmd --reload
sudo firewall-cmd --list-all需要按来源 IP 精确控制时用 rich rule:
# 只允许 203.0.113.5 访问 22 端口
sudo firewall-cmd --permanent --add-rich-rule='
rule family="ipv4" source address="203.0.113.5/32"
port protocol="tcp" port="22" accept'
# 禁止某 IP 段访问 3306
sudo firewall-cmd --permanent --add-rich-rule='
rule family="ipv4" source address="198.51.100.0/24"
port protocol="tcp" port="3306" drop'
sudo firewall-cmd --reload移除规则用 --remove-port=8080/tcp、--remove-service=http、--remove-rich-rule='...'。
第五步:用 iptables 直接写规则(通用兜底)
结论:ufw 和 firewalld 最终都翻译成 iptables/nftables 规则。遇到老系统或需要精细控制时,直接写 iptables 更直观,但要注意规则顺序——iptables 是按顺序匹配,命中即停。
sudo iptables -L -n --line-numbers # 查看规则及序号
sudo iptables -L INPUT -n -v
# 允许已建立的连接与回环(这两条应该总是在最前)
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT
# 放行具体端口
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
# 限定源 IP(-I 插到最前面,优先级最高)
sudo iptables -I INPUT -p tcp -s 203.0.113.5 --dport 22 -j ACCEPT
# 放通 UDP(如游戏服、DNS)
sudo iptables -A INPUT -p udp --dport 8211 -j ACCEPT
# 删除第 5 条规则
sudo iptables -D INPUT 5iptables 规则默认重启即失效,必须持久化:
# Debian / Ubuntu
sudo apt install -y iptables-persistent
sudo netfilter-persistent save # 写入 /etc/iptables/rules.v4
# CentOS 系可手动保存
sudo iptables-save | sudo tee /etc/iptables/rules.v4
企业QQ咨询




