也谈OpenvSwitch配置GRE隧道

来源:互联网 发布:淘宝系统架构图 编辑:程序博客网 时间:2024/05/16 05:20

1 OpenvSwitch in Kernel

从3.3的内核开始,OpenvSwitch(简称OVS)集成到Linux内核中去了,也就是说以后源码安装OVS的时候就不需要编译内核模块了,但是目前内核中的OVS还不支持配置GRE隧道。于是王聪的文章说了在这种情况下如何给OVS配置GRE。

王聪:在 openvswitch 上配置 GRE tunnel

以下是相关的一些笔记:

openvswitch-gre

创建一个普通的 GRE tunnel,然后把它添加到 openvswitch bridge 中去就可以了。如下图:

目标是让 HOST1 上面的两个 VM 和 HOST2 上面的两个 VM 通过 GRE tunnel 实现通信,在这个环境中,一个很可能的错误是把 HOST2 上的 uplink,即 eth0 也加入到 openvswitch 的 bridge 中,这是不对的,需要加入仅仅的是 GRE tunnel 设备,即 gre1 (你当然也可以把它命名为其它名字)。

注意,此时的gre设备不是在OVS中创建的,是在系统中创建的。

至于为什么会这样,可以参考我之前的学习笔记,大概的原理就是让VM的数据包的路由通过GRE设备,这样就可以进行GRE封装,封装后的数据源目地址就成了10.16.43.xx,这样再走eth0实际网卡出去,就能到达对端。

剩下的一个最重要的问题是,GRE tunnel 是无法回应 ARP 的,因为它是一个 point to point 的设备(ip addr add 192.168.2.1/24 peer 192.168.1.1/24 dev gre1),所以很明显设置了 NOARP。这个问题是这里的关键。因为这个的缘故,即使你在 VM1 上也无法 ping HOST2 上的 gre1。所以这里需要一个技巧,就是要给 bridge 本身配置一个 IP 地址,然后让 bridge 做一个 ARP proxy!

首先要明白这个环境中为什么需要ARP。首先,OVS与VM连接,VM的VNIC是有一个MAC地址的。其次,这个GRE隧道是OVS和OVS之间的,所以,VM间的通信是二层MAC针的形式,在到达交互的时候MAC帧应该是[dmac][smac][dip][sip][data]这种形式,所以H1的VM ping H2的VM的时候,一定需要先由ARP请求得到VM的MAC地址(实际上是OVS的port的MAC地址)。那么按此推断,此时GRE封装的应该是二层数据。看看最后H2主机(不是VM)的设置:

[root@host2 ~]# ip tunnel showgre0: gre/ip  remote any  local any  ttl inherit  nopmtudiscgre1: gre/ip  remote 10.16.43.214  local 10.16.43.215  ttl inherit #首先H2是有一个gre设备[root@host2 ~]# ip r s192.168.2.0/24 dev ovsbr0  proto kernel  scope link  src 192.168.2.4192.168.1.0/24 dev gre1  scope link##上面一条路由相当重要,后面有解释192.168.122.0/24 dev virbr0  proto kernel  scope link  src 192.168.122.110.16.40.0/21 dev eth0  proto kernel  scope link  src 10.16.43.215169.254.0.0/16 dev eth0  scope link  metric 1005default via 10.16.47.254 dev eth0

首先,VM通信的时候经过OVS,那么到达内核的数据就是二层的了。这个时候路由表示目的地址为192.168.1.0需要做GRE封装,于是这个二层帧被GRE封装,又根据设备gre1的性质,这个数据再三成上被封装为:

[remote_ip:10.16.43.214][local_ip:10.16.43.215][原始L2 DATA]

这个数据包从路由来看,又是该走eth0出去,于是再包裹一个二层:

[dmac(H1 eth0 MAC)][smac(H2 eth0 MAC)][remote_ip:10.16.43.214][local_ip:10.16.43.215][原始L2 DATA]

于是数据到达H1了。H1经过解封到达OVS,再到达VM。

HOST2 上面的 VM1 只需添加一个路由即可,配置如下:

[root@localhost ~]# ip r s192.168.2.0/24 dev eth1  proto kernel  scope link  src 192.168.2.2192.168.1.0/24 dev eth1  scope link  src 192.168.2.2[root@localhost ~]# ping 192.168.1.2PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.64 bytes from 192.168.1.2: icmp_seq=1 ttl=62 time=561 ms64 bytes from 192.168.1.2: icmp_seq=2 ttl=62 time=0.731 ms

VM上还需要配置路由,这个我不是很懂,再琢磨一下先。

原创文章,转载请注明: 转载自Wang Chang's Blog

本文链接地址: http://blog.wachang.net/2013/03/openvswitch-configure-gre-note-1/

原创粉丝点击