🌐 第08章 · 云防火墙与端口开放
云商安全组 + 本机 ufw 双层防护
云防火墙与端口开放¶
这一章讲云主机的"双层防火墙":云服务商控制台的安全组(也叫防火墙/安全组)+ 宿主机内部防火墙(ufw/iptables)。很多"连不上"的问题不是配置错了,而是这"两层"里有一层没放行。本机场景:云安全组放行 80/443/22 与 21115-21117。
为什么要分两层¶
- 云安全组(第一层):在云商网络边界生效,是进出虚拟机的第一道闸。这里没放行,包根本到不了你的网卡。
- 本机防火墙(第二层):在操作系统内核(netfilter/iptables,或 ufw 上层封装)生效。本机没放行,包到了网卡也被丢掉。
两层是"与"的关系:任何一层放行才能通。排查"连不上"时,先确认云安全组,再确认本机防火墙,顺序别反。
第一步:查云安全组¶
腾讯云/阿里云/华为云控制台 → 实例 → 安全组/防火墙规则。看:
| 出/入 | 协议/端口 | 来源 |
|---|---|---|
| 入站 | TCP 80 | 0.0.0.0/0 |
| 入站 | TCP 443 | 0.0.0.0/0 |
| 入站 | TCP 22 | 你的管理 IP |
| 入站 | TCP 21115/21116/21117 | 0.0.0.0/0(如跑 RustDesk) |
注意 | 云安全组默认一般只放行
22/3389或按镜像预设。买了实例打不开网站,十有八九是安全组没放行 80/443。另外出站规则别被顺手封掉(自建 GitLab 发邮件、Xray 连出、拉取依赖都靠出站)。
第二步:本机防火墙现状¶
先看本机到底开没开、有哪些规则:
# ufw 是 iptables 的上层封装,更简单
sudo ufw status verbose # 看到 inactive 表示本机防火墙没起作用(全靠云安全组)
# 也可以直接看内核规则
sudo iptables -L -n
提示 | 本机
ufw status显示 inactive 是正常的——很多云主机直接依赖云安全组,不再配本地防火墙。但要清楚:此时"拦不拦"完全由云安全组决定。
ufw 常用操作¶
# 开放某个端口(协议默认 TCP)
sudo ufw allow 80
sudo ufw allow 443
sudo ufw allow 21115/tcp
sudo ufw allow 21116/tcp
sudo ufw allow 21116/udp # hbbs 的 21116 是 TCP+UDP 都要放!
sudo ufw allow 21117/tcp
# 只允许特定 IP 用 SSH(更安全)
sudo ufw allow from 203.0.113.10 to any port 22
# 删除 / 查看 / 启用
sudo ufw status numbered
sudo ufw delete 2
sudo ufw enable
sudo ufw disable
注意 | 千万别在启用防火墙时把 22 端口封了,否则你再也 SSH 不进去。习惯顺序:先放 22 → 再放业务端口 → 最后
ufw enable,中间别断开当前连接。万一断了,去云商控制台的"VNC/救援"或"修改安全组临时放行我的来源 IP"救回。
iptables 直接操作(ufw 底层)¶
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 21116 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -s 203.0.113.10 -j ACCEPT
sudo iptables -L -n # 查看
提示 | iptables 规则重启会丢,要落地成
iptables-persistent(netfilter-persistent save)或改用 ufw,避免重启后规则消失。
本机实际端口规划参考¶
结合这台服务器的真实服务,放行清单如下(云安全组与本机防火墙一致即可):
| 端口 | 协议 | 用途 |
|---|---|---|
| 22 | TCP | SSH 管理(建议只开放管理 IP) |
| 80 / 443 | TCP | 网站系(bangdream/lovelive/dsh/gitlab/learn) |
| 21115 | TCP | RustDesk hbbs(身份/授权) |
| 21116 | TCP+UDP | RustDesk hbbs(注册/心跳,必须 TCP+UDP) |
| 21117 | TCP | RustDesk hbbr(中继) |
| 21118/21119 | TCP | RustDesk 客户端 ID / 中继(可选) |
验证放行是否生效¶
# 本机能看到 LISTEN(注意监听地址:127.0.0.1 只有本机,0.0.0.0 才能被外网访问)
ss -tlnp | grep ':443\|:21116'
# 从外网另一台机器测(或临时用 curl --interface)
nc -zv <你的公网IP> 443
常见坑 | 服务监听在
127.0.0.1(如 GitLab 的 8090、Xray 的 10086),即使你放行了端口,外网也连不上——因为根本没监听在0.0.0.0。这时应该由外层 nginx(监听0.0.0.0:443)反代过来,而不是直接把 127.0.0.1 端口暴露公网。
相关命令¶
sudo ufw status/sudo ufw status verbose看详细规则。sudo iptables -L -n -v看字节计数,判断某条规则有没有被命中。ss -tlnp确认监听地址(127.0.0.1 vs 0.0.0.0)。nc -zv从外部测端口连通性。