在 NAT 之前,连接到 Internet 的每个设备都有自己的 IP 地址。互联网就是这样设计的。这为您提供了极大的灵活性和可见性。如果您有防火墙,那么它可以根据需要单独过滤每个地址、协议、端口等的流量。由于源地址和端口(如果适用,并非所有协议都有端口)以及目标地址和端口在发送方和接收方之间不会更改,因此调试起来要容易得多。并且,如果您想让设备管理自己的安全性也是可能的:只需告诉防火墙不要过滤该地址上的任何内容,或者根本不使用防火墙设备。你的选择 :)
让我们来看看 NAT 的最简单情况:当您的 ISP 只给您一个地址时,您只能将一台设备连接到互联网。这不是大多数人想要的:他们需要连接多个设备。因此,单个设备执行伪装技巧,以便在外部世界看来该单个设备正在执行所有互联网通信,而在该设备后面可能有多个设备认为它们可以正常连接到互联网,但实际上并没有一。具有真实互联网地址的单个设备使用的技巧是 NAT。
NAT 只能对使用端口号的协议进行“多路复用”。对于没有端口号的协议,连接由地址定义。由于您只有一个“真实”地址,因此您只能有一个连接。对于带有端口号的协议,如 UDP 和 TCP,连接通常由地址和端口定义。因此37.77.56.75:12345 <-> 94.142.242.216:80
可以是一种连接和37.77.56.75:23456 <-> 94.142.242.216:80
另一种连接。
如果37.77.56.75
是 NAT 设备(它不是,它是我自己的 PC 的地址,我在这里不使用 NAT)它可以有一个内部状态表,该表可以记住37.77.56.75:12345
对应于内部地址192.168.0.11:32431
。传出数据包将其原始源地址和端口 ( 192.168.0.11:32431
) 替换为 NAT 设备自己的 ( 37.77.56.75:12345
),而传入数据包则相反。
经常导致 NAT 和(有状态)防火墙混淆的原因是这两个功能都需要记住状态:谁在和谁说话?
有状态防火墙还必须跟踪谁在与谁通话。因此,NAT 设备和防火墙都需要记住存在会话37.77.56.75:12345 <-> 94.142.242.216:80
。NAT 设备还必须记住,这37.77.56.75:12345
是真的192.168.0.11:32431
。防火墙对流量进行一些额外的过滤和检查。
如果不带防火墙功能的 NAT 设备碰巧与其状态表中的某些内容匹配,则它会让不需要的流量通过。防火墙将应用检查来防止这种情况发生。但是,如果传入和传出数据包的地址未更改,防火墙也可以这样做:它不需要 NAT 即可执行其功能。
NAT 被认为是一种黑客行为,因为它使互联网变得更加复杂。地址和端口正在改变,NAT 设备必须记住原始地址和端口是什么,它必须真正理解它应用 NAT 的所有传输协议,以便防止部署新的传输协议(没有人会使用新的传输协议因为没有 NAT 设备会支持它们,而 NAT 设备不会支持它们,因为没有人使用它们)等。