理解桥接bridge和dhcp的原理

无论现在的各种容器,还是我们之前常用的虚拟机,为了与局域网内其他IP通讯通常需要用到『桥接』。

我犹记得以前为了实现虚拟机和宿主机之间的通讯,曾经配置过vmware的桥接模式,那么桥接是什么原理呢?

这个可以参考文章:《libvirt kvm 虚拟机上网 – Bridge桥接》,最主要的是理解下面这一段:

libvirt-kvm-bridge-network

  • NAT (默认上网) 虚拟机利用host机器的ip进行上网.对外显示一个ip
  • Bridge 将虚拟机桥接到host机器的网卡上,guest和host机器都通过bridge上网.对外不同的ip,

理解NAT

要看bridge,最好先看懂NAT:NAT是虚拟机借助宿主机的IP上网,外人看来并不知道虚拟机的存在,这是如何work的呢?

我们知道家用路由器一般都是NAT模式,内网用户默认都是192.168.1.x网段,而路由器充当默认网关的角色,所有内网发出的包都将经过路由器,路由器在公网有唯一的IP,所有的包经过路由器修改其源IP都改为了公网IP了,并且会随机映射一个对外端口。当应答回到路由器时,路由器会根据此前的映射关系,将目标IP和PORT改为原先发送请求的内网用户的IP和PORT,这样对于内网用户来说是感知不到路由器的存在的,大家共用路由器的对外IP访问外网。当然,因为大家都在内网同一个网段(路由器基于DHCP分配),所以内网用户互相通讯也没有问题。

当NAT用在虚拟机领域的时候,原理是类似的。只不过一台PC上的若干虚拟机相当于若干内网用户,而宿主机PC充当路由器的角色,虚拟机会在PC上虚拟化一个网络环境:也就是每个虚拟机通过一个无形的网线连接到了无形的路由器上,仅此而已。每个虚拟机实例会通过PC上的虚拟路由器获取DHCP分配的局域网IP,但是这只是本机虚拟出来的局域网,并不是物理局域网。那么,现在虚拟机想访问外网,只需要配置默认网关为PC上虚拟路由器,那么数据包经过虚拟路由器的时候,会将源IP修改为PC的物理网卡的物理局域网IP,发送给物理路由器,之后的事情和之前描述的一样。

上面的虚拟路由器其实是宿主机上一张虚拟的网卡,而虚拟机则将默认网关指向了这张网卡,从而有机会进行IP篡改。

如果你理解了上面这段描述,那么我们可以分析出这样的结论:

  1. 1个PC上的若干虚拟机之间,可以互相通讯,中介就是虚拟路由器。
  2. 虚拟机可以访问外网,也可以访问物理局域网,但是无法访问其他PC上的虚拟机。
  3. 外人(物理局域网其他PC)无法直接访问虚拟机,这和物理路由器外网的用户无法直接访问内网用户一个道理。(反向进入内网需要DNAT,如果你了解lvs的话)
  4. 虚拟机可以访问宿主机的物理IP,流程是先经过宿主NAT修改源IP和源PORT,通过物理网卡发出到局域网络中,又被物理网卡接收处理。
  5. 宿主机无法访问虚拟机,这是因为宿主机的物理网卡和内网其他网卡的角色一样,对于虚拟路由器来说都是”外人”,不可能进入到虚拟局域网的内网用户。

桥接bridge

回到上面的图片,桥接和NAT可以说是大不相同,在图中的br0相当于虚拟交换机,物理网卡eth0和虚拟机网卡vnet0都通过虚拟的网线连接到br0上,这样eth0和vnet0之间可以互相交换数据。

我们把br0叫做桥,其实在宿主机上也是一张虚拟的网卡,作为虚拟交换机角色,而传统交换机本身就是按mac目标地址的将数据转发到正确的网线出口上,并不会做什么事情。

配置虚拟机采用桥接模式并指定br0后,数据从虚拟机的网卡vnet0发出到br0,br0会将数据转发给另一端的eth0,源mac是虚拟机的随机MAC地址,源IP是虚拟机的IP地址,桥并没有做中间修改,数据仅仅通过eth0网卡直接发到链路上,eth0只是充当一个发送的物理介质。

当应答回来的时候,物理网卡eth0会在混杂模式捕获包并交给br0处理,如果目标mac地址等于eth0或者vnet0,则进一步处理。如果是eth0的包那么直接宿主机处理,如果是vnet0的包则转发给虚拟机处理,整个过程无需对包做出修改,因为br0仅仅是一个交换机,而eth0和vnet0是连在上面的2个网卡而已。

更加简单的去理解的话,br0是一个交换机,eth0是连在br0交换机上某个插槽的另外一台特殊交换机(它在混杂模式工作,监听的是来自物理交换机发来的各类包),而vnet0是连在br0交换机上的一台普通服务器。

根据上述描述,可以得知:

  1. 无论是虚拟机还是物理机,大家都在一个网段里,都指向同一个默认网关(物理路由器)。
  2. 虚拟机通过桥,可以向物理路由器申请dhcp,分配得到局域网IP。
  3. 挂在桥上的虚拟机,可以直接被局域网其他用户访问,因为eth0混杂模式+桥可以转发到虚拟机。
  4. 混杂模式的网卡只是一个物理介质,它监听所有的包,只留下自己关注的包(比如目的mac地址是eth0h或者vnet0的包),也可以发送任意的包,无论包的源mac地址到底是不是物理网卡自身的(vnet0的假mac地址)

可见,桥接更加适合于虚拟机对外提供服务,因为它是可以被外部访问到的,和一个正常的局域网用户没有什么区别。

很多网络的结构图喜欢把一个局域网的用户关联到一条线上,体现出大家都在一个链路上的感觉,其实这是很大的误导,真实的局域网用户都是接在一个交换机上面的,交换机知道每个插槽上有哪些mac地址,一般来说一个插槽就一个mac地址,但是对于我们说的桥接就可能是多个,另外也可能是接了另外一个交换机,也就是交换机可以级联,仍旧是一个局域网。

5 responses to “理解桥接bridge和dhcp的原理

  1. 默认网关怎么能知道发给虚拟出的ip地址的数据包,应该发送给物理网卡eth0?是由eth0通过rip等协议广播路由?

    1. 默认网关只是说包要发给某MAC地址, 数据包在链路上所有网卡都是捕获的,开了桥的网卡可以捕获自己管理的MAC的包。

发表评论

电子邮件地址不会被公开。