手机、电脑、电视盒子凭什么共用一条线
你家的宽带只分到一个公网 IP,但同一时刻,手机在看视频、电脑在下文件、电视盒子在更新系统,三个连接同时存在。运营商回包时,凭什么知道哪个包该给手机、哪个该给电脑?
答案不在 IP 里,而在端口号里。这就是 NAT 的核心机制,也是理解“为什么我的服务器别人连不上”的关键。
为什么需要 NAT
IPv4 只有 43 亿个地址。2011 年 2 月 IANA 把最后一批 /8 分完,2019 年 11 月欧洲 RIPE 宣布地址池耗尽。IPv6 从 1998 年就有标准,但迁移是一台设备一台设备的事,二十多年也没做完。中间的过渡方案就是 NAT——用一个公网地址代表一整个内网。
NAT 本来是个应急手段,结果变成了基础设施。今天绝大多数家庭网络都在 NAT 后面。
SNAT:出去的时候改写
路由器做的是 SNAT(源地址转换),家用路由里叫 MASQUERADE、系统里叫伪装。规则一句话:把出包的源 IP 和源端口改成公网 IP 和一个新端口,并在表里记一笔。
假设公网地址是 8.146.230.105:
| 内网主机 | 原始连接 | 转换后 |
|---|---|---|
| 手机 192.168.1.10 | 192.168.1.10:51234 → 1.1.1.1:443 | 8.146.230.105:40001 → 1.1.1.1:443 |
| 电脑 192.168.1.11 | 192.168.1.11:51234 → 1.1.1.1:443 | 8.146.230.105:40002 → 1.1.1.1:443 |
注意第二行:两台内网设备碰巧用了同一个源端口 51234,也完全没有问题,因为转换后端口不同,表里能区分开。这张表是 NAT 的全部秘密,也是它能“多路复用”一个 IP 的原因。
回包怎么找回来
1.1.1.1 返回的包,目的地址是 8.146.230.105:40001。路由器收到后查表:40001 对应 192.168.1.10:51234,把目的 IP 和端口改回去,交给内网网卡。
关键点:NAT 表项是出方向建立的。没有内网先发起的连接,就没有表项;外面来的包找不到对应关系,只能丢掉。这就是“NAT 后面的设备不能被外部主动连接”的根本原因——不是防火墙拦了,是表里根本没这条记录。
DNAT:端口映射就是反过来的规则
要让外面能主动连进来,必须手工加一条反向规则,叫 DNAT、端口转发或端口映射:
外部访问 8.146.230.105:25565 → 转发到 192.168.1.20:25565
外面连 8.146.230.105:25565 时,路由器把目的地址改成内网机器,再送进去。
这就是开 Minecraft 服务器、搭 NAS、远程桌面必须做端口映射的原因。
为什么 P2P 和联机这么难受
NAT 两边都在“只能出、不能进”的状态,彼此无法直接建立连接。能用的办法三种:
- STUN / UDP 打洞:双方各自向对方的公网地址发包,用自己建立的出方向表项“骗”出对方的入方向通路。成功率取决于双方的 NAT 类型,锥形容易,对称型很难。
- 中继(TURN):打洞失败时,两端都连到一台有公网 IP 的服务器,由它转发。一定能用,但成本高、延迟也高。
- 端口映射:自己搞定,最稳,前提是有公网 IP。
所以“能不能联机”这件事,很多时候在 NAT 类型那一层就已经决定了,和你的电脑性能、游戏版本都没关系。
端口不够用的情况
一个公网 IP 的端口号上限是 65535,实际可用更少。如果路由器后面挂了太多设备、又有大量并发短连接(P2P 下载、爬虫、频繁建连的程序),可能端口耗尽。典型表现是新连接全部失败,但已有连接仍然正常。内网设备多的办公室和网吧会碰到。
你可能根本没有公网 IP
这是现在最常见、也最容易被误判的情况。运营商为了省地址,做了 CGNAT(运营商级 NAT):给你分配的是运营商内网地址,你在它后面又套了一层 NAT。这时候端口映射怎么做都没用,因为外面根本到不了你的路由器。
判断方法:对比路由器 WAN 口显示的 IP,和你实际对外的出口 IP。
# 看自己的出口 IP
curl -s https://ip.sb
然后打开路由器管理页面看 WAN 口地址。两者不一致,或者 WAN 口地址落在下面这些段里,就是没有真公网 IP:
100.64.0.0/10(RFC 6598,专门给运营商级 NAT 用的)10.0.0.0/8、172.16.0.0/12、192.168.0.0/16(标准私有地址)
没有公网 IP 时的替代方案是内网穿透(frp、Cloudflare Tunnel 之类),或者直接找运营商申请公网 IP——部分宽带可以免费开通,值得打一个电话。
云服务器的情况不一样
这台站是云服务器,直接绑了弹性公网 IP 8.146.230.105,中间没有 NAT 层,所以 80 和 443 直接对外,不需要端口映射。但云厂商的安全组是另一层独立的防火墙,和 NAT 不是一回事:出站和入站规则要分别放行,很多人“服务起来了但外面连不上”,最后发现是安全组没开端口。
小结
NAT 用端口号做多路复用,靠出方向建立的映射表决定回包归属。想被外部访问就必须有表项,表项靠端口映射手工加,而端口映射的前提是真的有一个公网 IP。
判断“外网连不上”的原因,按这个顺序查:有没有公网 IP → 端口映射配了没 → 安全组和本机防火墙放行了没 → 服务本身有没有在监听。最后一步用 ss -lntp 看。第二步和第四步都要用到端口号,可以对照 常用端口速查。路由器除了 NAT 还负责什么,见 交换机与路由器。









暂无评论内容