HTTP 内网穿透:本地网站上线公网要过的三关
本机跑着 WordPress、宝塔面板或 Hugo,想发给别人打开?HTTP 内网穿透把本地端口开到公网,系统域名建完就能用;自有域名要过 ICP 备案、DNS 解析、HTTPS 证书三关。
站已经跑起来了,本机浏览器打开一切正常——现在要让别人也能打开。它可能是宝塔面板里那个 WordPress、一个 Hugo 博客、一个给客户看的 Demo,或者自建的 Gitea。HTTP 内网穿透做的就是这一件事:把本机某个端口上的网页,变成一条能发出去的链接。这一页讲中间那几步——地址从哪来、要不要用自己的域名、证书谁配、几个站怎么同时开。

HTTP 内网穿透的两种地址:系统分配域名与自有域名
两种地址指向同一个本地服务,区别只在这个链接看起来像谁的,以及你愿意先付出多少配置。
系统分配域名:建完就能用
新建映射时选「网站 HTTP」这个预设,本地地址填 127.0.0.1、端口填你那个站在跑的端口,公网访问方式保持默认,服务端就会分配一个域名。创建完当场能打开,HTTPS 也已经在了——不必有自己的域名、不必配 DNS、不必等审核。
适合:自己看的服务、发给同事的 Demo、临时给客户演示。微信公众号和小程序的本地调试也走这条——那些后台要求填一个公网可达的地址,localhost 是填不进去的,而这个域名当场就有。
自有域名:链接是你自己的
想让别人看到的是 blog.你的域名.com,就在建映射时切到「绑定自有域名」把它填进去。这条路要多做三件事——ICP 备案、DNS 解析、等证书,下一节逐个说。
适合:真的要对外的站——个人博客、作品集、公司的对外服务。属于专业版及以上的能力,各版本差异见价格页。

宝塔、WordPress、Hugo:本地跑的站怎么接进来
映射认的是「本机 IP + 端口」,不认你用什么工具搭的站。所以这一步真正要回答的是:你那个站现在跑在几号端口上。
| 本机跑着什么 | 典型本地端口 | 映射填什么 |
|---|---|---|
| 宝塔面板托管的站 | 80 / 443 | 站点的端口,不是面板的 |
| WordPress(Docker 起的) | 容器映到宿主机那个口 | 宿主机上的端口 |
| 静态博客(Hugo) | 1313 | 1313 |
| 自建 Git(Gitea) | 3000 | 3000 |
| 后端 API | 各自的端口 | 每个端口各一条 |
宝塔这里最容易填错。 宝塔面板自己占一个端口(装完那条命令里给你的登录地址就是它),它托管的网站另占 80 / 443。要开出去的是网站那个端口——面板是后台,把它开到公网等于把服务器管理权摆到门口,真要远程管面板,看本页后面那节的收窄办法。
如果本机已经有 Nginx 或 Apache 在做反向代理、按域名把请求分给几个站,那就只映射反代那一个端口,分流仍旧由它自己做,不必一个站建一条。
装 WordPress 之前,先把域名定下来。 WordPress、Nextcloud、Discourse 这类程序有个共同习惯:安装那一刻它会把你当时用的地址记进数据库,此后页面里所有的图片、样式、跳转都按那个地址生成。
你在本机用 localhost:8080 装的,它记住的就是 localhost:8080。等别人用你的映射域名打开,浏览器拿到的页面里,CSS 和图片全指向 localhost:8080——那是访客自己的电脑,什么都加载不出来,站看上去就是一堆没有样式的文字;有的还会直接把人跳回 localhost,页面根本打不开。
顺序反过来就没这回事:先建好映射拿到域名,再用那个域名去装。已经装好了也能救,WordPress 在 wp-config.php 里加两行:
define('WP_HOME', 'https://你的映射域名');define('WP_SITEURL', 'https://你的映射域名');别的程序找它配置里的「站点地址 / Site URL / 外部访问地址」,改成同一个域名,道理一样。
绑自有域名的三关:ICP 备案、DNS 解析、HTTPS 证书
按这个顺序做,卡住时也容易判断卡在哪一关。
① ICP 备案
建映射时有一个必勾项:「我承诺该域名已完成 ICP 备案」,旁边写着未备案域名将被自动拦截,仅在选择国内节点时适用。这是国内公网服务的合规要求,不是可以绕的一步。备案在你的域名服务商那边办,与蜻蜓映射无关,官方口径见 工信部 ICP 备案管理系统。
② 两条 CNAME
一条管访问与归属,一条是 _acme-challenge 开头的证书委托记录。主机记录与记录值都能一键复制,去域名服务商的控制台添上即可。第二条要长期留着——后面的证书续期依赖它,删了证书就续不上。
③ 等证书签发
两条记录生效后证书自动签发,页面上有进度可看。你不用碰业务代码,也不用自己续期——本地那个站还是跑在 HTTP 上,加密发生在公网这一段。


这三关不必一次过完。 映射创建的那一刻系统分配的域名就已经可用了,站当时就能打开;备案、解析、证书是在这之后慢慢做的,做完自有域名再接上去。所以「等备案」不等于「站开不了」。
几个本地服务同时开出去,要建几条映射
按端口分,一个端口一条。它们共用同一台机器上的同一个客户端。
同一台机器上装一次客户端,几条映射一起管,不必为每个服务各装一遍。要注意的是映射条数按套餐计,具体几条看价格页。

只有 HTTP/HTTPS 映射能绑自有域名,TCP/UDP 映射不能,后者拿到的一定是「域名:端口」形式的入口。原因在协议本身:HTTP 请求头里带着 Host,服务端一个入口就能按域名把流量分给不同的站;TCP 那一层没有域名这个概念,只能靠端口区分。所以要开的是数据库或远程桌面,走的就是带端口那条路,这一页讲的域名与证书对它们都不适用。
都要一台服务器了,为什么不直接把站部署上去
网上大多数 HTTP 穿透教程的第一步是「准备一台有公网 IP 的云服务器」。走到这一步,这个疑问是合理的。
如果你的站本来就能跑在云上——纯静态、或者只依赖它自己——那把它直接部署到那台服务器上更直接,少一层链路,也少一个要维护的东西。公网映射解决的不是「我没有服务器」,而是「这个站必须留在这台机器上」。
它依赖本地的东西
素材库在 NAS 上、数据库在局域网另一台机器、要读一块插在本机的采集卡。把站挪上云,这些依赖跟不过去。
数据不能出内网
客户资料、内部系统、还没脱敏的测试数据。站可以给外面看,数据得留在自己机器上。
你就是在本机改
改一行代码就要在外部环境看一眼效果,微信的接口回调、支付网关的异步通知,都要打到你正在改的这份代码上——部署一次看一次,节奏是断的。
顺带说清代价这一边:自建那条路要你买一台有公网 IP 的服务器、在上面装服务端、自己申请证书、自己写续期任务,而且服务器本身还要打补丁、要付月费。托管式映射的前置条件只有一条——一台能上网的机器,装个客户端就完了,证书那部分是自动的。省掉的不是技术难度,是一份长期运维。
对外的站,比内部服务更需要收一收
一个公开的网站本来就是给人看的,所以这里要收的不是访问本身,而是后台与流量。
后台入口单独收窄
WordPress 的 wp-admin、宝塔面板、Gitea 的管理页——这类入口没必要对全网开。把它拆成单独一条映射,在访问规则里开 IP 限制、选「白名单(仅允许)」,只放行你自己的出口 IP。
动作:给后台那条映射加访问规则
流量是会被看光的
公开的站意味着流量不由你控制:被搜索引擎抓、被人下载大文件、被扫描器反复敲,都算进月流量里。客户端首页就有「本月流量」这个计数,别等超了才看。
动作:上线前按月流量算一遍

如果你的出口 IP 是会变的(家宽拨号、在外面换网络),IP 白名单反而会把自己关在门外。这种情况用同一页里的「访问口令」更实用——多一道口令,不必跟着 IP 跑。两项可以同时开,完整清单见安全指南;开出去的如果是远程桌面而不是网站,加固口径不一样,见 RDP 暴露公网安全吗。
什么时候别选它
这几种情况,换个做法更省心。
- 正经的对外生产站点 —— 该买云服务器或托管平台。公网映射的可用性取决于你家那台机器和那条宽带,机器一关站就没了。
- 流量吃得很凶(图床、网盘、视频站)—— 先按套餐月流量算一遍,多半不划算。
- 只是想让同事看一眼本地改的效果 —— 建一条用系统分配域名的映射就好,别急着上自有域名那三关。
- 要开的不是网页 —— 数据库、远程桌面、SSH 走的是 TCP 映射,这一页讲的域名与证书对它们都不适用。

