网络里最容易把人绕晕的一组词,公网、私网、内网、外网绝对排得上号。我自己刚入行那会儿,配个端口映射能对着路由器后台发呆半小时,明明本机服务跑得好好的,外面就是访问不进来;后来做远程办公、搭家庭小服务器、给门店装监控回传,这类问题更是反复出现。这篇就围绕NAT、内网穿透与远程访问这条主线,把公网私网内网外网这几个概念彻底掰开揉碎,讲清楚它们各自指什么、为什么会打架、NAT 到底在背后做了什么、内网穿透又是怎么在限制条件下把路打通的。内容偏实战,适合刚接触网络配置的运维新手、想在家里搭服务的技术爱好者、需要做远程访问方案的技术负责人,也适合那些被"为什么我这边能访问、你那边访问不了"折磨过的朋友。看完你至少能做到:拿到一个访问不通的场景,能快速判断问题卡在哪一层,而不是盲目重启路由器和改防火墙。
1. 先把四个词摆正:公网私网内网外网到底在说什么
1.1 四个词不是同一维度的概念,混着用必然乱
很多人把"公网"和"外网"当同义词、"私网"和"内网"当同义词,日常沟通勉强能用,一旦落到配置层面就会出问题。原因在于这四个词其实分属两个不同的分类维度。
第一个维度是地址属性:公网地址和私网地址。这是 IP 地址规划层面的概念,说的是这个地址在全球范围内是否唯一、是否可被路由。公网地址由地址分配机构统一管理,全球唯一,任何接入互联网的设备理论上都能路由到它;私网地址则是 RFC 1918 预留的三段地址空间,只在局部网络内有意义,不同局域网里可以重复出现。
第二个维度是网络位置:内网和外网。这是拓扑和视角层面的概念,说的是你站在哪个网络的边界内侧还是外侧。对一家公司来说,办公网是内网,互联网是外网;但对运营商来说,它自己的承载网也算内网。所以"内网"是相对的,取决于你以谁为参照系。
把这两个维度交叉起来,就出现了四种组合,其中最常见也最容易混淆的是"私网地址的内网"和"公网地址的外网"。真正让人头大的是中间地带:一个私网地址的设备,通过 NAT 借用一个公网地址出去,它到底算内还是外?答案是:地址是私有的,出口是公有的,位置是内网,但对外表现为公网。这一层"借壳"关系,就是后面所有问题的根源。
1.2 三段私网地址的来历与选择习惯
RFC 1918 划定的三段私网地址,做网络规划的人几乎天天见:
| 地址段 | 掩码范围 | 可用地址数量级 | 典型使用场景 |
|---|---|---|---|
| 10.0.0.0 | /8 | 约 1677 万 | 大型企业、云上 VPC |
| 172.16.0.0 | /12 | 约 104 万 | 中型网络、容器网络 |
| 192.168.0.0 | /16 | 约 6.5 万 | 家庭、小型办公 |
为什么家庭路由器和门店设备清一色用 192.168 段?不是技术上更优,而是习惯和默认值。几乎所有消费级路由器的出厂 LAN 口配置都是 192.168.0.1 或 192.168.1.1,厂商为了降低用户上手成本,把这个段做成了事实标准。而云上环境偏爱 10 段,是因为 /8 的空间足够划分大量子网,做多 VPC 互联时不容易撞车。
这里有个实操细节值得说:如果你要做多地组网或者和合作方做专线互联,提前确认对方用的私网段,两边都用 192.168.1.0/24 是最常见的翻车点。地址重叠之后,路由表里同一个目标网段指向两个方向,流量要么走错要么直接丢弃,排查起来非常费劲。我一般建议内部规划时避开 192.168.0/24 和 192.168.1/24 这两个"重灾区",用 192.168.100.0/24 之类不那么热门的段。
1.3 内网外网是相对的,别拿绝对视角套
再强调一遍内网外网的相对性,因为这是判断"能不能访问"的关键。你家里的电脑访问自家 NAS,走的是内网,速度快、延迟低、不消耗公网带宽;你在公司访问家里 NAS,对家里来说这是来自外网的访问,必须经过公网绕一圈。
判断一个访问是不是"内网访问",看的是源和目的是否在同一广播域或同一路由可控的私有网络内,而不是看设备长什么样。同一个交换机下两台机器互访是内网;跨城市两个分支机构通过专线互访,物理上走了很远,但逻辑上仍在同一个私有网络体系内,通常也按内网对待。
这个相对性带来的直接后果是:同一个服务,内网能访问不代表外网能访问,反过来也一样。很多新手在家里的电脑上测试服务正常,就以为大功告成,结果同事从外面访问不了,然后开始怀疑代码。其实代码没问题,是 NAT 和防火墙把路挡住了。养成"分内外两个视角各测一遍"的习惯,能省掉大量无效排查。
2. NAT 到底做了什么:地址借用的完整逻辑
2.1 没有 NAT 的世界会怎样
要理解 NAT,先想象没有它的世界。IPv4 地址总共约 43 亿个,全球联网设备早就超过这个数量。如果每个设备都必须有独立公网地址,地址池早就枯竭了。NAT(网络地址转换)的核心使命就是让多个私网设备共享少量公网地址上网,本质是一种地址复用机制。
打个生活化的比方:一栋写字楼只有一个对外收发室(公网地址),楼里几百个工位(私网设备)都要寄收快递。寄件时,收发室把每个工位的寄件统一盖上写字楼的地址章发出去;收件时,收发室根据自己记录的"这单是哪个工位寄的"把回件分派回去。NAT 设备就是这个收发室,它维护一张转换表,记录"内网某地址某端口"和"外网某地址某端口"的对应关系。
这个机制解决了地址短缺,但也带来一个根本性限制:外部主动发起的连接,NAT 设备不知道该转给谁。因为转换表里没有这条记录,收发室没见过这个工位寄过件,自然不知道怎么派。这就是为什么家里电脑不配置任何东西就能上网,但外面的人想主动连进来却连不上——不是网络不通,是 NAT 没有对应的映射条目。
2.2 SNAT 与 DNAT:出方向和入方向的两套规则
NAT 具体分两种方向,理解这两者是后面所有配置的基础。
SNAT(源地址转换)处理的是内网主动访问外网的场景。内网设备发包出去,NAT 设备把源地址从私网地址改成公网地址,同时改源端口,并在转换表里记一笔。回包到达时,NAT 设备查表把目的地址改回原来的私网地址和端口。这是家用路由器默认就在做的事,用户完全无感。
DNAT(目的地址转换)处理的是外部主动访问内网的场景,也就是常说的端口映射、端口转发。管理员手动配置一条规则:"访问公网地址的 8080 端口,转发到内网 192.168.1.100 的 80 端口"。外部请求到达时,NAT 设备按规则改目的地址,转发进内网。这条规则是静态的、需要人工配置的,这也是为什么端口映射不能自动生效。
两者的关键差异在于触发方式:SNAT 由内网流量自动触发,转换表动态生成、有老化时间;DNAT 由管理员预先配置,规则常驻。搞不清这个区别,就会出现"我能上网为什么别人连不上我"的困惑——上网走的是 SNAT,别人连你走的是 DNAT,两码事。
2.3 转换表的生命周期与端口耗尽问题
NAT 转换表不是永久的,每条记录都有老化时间,TCP 连接通常几分钟到几小时不等,UDP 更短。连接空闲超时后记录被回收,端口释放。这个机制本身合理,但会带来两个实战问题。
第一个是长连接被中途掐断。某些应用需要长时间保持连接,如果中间有 NAT 设备且老化时间短于应用的心跳间隔,连接会被静默回收,表现为"用着用着突然断了,重连又好了"。解决办法是在应用层加心跳,间隔小于 NAT 老化时间。很多即时通讯和远程控制软件都有这个机制,不是多余设计。
第二个是端口耗尽。一个公网地址理论上可用的端口约 6.4 万个,如果内网设备多、并发连接多,端口可能不够分。家用场景基本遇不到,但企业出口、高并发代理场景要留意。缓解手段包括增加公网地址、缩短老化时间、限制单设备并发数。我见过一个内网爬虫集群把出口 NAT 端口打满,导致整个办公网访问外网间歇性失败,最后靠限流加多出口解决。
注意:排查"NAT 相关问题"时,先确认是 SNAT 侧还是 DNAT 侧。SNAT 侧问题表现为"上不了网",DNAT 侧问题表现为"外面连不进来",两者排查路径完全不同,别混着查。
3. 内网穿透:在 NAT 限制下把路打通
3.1 为什么端口映射经常配不了
理论上配个 DNAT 就能让外部访问内网服务,但现实中大量场景根本配不了端口映射,原因主要有三类。
第一类是没有公网地址的控制权。很多宽带接入方式下,用户拿到的所谓"公网 IP"其实是运营商级 NAT 后面的地址,路由器 WAN 口显示的地址和实际出口地址不一致。这种情况下你在自己路由器上配端口映射,映射的是运营商 NAT 内侧,外部根本到不了这一层。判断方法很简单:查一下路由器 WAN 口地址,再对比外部看到的出口地址,不一致就是处在运营商 NAT 后面。
第二类是没有权限改上游设备。租房、共享办公、校园网等环境,你只能碰自己的设备,上游路由器和防火墙不归你管,端口映射无从谈起。
第三类是安全策略不允许。即使有公网地址和控制权,很多单位的安全规范也不允许随意开放入站端口,暴露面越大风险越高。
这三类场景催生了内网穿透这套方案:既然从外往里主动连不进去,那就让内网设备主动向外建立一条连接,把这条连接当作通道,外部流量顺着通道反向送进来。这正好绕开了 NAT 只允许内网主动发起连接的限制。
3.2 反向连接的核心思路
内网穿透的基本模型是:内网侧运行一个客户端,主动连接公网侧的一个服务端,建立一条持久通道;外部用户访问公网服务端的某个入口,服务端把流量通过已建立的通道转发给内网客户端,客户端再转给本地服务。整个过程中,连接始终是内网主动发起的,NAT 转换表里有对应记录,回包能正常通过。
这个模型和端口映射的本质区别在于"谁先发起连接"。端口映射是外部先发起,需要 NAT 有静态规则;内网穿透是内部先发起,NAT 的动态转换表就够用。理解了这一点,你就明白为什么内网穿透几乎不受 NAT 类型限制——它压根不依赖入站规则。
通道建立后,还要解决多路复用的问题:一条 TCP 通道上要承载多个外部请求,需要协议层做分帧和标识。常见实现有基于长连接的隧道协议,也有基于标准加密传输的方案。选型时关注三点:通道稳定性(断线重连机制)、传输效率(是否有多路复用和压缩)、以及是否支持多种协议(TCP、UDP、HTTP)。
3.3 常见方案的类型划分与取舍
市面上的内网穿透方案大致分三类,各有适用边界:
| 方案类型 | 典型特征 | 优点 | 局限 |
|---|---|---|---|
| 自建中转服务 | 自己租公网服务器跑服务端 | 数据自主可控、无第三方限制 | 需要维护服务器、有带宽成本 |
| 托管穿透服务 | 使用第三方提供的穿透平台 | 开箱即用、免运维 | 依赖第三方、免费额度有限 |
| 点对点直连 | 借助信令协商后两端直连 | 延迟低、不占中转带宽 | NAT 类型苛刻时打洞失败需回退 |
自建方案适合对数据流向有要求、且有一定运维能力的场景,比如企业内部服务远程访问。托管方案适合个人快速验证、临时演示。点对点直连在两端 NAT 都较宽松时体验最好,但对称型 NAT 下打洞成功率低,必须有中转兜底。
选型时我一般建议先问三个问题:数据敏感度如何、预算多少、运维人力有没有。三个答案基本能锁定方案类型。别一上来就追求"最先进"的点对点,很多场景下稳定的中转反而更省心。
4. 远程访问实战:从需求到落地的完整流程
4.1 需求拆解:先想清楚访问谁、从哪访问、要多稳
动手配置前,把需求拆成三个维度,能避免大量返工。
访问对象:是单台设备的某个端口,还是一整个内网网段?单端口用端口映射或简单穿透即可;整个网段需要网对网隧道,配置复杂度高一个量级。
访问来源:固定办公点、移动设备、还是不确定的第三方?来源固定可以加白名单,安全性好;来源不固定要考虑认证机制。
稳定性要求:临时调试、日常使用、还是生产依赖?临时调试怎么快怎么来;生产依赖要考虑冗余、监控、故障切换。
这三个维度定下来,方案基本就清晰了。我见过最常见的错误是需求没想清楚就开干,配到一半发现"还要支持手机访问""还要能传大文件",推倒重来。
4.2 环境准备与前置检查清单
正式配置前,按这份清单过一遍,能挡掉大部分低级问题:
- 确认出口地址类型:路由器 WAN 口地址与外部探测到的出口地址是否一致,判断是否在运营商 NAT 后。
- 确认本地服务正常:在内网另一台设备上访问目标服务的 IP 和端口,确保服务本身没问题。
- 确认防火墙放行:目标设备本机防火墙、内网安全组、上游防火墙三层都要检查,任何一层拦截都会导致不通。
- 确认端口未被占用:
netstat -tunlp或ss -tunlp查看监听状态,避免端口冲突。 - 记录当前网络拓扑:画一张简单的地址和连接关系图,出问题时对照排查。
第 2 步特别重要。太多人跳过本地验证直接配穿透,结果折腾半天发现是服务压根没起来。永远先证明"内网能通",再解决"外网能通",这是排查的基本顺序。
4.3 端口映射的配置要点与验证方法
在有公网地址和控制权的场景下,端口映射是最直接的方案。以常见家用或小型办公路由器为例,配置路径通常在"端口转发""虚拟服务器""NAT 设置"这类菜单下。
配置时需要填四项:外部端口、内部地址、内部端口、协议类型。外部端口建议不要用 80、443、22 这类常见端口,减少被扫描的概率;内部地址填目标设备的固定 IP,所以目标设备要先做静态地址绑定或 DHCP 保留,否则重启后地址变了映射就失效;协议类型按服务实际用的选 TCP 或 UDP,不确定就两个都配。
配完之后的验证顺序很关键:
# 第一步:内网验证服务本身 curl -v http://192.168.1.100:8080/ # 第二步:从外部网络验证映射是否生效 curl -v http://<公网地址>:<外部端口>/ # 第三步:确认端口在外部是否可达 nc -zv <公网地址> <外部端口>如果第一步通、第二步不通,问题在映射或上游拦截;如果第二步通但应用异常,问题在应用层配置(比如 Host 头校验、跨域限制)。分层验证能快速定位,比盲目改配置高效得多。
提示:部分路由器修改端口映射后需要重启生效,部分即时生效。改完先测,不通再考虑重启,别养成"改啥都重启"的习惯,会掩盖真实问题。
4.4 内网穿透的部署与联调
以自建中转方案为例,完整流程分服务端和客户端两侧。
服务端部署在具有公网地址的服务器上,核心是监听一个入口端口,接受客户端注册,并按规则转发流量。部署时注意:服务端防火墙要放行入口端口;服务端本身要有足够的带宽和稳定的网络;建议配置进程守护,异常退出能自动拉起。
客户端部署在内网目标设备或同网段设备上,配置中转服务端地址、认证凭据、本地服务地址和端口。启动后观察日志,确认"已连接服务端""隧道建立成功"这类状态。客户端要配置断线重连,网络抖动后能自动恢复。
联调阶段按这个顺序走:
- 客户端日志确认隧道建立成功。
- 服务端日志确认收到客户端注册。
- 从外部访问服务端入口,观察服务端是否收到请求、是否转发。
- 客户端日志确认收到转发请求、是否成功连本地服务。
- 本地服务日志确认收到请求。
任何一环断了,日志都会告诉你卡在哪。这套"逐跳看日志"的方法,比抓包更省时间,尤其适合新手。
4.5 安全加固:别让通道变成后门
穿透通道一旦建立,等于给内网开了一个入口,安全加固不能省。
认证:客户端与服务端之间必须有强认证,别用默认凭据,别用弱口令。有条件上证书或密钥对。
最小暴露:只映射真正需要的端口,不要图省事把整个网段或管理端口暴露出去。管理后台、数据库端口这类高危服务,尽量不直接暴露,需要时通过跳板或临时开启。
访问控制:服务端入口加来源白名单或额外认证层,减少被扫描利用的可能。
日志与监控:记录连接来源、访问目标、流量大小,异常访问能及时发现。定期看日志,别等出事才翻。
及时更新:穿透软件本身也是攻击面,保持版本更新,关注安全公告。
我踩过的一个坑:早期图方便,把内网一台测试机的所有端口通过穿透暴露出去,结果被扫描到弱口令的数据库端口,虽然只是测试数据,但教训很深。暴露面永远比你想象的危险,能少开一个端口就少开一个。
5. 常见问题排查与避坑经验
5.1 典型故障速查表
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 内网能访问,外网不能 | 端口映射未配或未生效 | 检查 DNAT 规则、上游是否拦截 |
| 映射配了仍不通 | 处在运营商 NAT 后 | 对比 WAN 口地址与出口地址 |
| 时通时不通 | NAT 老化或链路抖动 | 查转换表老化时间、加心跳 |
| 穿透客户端连不上服务端 | 服务端端口未放行或地址错 | 检查服务端防火墙、地址端口 |
| 隧道建立但访问无响应 | 本地服务地址或端口配错 | 核对客户端本地目标配置 |
| 访问慢 | 中转带宽不足或绕路 | 看中转节点位置和带宽规格 |
| 连接被重置 | 安全策略或协议不匹配 | 检查防火墙规则、协议类型 |
这张表覆盖了大部分高频问题,遇到故障先对号入座,能快速缩小范围。
5.2 三个容易忽略的细节
MTU 问题。穿透隧道封装会增加包头,如果链路 MTU 本来就接近上限,封装后可能超限导致大包被丢弃,表现为"小请求正常、大文件传输卡死"。解决办法是调整隧道 MTU 或开启分片。这个坑很隐蔽,因为 ping 小包永远正常。
DNS 与 Host 头。通过穿透访问 Web 服务时,如果应用做了 Host 头校验或域名绑定,用 IP 直接访问可能被拒。需要在应用层配置允许的 Host,或在客户端做 Host 重写。
时间同步。涉及证书认证的穿透方案,两端时间偏差过大会导致认证失败。确保两端都配置了时间同步,别忽略这个看似无关的细节。
5.3 我的排查心法
排查网络问题,我总结成一句话:先分层,再逐跳,最后看日志。
分层是指按物理、地址、路由、端口、应用逐层确认,别跳层猜。逐跳是指沿着数据路径一段段验证,找到第一个不通的点。看日志是指优先看设备和应用的日志,比抓包快得多,抓包留到日志说不清的时候用。
还有一条:改动一次只改一个变量。同时改三个配置然后测试,通了不知道哪个起作用,不通不知道哪个搞坏。这个习惯在复杂环境里尤其重要。
6. 方案选型的决策框架
6.1 按场景对号入座
把前面内容收拢成一个决策路径,实际选型时按这个走:
- 有公网地址且有控制权,需求简单:端口映射,最直接。
- 有公网地址但不想暴露入站端口:自建穿透,内网主动外连。
- 无公网地址或无控制权:穿透方案,自建或托管按数据敏感度选。
- 两端网络条件好、追求低延迟:点对点直连,失败回退中转。
- 临时演示、快速验证:托管穿透服务,省事优先。
6.2 成本与可控性的权衡
自建方案的前期投入是服务器和配置时间,长期看可控性最好;托管方案前期几乎零投入,但依赖第三方,免费额度、带宽、稳定性都受制于人。数据敏感的场景,我倾向自建,哪怕多花点运维精力;纯个人临时用,托管更划算。
带宽成本常被低估。中转方案下,所有流量都走中转服务器,带宽费用和延迟都取决于中转节点质量。如果传输量大,这笔账要提前算清楚,别等账单出来才后悔。
6.3 可扩展性预留
方案落地时留一点扩展余地:地址规划别用满、端口分配留余量、隧道配置支持后续加节点。我见过不少小项目一开始图省事硬编码地址,后来加设备加分支,改得鸡飞狗跳。前期多花十分钟规划,后期少花十小时返工,这话在网络上尤其成立。
7. 最后分享几个实操心得
配置这类东西,文档看再多不如自己动手搭一遍。我的建议是:找一个周末,用一台旧电脑或云上最低配的服务器,把端口映射、自建穿透、点对点直连各搭一次,每个方案都故意制造一次故障再修好。这一轮下来,你对 NAT 和穿透的理解会比看十篇文章都扎实。
另外一个习惯:给每个配置写注释和记录。路由器上的映射规则、穿透客户端的配置项,过三个月你自己都未必记得为什么这么配。写清楚"这条规则是给哪个服务用的、什么时候加的、谁维护",团队协作时能救命。
还有,遇到"玄学"问题别急着归因于网络不稳定。绝大多数所谓玄学,背后都是某个没注意到的配置或策略。静下心按分层逐跳的方法查,基本都能找到根因。网络这东西看着抽象,其实每一步都有迹可循,把路径理清楚,问题就无处藏身。