我认为这是一个非常经典的问题,但是,虽然我有一些背景,但我已经没有足够的词汇来搜索和正确理解网络。
假设我有一个家庭网络,有192.168.0.1 (IP.1)和192.168.0.2 (IP.2),我们都在玩反击攻击,击中完全相同的外部服务器。
我的家庭路由器是如何知道哪些数据包会转到IP.1?我经常读一些关于NAT和xxx.xxx/y的文章。**在TCP/IP堆栈中写入/y部件的位置?
我们真的需要纳特吗?我从维基百科的文章中了解到,NAT是用来优化IP地址的,当一些计算机被关闭时。它还允许用一个公共IP连接5个设备吗?
发布于 2014-06-02 09:28:49
(对于下面的内容,我将忽略任何DNS查找或第二层操作,因为这不是NAT故事的相关部分。)
任何TCP连接都是由四个部分组成的:
<source IP> <source port> <destination IP> <destination port>
简而言之:目的IP用于将数据包发送到正确的计算机,目的端口用于将该计算机上的数据包发送到正确的程序/会话,源IP用于知道在何处发送任何回复。源端口也是如此。发送回复时,只需交换源和目的地。
让我们从两台没有NAT的计算机开始:
1.1.1.1
3.3.3.3
。80
当计算机请求一个网页时,它将首先从随机范围(1024-65535)中选择一个随机未使用的端口号。让我们选择2345
。然后将出现以下顺序:计算机发送其数据包:源IP 1.1.1.1
、源端口2345
、目标IP 3.3.3.3
、目的端口80
。数据包到达for服务器时,它会看到自己的IP和端口80
,因此它知道这是对网页的请求。然后,then服务器以数据包的形式将网页发送回源IP 3.3.3.3
、源端口80、目标IP 1.1.1.1
、目标端口2345
。计算机接收这些数据包,并知道它是被请求的网页,因为端口号2345
。
这些端口组合通常都是这样编写的:1.1.1.1:2345
和3.3.3.3:80
。
现在,互联网上的计算机数量远远超过了可用的IPv4地址数量。为了保持地址空间,引入了一组私有地址范围,可以自由地用于地址共享。这些范围被称为RFC1918,如下所示:
这些地址在互联网路由表中是不存在的,所以如果你在互联网的主干上发送一个目的地在这些范围内的数据包,它们就会被丢弃。这是因为数百万人使用相同的地址。这些地址需要翻译成对互联网有用的东西。这就是网络地址翻译的地方:
我们有两台电脑:
192.168.0.1
和B:192.168.0.2
1.1.1.1
的公共IP。首先,两台计算机都选择一个随机端口:比方说:192.168.0.1:2345
和192.168.0.2:5432
。
计算机A用源192.168.0.1:2345
和目标3.3.3.3:80
发送它的数据包。网关将此数据包转换为源1.1.1.1:2345
目的地3.3.3.3:80
,并记住对此组合的任何回复都将传递给192.168.0.1
。因此,当它收到源3.3.3.3:80
和目标1.1.1.1:2345
的回复时,它会将其转换为源3.3.3.3:80
和目的地192.168.0.1:2345
并发送数据包。
计算机B用源192.168.0.2:5432
和目标3.3.3.3:80
发送它的数据包。网关将此数据包转换为源1.1.1.1:5432
目的地3.3.3.3:80
,并记住对此组合的任何回复都将传递给192.168.0.2
。因此,当它收到源3.3.3.3:80
和目标1.1.1.1:5432
的回复时,它会将其转换为源3.3.3.3:80
和目的地192.168.0.2:5432
并发送数据包。
如果两台计算机碰巧选择相同的源端口号,网关只需选择另一个免费的随机源端口号,并记住要翻译端口号。这有时被称为PAT (端口地址转换)。这基本上是NAT的一个子集。
所有这些都有几个实现。网关可能只记住"Computer X二手源端口Y“,并将端口Y的任何内容转发给计算机X。网关可能记得计算机X使用源端口Y和目的地Z”,并且只将任何东西从端口Z转发回计算机X。或者,网关可以记住整个元组,只向与整个源/目标ip和端口匹配的计算机X发送通信量。
https://networkengineering.stackexchange.com/questions/8181
复制相似问题