上篇文章我们简单讲解了ARP协议
是如何让局域网中的各个主机找到对方的MAC地址的,实际上,ARP协议
也可以应用于互联网中用于路由器之间找到下一条的MAC地址,但在本系列文章中,我们不对广域网的使用场景进行过多展开。
我们接着来探究路由转发模型,这些模型也是我们后面配置LVS
的理论基础,这里涉及到三种转发模式 :
- NAT 地址转换模式
- DR 直接路由模式
- TUN 隧道模式
NAT模式
还是前几篇文章中的网络拓扑图为例,我们对它进行升级,让他接入到互联网中:
我们先清楚一件事情,那就是在网络请求的过程中,都是以IP:PORT
的形式来唯一识别这个数据包需要被哪个服务进行处理。路由器接收到数据包之后,若发现数据包中的目标IP和自己的匹配,就会收下这个数据包,然后根据端口来转发到对应的程序上进行处理。这就相当于,IP
表示你家所在的楼栋,PORT
来指明你家具体在哪一户。
假设主机A
需要与互联网中的另一台主机C
进行通讯,它会经过如下流程:
- 建立数据包,源IP是192.168.174.10:8848,目标IP是14.215.177.38:80
- 交换机在本地缓存中没有找到IP为14.215.177.38的映射,移交给路由器
- 路由器查询本地的路由表,发现需要将数据包交给下一跳网关处理,于是将源IP换成路由器自己的公网IP6.6.6.6,然后发送给下一跳网关
- 数据包经过互联网路由找到14.215.177.38,将数据包丢给端口号为80的程序进行处理,然后原路返回
- 6.6.6.6路由器收到源IP为14.215.177.38:80,目标IP为6.6.6.6:8848的数据包,收下,并丢给端口为8848的程序进行处理,通信结束。
在第三步中,路由器将源IP替换成自己的公网IP并转发到下一跳网关的行为,就是NAT
模式。确切的说,因为替换的是源IP,所以是S-NAT
(源地址替换模式)。同理,也有目标地址替换模式D-NAT
。
但是这种模式存在一个问题,我们来假设这么一个场景:图片左端的主机A
和主机B
都要和互联网上的另一台主机C
进行通讯,恰好在A和B当中,程序申请的端口号都一样,比如2100
。因为主机C
不在局域网当中,所以它们的数据包在经过路由器之后会被包装成6.6.6.6:2100 -> 14.215.177.38:80
的形式,最终经过路由器不断的转发找到对应的服务并处理返回,返回的数据包长这样:14.215.177.38:80 -> 6.6.6.6:2100
。那么问题来了,这种模样的数据包如果我们的路由器收到的话,是没办法正确地转发到对应地服务中的,因为在我们的局域网当中,主机A
和主机B
存在两个端口一样的程序。我们用图来简单描述一下这个过程:
这种情况该如何解决呢?
答案是在路由器中做一层映射,路由器在做S-NAT
对源IP进行替换的时候,留下一个物理端口和源IP的映射,不再以源IP的端口进行替换。比如数据包经过路由器的时候,留下一个物理端口:源IP
的映射,然后在做地址替换的时候,使用源IP+物理端口的形式进行替换,比如说:
DR
DR也叫做直接路由模型,它和NAT的区别是可以通过下一条网关MAC的物理地址直接找到目标服务器。也就是说,目标服务器必须要和路由器处于同一个局域网,如下图:
主机A
需要与主机B
进行通信,当路由器收到数据包之后,会直接根据主机B
的MAC地址包装进行跳转,而不用改动IP层的地址。
这几种模式会用在LVS
中作为数据包的转发策略使用,我们后续在搭建LVS
的时候使用DR模型进行搭建。