NAT 默认放出站、挡陌生入站;内网穿透靠一条由内主动建好、并一直保持的隧道,让外部请求借这条已建立的连接反向流回内网。
我追问的链
- 我电脑在路由器后面(内网 IP),外面的人凭什么连不进来?→ NAT 是怎么挡的?
- 那我又凭什么能正常上网、收到网页?→ "谁发起连接"和"数据往哪流"是一回事吗?
- ngrok / frp 这类工具到底做了什么,能让外网访问到我本地?
核心理解
NAT(Network Address Translation,网络地址转换):路由器把内网一堆设备的"内网门牌"翻译成一个对外的"公网门牌",并记一本账(谁出去找了谁),好让回程数据找得回来。
它的默认规矩是:
- 出站(你主动往外连):放行,并记账。
- 陌生入站(外面主动来敲、且账本上没记录):丢弃。
这就解释了那个看似矛盾的现象——你能上网,是因为网页数据是"你先发起的连接"的回程,账本上有记录,所以放行;而别人主动来连你,账本上查无此条,被挡。
关键分清:“谁发起连接” ≠ “数据往哪流”。连接一旦建立,数据两个方向都能走;NAT 拦的只是"陌生的新入站连接",不是"已建立连接上的回程数据"。
打电话类比:拨号 = 发起连接(只能你主动拨出去,别人拨不进来);接通后 = 双向通话(两边都能说)。
内网穿透就顺着这条缝来做:让本地主动向一台公网中转服务器建一条连接,并一直保持不断(这条是"出站",NAT 放行)。外部请求先到中转服务器,再借这条早就建好的隧道反向流回你的内网。绕开了"陌生入站",因为根本没有新的入站连接——全走那条你主动建好的老连接。
逻辑闭环 / 锚点
一句话钉死:既然"陌生入站"建不了,那就先由里往外建一条连接、并留着它,之后两个方向就都通了。穿透工具(ngrok / cloudflared / frp)全是这一个思想的工程实现。
关联
- 07-websocket:服务器能"主动推",用的是一模一样的原理——客户端先建连接,服务器借回程推。见母题 已建立的连接,双向都能走。
- 连接为什么天生能双向?因为 TCP 是全双工的,见 05-tcp。
来源:与 Claude 的对话,2026-06。