理解端口、内网/公网的区别,以及 HTTPS 证书的作用,是把自托管服务安全地暴露到公网的前提。
端口(Port)
IP 地址用来找到网络上的某一台设备,端口用来找到这台设备上的某一个程序/服务。
IP 地址 = 小区地址(哪栋楼)
端口 = 门牌号(哪一户)
一台设备有 65536 个端口(0~65535),每个服务监听一个或多个端口。
常见端口
| 端口 | 协议 | 用途 |
|---|---|---|
| 22 | TCP | SSH 远程登录 |
| 80 | TCP | HTTP(明文网页) |
| 443 | TCP | HTTPS(加密网页) |
| 3306 | TCP | MySQL 数据库 |
| 5432 | TCP | PostgreSQL 数据库 |
| 6379 | TCP | Redis |
| 5230 | TCP | Memos |
| 8080 | TCP | 常用的 HTTP 替代端口/开发服务器 |
| 3000 | TCP | 常用的 Node.js 开发端口 |
| 53 | UDP/TCP | DNS 查询 |
端口范围约定
| 范围 | 用途 |
|---|---|
| 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?
- 登录路由器管理页面,看 WAN 口 IP 地址
- 百度搜”IP”,看显示的 IP
- 如果两个 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/WireGuard | VPN 方案,组网后设备间互相访问,不暴露公网 |
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 有几种模式:
| 模式 | 浏览器→Cloudflare | Cloudflare→源站 | 安全性 | 推荐 |
|---|---|---|---|---|
| Off | HTTP 明文 | HTTP 明文 | ❌ 完全不加密 | ❌ |
| Flexible | HTTPS 加密 | HTTP 明文 | ⚠️ 中间一段明文 | ⚠️ 应急用 |
| Full | HTTPS 加密 | HTTPS 加密(源站证书可以自签) | ✅ 端到端加密 | ✅ 推荐 |
| Full (strict) | HTTPS 加密 | HTTPS 加密(源站证书必须可信) | ✅✅ 最严格 | ✅ 推荐(源站配 Cloudflare Origin CA 证书) |
不要长期用 Flexible 模式
Flexible 模式下 Cloudflare 到你的服务器是明文 HTTP,如果你服务器在公网,这一段流量可能被窃听/篡改。建议至少用 Full 模式,源站证书用自签名或者 Cloudflare Origin CA 证书就行。
自签名证书
你也可以自己给自己签证书(不需要 CA),但浏览器不信任,会显示安全警告。适合:
- 纯内网服务(不暴露公网)
- 测试环境
- Cloudflare Full 模式(Cloudflare 信任你的自签证书,用户浏览器看不到警告)
防火墙
防火墙决定哪些端口的流量可以进出服务器。
系统级防火墙
- Linux:
ufw(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 能访问,但用域名访问不行?
可能原因:
- DNS 没生效(等 TTL 或 flushdns)
- 80 端口没开放/没被反代监听
- 如果你用了 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)
其他所有服务都通过反代访问,不需要开额外端口。