一个域名,两种走法:公网服务器和内网穿透的实战对比

钧野 发布于 阅读:42

上周我把自己的博客折腾上了 HTTPS。折腾的过程里,把两条完全不同的路都走了一遍:一条是标准的公网云服务器,另一条是内网穿透。

踩的坑完全不一样,配置思路也完全不同,索性记下来,给同样卡在「域名怎么绑」这个问题上的朋友省点时间。

先搞清楚:「绑定域名」其实是两件事

很多人以为在域名后台加条记录就叫绑定,其实那只做了一半。

一次完整的访问要经过四个环节:

  1. 浏览器输入域名
  2. DNS 解析出公网 IP
  3. 请求到达服务器的 80 或 443 端口
  4. Web 服务器认出「这是哪个域名」,转发给对应的后端程序

第 1、2 步在域名商那边配,第 3、4 步在你自己机器上配。 两段都通了,才叫真的绑上了。

第 4 步最容易被人忽略。服务器收到请求时,HTTP 头里带着一行 Host: blog.yourdomain.com,Nginx 就是拿它跟每个 server 块的 server_name 比对,命中哪个就走哪个。没命中任何一块,就落到默认站点——这也就是为什么有时候直接输 IP,会看到一个莫名其妙的默认页。

搞懂了这四步,两种方案的区别就只剩一个问题:中间那一段路,是谁在替你走。

路线 A:公网云服务器

买台阿里云 ECS,配了公网 IPv4,最标准的做法。

链路很短:

浏览器 → DNS → 你的公网 IP:443 → Nginx → 后端 127.0.0.1:8080

配置也就三件事。

第一,加一条 A 记录。 在域名控制台给 blog.yourdomain.com 加 A 记录,值填服务器公网 IP。

第二,安全组放行。 阿里云控制台 → 实例 → 安全组 → 入方向,加上 80 和 443。这一步漏了,配置写得再对也没用,浏览器会一直转圈直到超时。

第三,Nginx 里写 server 块:

server {
    listen 443 ssl;
    server_name blog.yourdomain.com;

    ssl_certificate     /etc/nginx/ssl/blog.crt;
    ssl_certificate_key /etc/nginx/ssl/blog.key;

    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}

server {
    listen 80;
    server_name blog.yourdomain.com;
    return 301 https://$host$request_uri;
}

server_name 那一行,才是「绑定」的本体。

这里有个常被问到的细节:TLS 握手发生在浏览器发出 Host 头之前,那时候服务器还看不到 HTTP 头。所以 HTTPS 的分流靠的不是 Host,而是 SNI——浏览器在握手第一步就喊一句「我要访问 blog.yourdomain.com」。Nginx 拿 SNI 去匹配 server_name 选证书,所以一台机器上不同域名能各用各的证书。

还有一个绕不过去的门槛:备案。 大陆服务器 + 自己的域名 + 走 80/443,基本都要 ICP 备案。没得商量,这是政策层面的事,不是技术能绕的。

优点很明确:带宽独享、IP 归你、延迟最低、想跑什么跑什么。
缺点也很明确:要花钱,要备案,服务器得有公网 IP。

路线 B:内网穿透

如果服务器在家里,运营商给的是大内网 IP,或者压根不想买公网带宽,那就走这条路。

链路长了一截:

浏览器 → DNS → 穿透节点的 IP:443 → frps 按域名分流 → 加密隧道 → 你的机器:443 → 后端

关键是那个「穿透节点」。它是一台有公网 IP 的机器,你花钱买的其实是它的一段转发能力。你的域名解析到的不是自己的服务器,而是这个节点的 IP。

配置同样三件事,但顺序和踩的坑完全不同。

第一,还是 A 记录。 只不过值要填穿透服务商给你的节点 IP。

第二,在服务商面板里登记域名。 这一步是路线 B 独有的,也是最容易翻车的地方。我用的是 ipfrp,面板里要新建一条 HTTPS 类型的代理,填本地端口 443,再把域名绑定上去。

第三,改服务器上的 frpc 配置文件。 大概长这样:

[[proxies]]
name = "261_tqh7agzb"
type = "https"
localIP = "127.0.0.1"
localPort = 443
customDomains = ["blog.happytiger.online"]

注意那个 name——它不是你自己随便起的,是面板生成的随机串。这是我这周踩得最结实的一个坑:我一开始图省事自己写了 blog_https,frpc 加载正常、没有任何报错,但域名打不开。翻日志才看到:

start error: [20007] blog.happytiger.online 未绑定,请添加到平台

意思是服务端有一张域名白名单,光在你自己的配置文件里写是不够的,必须先在人家面板上登记,而且代理名必须跟面板生成的一字不差。

正确的顺序是:面板加代理 → 抄下代理名 → 改配置文件 → 重启 frpc。 倒过来做,一定失败。

再说 HTTPS。穿透场景下有个挺关键的点:证书是装在你自己的机器上的,服务商只负责转发密文。type = "https" 的代理,frps 只是根据 SNI 把 TLS 数据流原样转给你,解密发生在你的机器上。所以证书、私钥、续期,全都归你管——也多了一份责任。

优点:不用公网 IP、不用买带宽、内网机器也能对外提供服务、成本低得多。
缺点:带宽和稳定性都受服务商制约、多一层故障点、大陆节点用自己域名还是绕不开备案。

正面对比

对比项 公网云服务器 内网穿透
域名指向 自己的公网 IP 服务商的节点 IP
带宽 独享,买多少是多少 共享,受套餐限制
延迟 最低 多一跳,略高
月成本 几十到几百元 十元级
备案 必须 大陆节点也必须
域名白名单 不需要 需要在面板登记
证书位置 自己服务器 自己服务器
故障点 少 多一个中转环节
适合场景 正式对外站点 自用服务、测试、内网设备

我怎么选的

说实话,两条路我都在用,分工不同。

博客这种要长期对外、会被搜索引擎收录、偶尔还要分享给别人的,我走了公网服务器那条,省心。

而课表收集、NAS 面板这类「只有我和家长偶尔用一下」的服务,走穿透。花十块钱一个月,换一台不用管公网 IP 的内网机器,我觉得挺值。

所以这道题没有标准答案。先问自己三个问题:这台服务是给谁看的?能接受多少延迟?愿不愿意为了它去备案?

想清楚这三个,选哪条路其实自己就浮出来了。


这篇文章就在自己的博客上写完的,顺便也是这个博客的第一篇。写的时候顺手把 HTTPS 配好了,算是给它办了个体面的开张。