理解端口、内网/公网的区别,以及 HTTPS 证书的作用,是把自托管服务安全地暴露到公网的前提。

端口(Port)

IP 地址用来找到网络上的某一台设备,端口用来找到这台设备上的某一个程序/服务

IP 地址 = 小区地址(哪栋楼)
端口    = 门牌号(哪一户)

一台设备有 65536 个端口(0~65535),每个服务监听一个或多个端口。

常见端口

端口协议用途
22TCPSSH 远程登录
80TCPHTTP(明文网页)
443TCPHTTPS(加密网页)
3306TCPMySQL 数据库
5432TCPPostgreSQL 数据库
6379TCPRedis
5230TCPMemos
8080TCP常用的 HTTP 替代端口/开发服务器
3000TCP常用的 Node.js 开发端口
53UDP/TCPDNS 查询

端口范围约定

范围用途
0~1023知名端口(Well-known),系统保留,需要管理员权限才能监听
1024~49151注册端口,常见服务注册在这
49152~65535动态/私有端口,随便用

自己部署服务时,建议从 1024 以上选端口。

公网 IP vs 内网 IP

内网 IP(私有地址)

家里/公司局域网内的设备使用的 IP,只能在局域网内互相访问,不能直接从互联网访问。

192.168.x.x     ← 最常见,家用路由器分配
10.x.x.x        ← 大型企业/学校内网
172.16.x.x~172.31.x.x  ← 也是私有地址
127.0.0.1       ← 本机回环地址(localhost),只有自己能访问
0.0.0.0         ← 监听所有网卡(不是一个真实IP,表示"谁来都接")

你的电脑、手机、NAS、树莓派,在家里拿到的都是 192.168.x.x 这样的内网 IP。

公网 IP(Public IP)

运营商分配给你家路由器的 IP,可以在互联网上被直接访问到。

你家路由器:拿到公网 IP(如 1.2.3.4)
   │
   ├── 你的电脑:192.168.1.100(内网)
   ├── 你的手机:192.168.1.101(内网)
   └── NAS:192.168.1.200(内网)

怎么看自己有没有公网 IP?

  1. 登录路由器管理页面,看 WAN 口 IP 地址
  2. 百度搜”IP”,看显示的 IP
  3. 如果两个 IP 一致 → 有公网 IP;不一致 → 是运营商内网(CGNAT),需要内网穿透

从公网访问家里的服务:端口转发

如果你有公网 IP,需要在路由器上配置端口转发(Port Forwarding)虚拟服务器,告诉路由器:

公网访问 80/443 端口 → 转发到内网 192.168.1.100 的 80/443(Nginx 服务器)

互联网用户
    │
    │ 访问 1.2.3.4:443
    ▼
你家路由器(公网IP 1.2.3.4)
    │
    │ 端口转发规则:443 → 192.168.1.100:443
    ▼
内网服务器 192.168.1.100(Nginx 反代)
    │
    ├── 127.0.0.1:5230 → Memos
    └── 127.0.0.1:4000 → 博客

安全提醒

不要把数据库端口(3306、5432、6379)、SSH 端口(22)直接暴露到公网,或者至少做好防火墙限制和强密码/密钥认证。HTTP 服务(80/443)通过 Nginx 反代暴露是相对安全的。

没有公网 IP 怎么办:内网穿透

如果运营商不给公网 IP(很多宽带、手机热点都是这样),需要用内网穿透工具:

工具特点
Cloudflare Tunnel免费,和 Cloudflare 生态集成,不需要公网 IP,不需要开放端口,推荐
frp开源,需要一台有公网 IP 的 VPS 做中转
ngrok开箱即用,免费版有带宽和域名限制
Tailscale/WireGuardVPN 方案,组网后设备间互相访问,不暴露公网

Cloudflare Tunnel 是目前最推荐的方案:

  • 完全免费
  • 不需要公网 IP,不需要在路由器做任何配置
  • 自动 HTTPS
  • 源站 IP 完全隐藏
  • 安装一个 cloudflared 服务就行,它主动和 Cloudflare 建立长连接,流量从 Cloudflare 推过来

HTTPS 与 SSL/TLS 证书

为什么需要 HTTPS

HTTP 是明文传输的,中间经过的路由器、运营商、WiFi 热点都能看到你传输的内容(密码、Cookie 等),还能篡改内容(比如插入广告)。

HTTPS = HTTP + TLS/SSL 加密,解决三个问题:

问题解决方式
窃听(别人看到内容)加密传输
篡改(内容被修改)完整性校验
冒充(连到假网站)证书验证服务器身份

SSL 证书是什么

证书本质是一个由可信第三方(CA,证书颁发机构) 签名的文件,证明”这个域名确实属于这台服务器”。

你的浏览器 → 访问 blog.linqin.xyz
    │
    │ 服务器返回它的证书
    ▼
浏览器验证证书
    │
    │ 证书是受信任的 CA 签的、域名匹配、没过期 → ✅ 信任,继续连接
    │ 否则 → ❌ 浏览器警告"连接不安全"
    ▼
协商加密密钥,开始加密通信

证书类型

类型验证级别价格适合场景
DV(域名验证)证明你拥有这个域名免费个人网站、博客、绝大多数自托管场景
OV(组织验证)验证域名+组织身份付费企业官网
EV(扩展验证)严格审核组织身份银行、金融、大型电商

个人/自托管场景用 DV 证书就够了。

免费证书:Let’s Encrypt

Let’s Encrypt 是一个免费、自动化的 CA,90天有效期,但可以自动续期。

  • certbot:经典工具,配合 Nginx/Apache 自动申请和续期
  • acme.sh:更轻量的 ACME 客户端
  • Caddy:内置自动申请+续期,配置里写个邮箱就搞定,不需要手动操作
  • Cloudflare:开橙色云后 Cloudflare 直接提供证书,源站甚至可以不配证书(Full 模式建议自签或配 Cloudflare Origin Certificate)

Cloudflare 的 HTTPS 模式

如果你用 Cloudflare,SSL/TLS 有几种模式:

模式浏览器→CloudflareCloudflare→源站安全性推荐
OffHTTP 明文HTTP 明文❌ 完全不加密
FlexibleHTTPS 加密HTTP 明文⚠️ 中间一段明文⚠️ 应急用
FullHTTPS 加密HTTPS 加密(源站证书可以自签)✅ 端到端加密✅ 推荐
Full (strict)HTTPS 加密HTTPS 加密(源站证书必须可信)✅✅ 最严格✅ 推荐(源站配 Cloudflare Origin CA 证书)

不要长期用 Flexible 模式

Flexible 模式下 Cloudflare 到你的服务器是明文 HTTP,如果你服务器在公网,这一段流量可能被窃听/篡改。建议至少用 Full 模式,源站证书用自签名或者 Cloudflare Origin CA 证书就行。

自签名证书

你也可以自己给自己签证书(不需要 CA),但浏览器不信任,会显示安全警告。适合:

  • 纯内网服务(不暴露公网)
  • 测试环境
  • Cloudflare Full 模式(Cloudflare 信任你的自签证书,用户浏览器看不到警告)

防火墙

防火墙决定哪些端口的流量可以进出服务器。

系统级防火墙

  • Linuxufw(Ubuntu 推荐)、firewalld(CentOS/RHEL)、iptables(底层)
  • Windows:Windows Defender 防火墙
# ufw 示例(Ubuntu/Debian)
ufw allow 22/tcp    # 允许 SSH
ufw allow 80/tcp    # 允许 HTTP
ufw allow 443/tcp   # 允许 HTTPS
ufw enable          # 启用防火墙
ufw status          # 查看规则

原则

默认拒绝所有入站,只开放需要的端口(80/443/22)。用 反向代理 后,后端服务(5230、8080 等)都监听 127.0.0.1,防火墙根本不需要开放这些端口。

云服务器安全组

如果你用 VPS(腾讯云、阿里云、AWS 等),还有一层安全组(云厂商的虚拟防火墙),需要在控制台单独放行端口。安全组和系统防火墙是两层,都要配置。

一张图总结:自托管网络全貌

                        互联网
                           │
                    ┌──────▼──────┐
                    │ Cloudflare  │  CDN/DNS/HTTPS/反代(可选)
                    │  (橙色云)   │
                    └──────┬──────┘
                           │ 公网 IP 1.2.3.4:443
                    ┌──────▼──────┐
                    │   路由器    │  端口转发 443 → 192.168.1.100
                    │ (如果有公网IP)│  或用 Cloudflare Tunnel 穿透
                    └──────┬──────┘
                           │ 内网
              ┌────────────▼────────────┐
              │   防火墙(ufw/安全组)   │  只开 22/80/443
              └────────────┬────────────┘
                           │
              ┌────────────▼────────────┐
              │  Nginx/Caddy (反代:443) │  处理 HTTPS、分发请求
              └──┬──────┬──────┬──────┬─┘
                 │      │      │      │
            ┌────▼─┐ ┌──▼───┐ ┌▼────┐ ┌▼────┐
            │Memos │ │博客  │ │网盘 │ │ ... │  都监听 127.0.0.1
            │:5230 │ │:4000 │ │:8080│ │     │  不对外开放端口
            └──────┘ └──────┘ └─────┘ └─────┘

常见问题

Q: 为什么我输入 http://服务器IP 能访问,但用域名访问不行? 可能原因:

  1. DNS 没生效(等 TTL 或 flushdns)
  2. 80 端口没开放/没被反代监听
  3. 如果你用了 Cloudflare 橙色云,源站没有响应(Cloudflare 返回 522 错误)

Q: 浏览器显示”不安全”/“您的连接不是私密连接”?

  • 证书过期了
  • 证书域名和你访问的域名不匹配
  • 用了自签名证书(浏览器不信任)
  • 解决:用 Let’s Encrypt 申请免费证书,或者通过 Caddy 自动配置

Q: 怎么查看端口被谁占用?

# Linux/macOS
lsof -i :8080
netstat -tlnp | grep 8080
ss -tlnp | grep 8080

# Windows
netstat -ano | findstr :8080

Q: 我需要开放哪些端口? 用反向代理架构,通常只需要:

  • 22(SSH,建议改成非标准端口或禁用密码登录)
  • 80(HTTP,用来做 HTTPS 重定向和 Let’s Encrypt 验证)
  • 443(HTTPS)

其他所有服务都通过反代访问,不需要开额外端口。


相关:01-域名与DNS02-反向代理返回目录