服务器端口怎么开放

结论: 开放服务器端口必须同时通过两道关卡——云厂商的安全组(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 年通用实践)。

端口服务是否建议对公网开放说明
22SSH开放,但需加固改端口 + 禁密码 + 密钥登录 + fail2ban
80HTTP开放通常 301 跳转到 443
443HTTPS开放Web 服务标准端口
21FTP不建议明文传输,改用 SFTP(22)
25SMTP视需求入站可开,出站常被云厂商封禁
3306MySQL不建议仅监听 127.0.0.1 或内网
5432PostgreSQL不建议同上
6379Redis严禁未授权访问可直接拿 shell
27017MongoDB严禁历史上大规模勒索事件源头
11211Memcached严禁可被用于 DDoS 反射放大
8080Tomcat / 应用视需求建议用 Nginx 反代,不直接暴露
2375Docker daemon严禁无认证远程控制,等同于交出 root
2376Docker daemon TLS仅内网需配置证书
9200Elasticsearch不建议无认证版本可直接读写数据
9000PHP-FPM / MinIO不建议仅限本机或内网访问
3389Windows RDP限制源 IP暴力破解重灾区

判断原则很简单:这个服务是给"人"用的还是给"程序"用的? 给人用的(Web、SSH、游戏)才需要公网端口;给程序用的(数据库、缓存、注册中心)应当只监听内网或本机。

第一步:先确认服务真的在监听

结论:端口放行的前提是进程已经监听了该端口。先确认监听状态与监听地址,再谈放行。

bash
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 的封装,语法最简单,适合单机管理。

bash
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

管理规则:

bash
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 更适合动态管理。

bash
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:

bash
# 只允许 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 是按顺序匹配,命中即停。

bash
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 5

iptables 规则默认重启即失效,必须持久化:

bash
# 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