NAT:互联网中心化的原罪
Internet centralization and the original sin of NAT
XKCD 漫画里,普通人连发个文件都要折腾半天,这背后其实是 NAT 技术埋下的祸根。NAT 最初为了解决 IP 地址枯竭问题,却意外打破了互联网端到端连接的设计初衷,让个人运行 FTP 服务器变得异常困难。为绕过 NAT,我们发明了 Port forwarding、UPnP,甚至依赖 STUN、TURN 和 ICE 等复杂方案,最终却不得不依赖外部基础设施。更讽刺的是,NAT 被误当作安全特性,导致 IPv6 推广受阻,人们习惯了“客户端 - 云 - 客户端”的架构,却忘了互联网本该是去中心化的。
我们用一个简单直接的连接,换成了大部分依赖外部基础设施的复杂方案。
HN 评论区
183- RustyRussell
抱歉。
我是 Linux 上当前 NAT 系统的实现者。具体来说,我选择避免端口预留,转而将更多连接压缩到一个 IP 地址中,只要远程地址能让我们区分这些连接即可。
这反过来意味着来自不同地址的入站流量无法路由。你不再拥有一个公共端点。这是一种“穷人的防火墙”,但它削弱了我们像过去那样搭建服务器的能力。
当时我还是个年轻工程师,只专注于解决一个具体问题,没有考虑更大的图景。这并非唯一原因,但我认为它确实推动互联网走向了客户端/服务器架构,某种关键的平等性因此丧失。
- solatic
> 有很多因素可以归咎于扼杀开放的互联网,但我认为 NAT 是最早的罪魁祸首之一。过去运行服务器非常简单:运行一个可执行文件,告诉别人你的地址,搞定……这也让所有人养成了“客户端 - 服务器”是理所当然的思维定式。“我的设备与云端对话,云端再与其他设备对话”听起来很自然,而这种感觉其实源于地址稀缺这一人为产物。
这种感觉很大程度上像是在为那个只有“高计算机技能”人群上网的时代唱挽歌。大多数人会倾向于“用户友好”的解决方案:Gmail 和其他托管邮箱之所以流行,是因为当你关机省电、服务器硬盘崩溃、或者升级电脑(更快的 CPU、更多内存、更新的操作系统)时,它们不会停止工作。教育普通用户理解 URL 和邮箱地址已经够难了(还有谁记得 AOL 的关键词?),更别提让他们理解 IP 地址里那一串随机数字,或者说服他们去注册域名了。
是的,NAT 在一个本应连接所有人的网络中筑起了围墙。但即使我们一开始就采用 IPv6,最终还是会走向服务器 - 客户端的云端架构。ISP 只会把高度限制的防火墙作为家庭安装基础套餐的一部分出售,我们最终还是会面对这些围墙。
- elric
把 NAT 称为原罪是严重的夸大。运营商级 NAT(CGNAT)确实是个邪恶的概念,它限制了被 CGNAT 用户的自由。但普通的 NAT 只要你能掌控它,就没问题。“没人愿意折腾端口转发”很大程度上是因为家庭网关侧糟糕的用户体验,以及运营商的懒惰。UPnP 也是同样的道理。
事实上,NAT 拯救了数百万台运行未打补丁旧版 Windows 的极度不安全设备,防止它们在连接开放互联网的瞬间就被攻破。
- miki123211
互联网的设计者犯了一个根本性错误,即把现实世界的规范套用到了网络空间。
在“现实世界”中,你其实不需要太多安全措施。你的实际安全来自于:所有最危险的罪犯已经被关起来了,大多数潜在罪犯害怕被关,如果有人真的犯罪,他们会被关起来并在很长一段时间内无法再犯。现实世界中的许多安全措施侧重于事后检测(比如警报、监控摄像头、紧急按钮等),因为在现实世界中,检测和预防是一枚硬币的两面。
这之所以行得通,是因为如果现实世界发生犯罪,罪犯定义上就在受害者同一地点,而执法部门最关心他们服务的社区。如果罪犯在世界的另一端,就像在网络空间的情况一样,即使是友好国家,也往往是“不关他们的事”。这意味着互联网系统需要真正的安全,而 NAT 正好提供了这一点。
如果没有 NAT,我们每个人都得自己配防火墙,结果几乎完全一样。在现实世界中,“保持相对开放,因为锁主要是为了约束老实人”是一种有效的策略。但这种策略在互联网上行不通。
- mittensc
我怀念 NAT 和 SSL 出现之前的时光。
那时候确实可以很容易地分享东西,但任何人也很容易被黑客攻击,而且攻击往往非常精准。
NAT 出现后,分享依然很容易,出现了很多“盗版”应用,以及各种支持 NAT 穿透的即时通讯工具。
无论前后,你都需要懂技术。你不能指望一个不懂电脑的人去搭建 FTP 服务器,就算他们真做了,也会是一场噩梦,而且很可能把整个硬盘都共享出去。
其他情况也是如此。
总之,我们会随着 IPv6 迎来全面无 NAT 的时代,让我们看看那会带来什么。
- thomastjeffery
其后果比人们意识到的要严重得多。
由于 NAT 的存在,层级结构(集中式服务器)成为了互联网的基础设计模式。任何想要某种无政府状态(去中心化网络)的人,都必须使用一种本身也是层级化且代价高昂的变通方案。我们彼此互联,但只有少数富有的人才能真正发出声音。
- Uptrenda
作者说的全对。另外:IPv6 并没有解决这个问题,它只是引入了一个新问题。IPv6 设备最终会配备本地防火墙加上路由器上的状态防火墙。这些路由器不允许入站连接。UPnP 中确实有一部分功能允许你添加“针孔”(效果如你所料)——但缺点在于它比较晦涩、实现糟糕,且不能保证被启用。
路由器的概念听起来很简单,似乎应该实现一些标准协议。但在实践中,它往往是专有、临时的垃圾软件的拼凑。我很少听到有人谈论路由器固件中的深度包检测过滤组件。这是路由器中决定允许或拒绝哪些流量的部分,几乎没有公司会公开这部分代码。所以你甚至无法控制自己的互联网流量,一些公司写的小段代码就能决定某件事是否被允许。
如果这听起来极度可疑且是个坏主意——好吧,它确实如此。你当然可以运行 100% 开源的 OpenWrt。但问题是——互联网不仅仅是你拥有的那部分。它是一个网络的网络,所有这些糟糕的路由器及其糟糕的固件,已经深深嵌入整个互联网之中。要解决这个问题,需要更换数百万台设备。
- exabrial
我觉得挺可笑的是,大家都以为 ISP、设备制造商和云服务商会让你的 IoT 设备直接连接回你的“家”。
绝对不可能。他们会收你每月 9.99 美元,让你连接他们那破破烂烂的应用到他们那破破烂烂的云端,以便你能“随时随地使用他们的应用”。