13 10 月 2026

服务器被攻破,八成和端口有关。要么开了一堆用不到的服务,要么把敏感端口暴露在公网。端口管理是服务器安全里性价比最高的一件事:关掉不该开的,攻击面立刻缩小。

这篇讲端口安全的完整方法论:怎么审计现有端口、怎么按需开放、怎么持续监控。命令全部可抄。

需要云服务器可以看看财富云计算:NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,一键开服面板,主流游戏快速部署。

一、核心原则:默认拒绝,按需开放

安全策略只有两种逻辑:

  • 黑名单:默认全开,封掉危险的(❌ 永远追不上新威胁)
  • 白名单:默认全关,只开需要的(✅ 最小攻击面)

所有成熟的安全体系都是白名单思维。落到服务器上就是:

INPUT 默认 DROP → 只放行明确需要的端口和来源

二、第一步:审计现有端口

# 看所有监听中的 TCP/UDP 端口和对应进程
ss -tulnp

# 只看 TCP
ss -tlnp

# 输出解读:
# Netid State  Local Address:Port  Process
# tcp   LISTEN 0.0.0.0:22          sshd
# tcp   LISTEN 127.0.0.1:3306      mysqld    ← 只听本地,安全
# tcp   LISTEN 0.0.0.0:6379        redis-server ← 全网可达,危险!

重点看两列:

  1. Local Address:0.0.0.0 或 :: = 监听所有网卡(公网可达);127.0.0.1 = 只听本地(安全)
  2. Process:这个端口是谁开的,用不用得上

再对比防火墙实际放行了什么:

# iptables 规则
iptables -L -n -v

# firewalld
firewall-cmd --list-all

# ufw
ufw status verbose

最后去云厂商控制台看安全组规则——这层在系统外面,很多人忘了它。

三、第二步:判定每个端口该不该开

常见端口安全评级

端口服务公网开放建议
22SSH⚠️ 可开,但改端口 + 密钥登录 + fail2ban
80/443HTTP/HTTPS✅ 必须开
3306MySQL❌ 绝不开,只听 127.0.0.1
6379Redis❌ 绝不开,只听 127.0.0.1
27017MongoDB❌ 绝不开(无认证默认被拖库)
5432PostgreSQL❌ 不开
9200/9300Elasticsearch❌ 绝不开(重灾区)
3389Windows 远程桌面⚠️ 可开,改端口 + 强密码 + 限制来源 IP
445/139/135SMB/NetBIOS❌ 关掉(蠕虫病毒入口)
23Telnet❌ 明文协议,直接禁用
21FTP❌ 明文,用 SFTP 代替
111rpcbind❌ 不用 NFS 就关
游戏端口游戏服✅ 按需开 UDP/TCP

「用不到的服务」清单

这些在云服务器上基本用不到,默认开机自启的话关掉:

# 看开机自启的服务
systemctl list-unit-files --state=enabled

# 常见可禁用的(确认用不到再禁)
systemctl disable --now postfix      # 邮件
systemctl disable --now rpcbind      # NFS/文件共享
systemctl disable --now bluetooth    # 蓝牙
systemctl disable --now avahi-daemon # 设备发现
systemctl disable --now cups         # 打印
systemctl disable --now ModemManager # 调制解调器

禁一个服务少一个监听端口,也少一个潜在漏洞。

四、第三步:按需开放的配置方法

场景 1:Web 服务器

# ufw 配置(Debian/Ubuntu)
ufw default deny incoming      # 默认拒绝入站
ufw default allow outgoing     # 默认允许出站
ufw allow 22/tcp               # SSH
ufw allow 80/tcp               # HTTP
ufw allow 443/tcp              # HTTPS
ufw enable

场景 2:游戏服务器

# 以方舟为例,UDP 游戏端口 + TCP RCON
ufw allow 7777/udp             # 游戏端口
ufw allow 7778/udp             # 查询端口
ufw allow 27015/udp            # Steam 查询
ufw allow 27020/tcp            # RCON(建议限制来源 IP)
# RCON 只给管理员 IP:
ufw allow from 1.2.3.4 to any port 27020 proto tcp

场景 3:数据库只听本地

# 不需要防火墙规则——因为只听 127.0.0.1,外部根本进不来
# MySQL: bind-address = 127.0.0.1
# Redis: bind 127.0.0.1
# 但要确认防火墙没有放行(双保险)
ufw status | grep 3306    # 应该没有任何规则

firewalld 版本(CentOS/RHEL)

# 查看
firewall-cmd --list-ports
firewall-cmd --list-services

# 放行
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-service=https

# 富规则:限制来源 IP(更安全)
firewall-cmd --permanent --add-rich-rule='
  rule family="ipv4" 
  source address="1.2.3.4" 
  port port="22" protocol="tcp" accept'

# 删除默认服务(比如 dhcpv6-client 不用就删)
firewall-cmd --permanent --remove-service=dhcpv6-client

firewall-cmd --reload

五、第四步:云安全组(最外层防线)

系统防火墙之外,云厂商的安全组是第一道门。去控制台配:

方向建议
入站只放行 22(限制来源 IP)、80、443、游戏端口
出站一般全放行(除非严格环境)

两个常见错误:

  1. 图省事选「放通全部端口」——等于没配
  2. 只配了系统防火墙忘了安全组——外层没挡,内层规则形同虚设

NAT 型云服务器的特殊性:没有独立公网 IP,公网访问全部经过服务商网关的端口映射。这时候:

  • 映射端口清单 = 你的公网攻击面。控制台里逐个核对,用不到的映射删掉
  • 网关层一般自带基础防护,比裸公网 IP 安全
  • 千万别为了「方便」把 3306、6379 加进映射

六、第五步:持续监控端口变化

端口不是配一次就完事——装个新软件、中个马,都会冒出新监听。

定期巡检脚本

#!/bin/bash
# /opt/scripts/port-audit.sh
# 对比当前监听端口和基线,发现新增就告警

BASELINE="/opt/scripts/port-baseline.txt"
CURRENT="/tmp/port-current.txt"

ss -tuln | awk 'NR>1 {print $1, $5}' | sort > "$CURRENT"

if [ ! -f "$BASELINE" ]; then
    cp "$CURRENT" "$BASELINE"
    echo "基线已建立"
    exit 0
fi

NEW=$(comm -13 "$BASELINE" "$CURRENT")
if [ -n "$NEW" ]; then
    echo "发现新监听端口:"
    echo "$NEW"
    # 发告警(邮件/企业微信,按你的方式)
fi
# 挂 crontab 每天检查
0 8 * * * /opt/scripts/port-audit.sh

用工具扫自己

# 装 nmap,从外部视角看暴露面
apt install -y nmap    # 或 yum install -y nmap

# 扫自己的公网 IP(看网关/安全组实际放行什么)
nmap -sS -Pn -p- 你的公网IP
# -p- 扫全部 65535 个端口

扫出来的端口,逐个问自己:这个是我开的吗?用得到吗? 有一个算一个处理掉。

七、端口变更的正确流程

以后要开新端口,按这个流程:

  1. 确认必要性:这个服务必须公网访问吗?能不能只听本地 + 反代?
  2. 确认协议:TCP 还是 UDP?游戏服常见 UDP,别只开 TCP
  3. 最小来源:能限制 IP 就限制(管理端口尤其)
  4. 三层都要开:系统防火墙(ufw/iptables)+ 云安全组 + NAT 映射(如果用 NAT 机型)
  5. 更新基线:把新端口加进 port-baseline.txt
  6. 验证:nmap 从外网扫,确认开对了、开够了

八、常见问题

Q:ufw 开了防火墙,自己也被挡了?
先 ufw allow 22/tcp 再 ufw enable。如果已经作死锁死自己,用控制台 VNC 进去关掉 ufw 再重新配。

Q:SSH 端口改还是不改?
改。22 端口每天被扫几百次,改成 22222 之类的非常规端口能挡掉 90% 的自动化扫描。改完记得安全组和防火墙同步放行。

Q:游戏端口 UDP 和 TCP 都要开吗?
看游戏。方舟、RUST、帕鲁的游戏端口是 UDP;查询端口有些是 UDP 有些是 TCP;RCON 是 TCP。开之前查好该游戏用哪些协议,开错了玩家进不来。

Q:端口开着但服务挂了,和端口关闭有区别吗?
扫描结果一样(都不通),但资源占用和安全意义不同。服务挂了的端口如果进程还在(僵死),可能被利用。用不到的服务直接禁掉,别只关端口。

Q:怎么知道某个端口被谁在连?

ss -tunp | grep :端口号
# 或装 netstat
netstat -tunp | grep :端口号

Q:Docker 的端口怎么管?
Docker 会直接操作 iptables,绕过 ufw 规则!用 Docker 的话,端口绑定要绑到具体 IP:-p 127.0.0.1:8080:80,别用 -p 8080:80(那是绑 0.0.0.0)。或者用 Docker 的网络隔离。

小结

端口安全五步:审计现有端口 → 关掉用不到的服务 → 默认拒绝按需放行 → 三层(系统防火墙+安全组+映射)同步配置 → 定期扫描对比基线。这套做完,你的公网攻击面就只剩「必须暴露的那几个端口」,被扫到漏洞的概率大幅下降。

更多安全教程见财富云计算知识库:防火墙配置、fail2ban、SSH 密钥登录、安全基线全系列。需要云服务器可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,网关映射可控,暴露面更小。

延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:数据库安全加固与权限最小化:MySQL 加固完整方案
  2. 下一篇:rsync 同步与定时备份实战:增量备份 + 硬链接方案
发表评论 10