返回

文章详情

互联网中心化与NAT的原罪

Hacker News2026年8月31日 02:23

文件传输,Randall Munroe,https://xkcd.com/949,创意共享署名-非商业性使用 2.5 在这幅漫画中,普通人拥有FTP服务器的概念被迅速否定。没错,这并不普遍。对于普通计算机用户来说,有人能够直接连接到你的计算机的想法感觉很新奇,甚至有些危险——见到互联网上人们对自己IP地址被他人知晓的普遍讽刺恐惧。如果你遇到一个对计算机“很在行”的人,但并不是网络方面的人,他们心中的互联网模型可能包含了某种意义上将“服务器”或“云”与个人计算机区分开的定义。真正的点对点连接,如果他们考虑过这方面,那是一种复杂的努力:WebRTC、STUN、TURN、ICE等等。考虑到我们生活在一个NAT、CGNAT和限制性ISP的世界里,这种看法并不是完全错误,但却打破了原始互联网的优雅设计。为什么你没有FTP服务器 网络地址转换(NAT)在1994年首次正式提出于RFC 1631。在其摘要中,提到:IP互联网面临的两个最迫切的问题是IP地址耗尽和路由扩展。这些问题的长期和短期解决方案正在开发中。短期解决方案是CIDR(无类域间路由)。长期解决方案则包括各种新的互联网协议提案,以支持更大的地址。无类域间路由并不是这篇文章的重点,基本上我们开始为人们提供更多的网络规模选项,尽管在实施上复杂,但在哲学上几乎没有争议。RFC 1631提出了针对IP地址耗尽和路由可扩展性的第二个短期解决方案:NAT。虽然现在家用路由器上的NAT不是完全相同的类型,但基本思想是相同的:它允许多个设备共享一个IP地址(从路由设备另一端设备的视角),通过在一个数据包跨越流量路由设备的过程中修改数据包头中的网络地址信息。后来我们为私人使用保留了一些地址,这些东西在大多数IP网络中结合使用——网络内的私有地址,在路由器上NAT至一个公共地址。在你的典型家用路由器上,这里是你通常如何通过NAT连接到外部服务器的:你的计算机发送一个数据包如下:源IP 10.11.70.21 源端口 50413 目标IP 67.215.249.229 目标端口 70 它到达你的路由器,然后被修改为:源IP 146.7.15.85 源端口 60612 目标IP 67.215.249.229 目标端口 70 服务器回复:目标IP 146.7.15.85 目标端口 60612 你的路由器将其重写为:目标IP 10.11.70.21 目标端口 50413 如果你仔细思考这个问题,你可能会问:在外部服务器想要首先与你通信的情况下,这怎么发生?它将数据包发送到146.7.15.85,而你的路由器…哦,不。它不知道该把数据包发送到哪里。 解决办法 自然,人们几乎立刻注意到这是一个问题,因为自古以来,人们就希望在他们的卧室里运行游戏服务器、FTP服务器和网页服务器。因此,围绕NAT形成了一个工作绕过的生态系统,但没有一个恢复互联网的基本意图,也没有一个适用于所有情况。 端口转发 最直接的修复就是直接告诉你的路由器“嘿,当数据包在端口60612进来时,直接发送到10.11.70.21的50413端口,没问题。”这就是端口转发,它是最普遍人们知悉的NAT解决方案。端口转发的一个概念性问题是,一个公共IP+端口仍然只能映射到一个设备,这意味着两个设备不能同时在同一个公共IP+端口上运行一个服务。这听起来问题不大,但对于大型企业或大学网络,通常只能通过一个私有IP进行连接,这几乎使得本地托管变得不可能,而不进行更复杂的操作。 有时,你的ISP也可能将你的外部IP放在NAT后面——这被称为运营商级NAT(CGNAT)——现在你无法控制进行转换的设备,所以你无法转发端口。你得到的只是一小部分IP地址。另外,NAT的另一个问题是没有人想去麻烦它,这也是我们发明UPnP的原因。 UPnP及其现代“亲属”NAT-PMP和PCP尝试通过允许软件直接请求路由器转发端口来解决“没人想去麻烦”的问题。和手动端口转发一样,这是对路由器的请求——如果你的ISP在搞鬼,你就没运气了。由于错误的安全思想,这个功能也是经常被禁用的——部分是因为早期几个存在缺陷的实现,部分是因为思想上有人可以直接连接到你的计算机。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡