GRE(通用路由协议封装)是由Cisco和Net-smiths等公司于1994年提交给IETF的,标号为RFC1701和RFC1702。GRE规定了如何用一种网络协议去封装另一种网络协议的方法。GRE的隧道由两端的源IP地址和目的IP地址来定义,允许用户使用IP包封装IP、IPX、AppleTalk包,并支持全部的路由协议(如RIP2、OSPF等)。通过GRE,用户可以利用公共IP网络连接IPX网络、AppleTalk网络,还可以使用保留地址进行网络互连,或者对公网隐藏企业网的IP地址。
一、实验目的
- 了解GRE协议及原理
- 理解 Open vSwitch如何配置GRE隧道
二、实验原理
Open vSwitch创建GRE原理很简单,就是把对GRE头和外部IP头的一些操作从原来的代码中抽象出来,做成内核“库函数”的形式,然后 Open vSwitch中就可以直接调用它们了。 Open vSwitch GRE tunnel没有注册网络设备,因此无法通过iplink看到它,它只是一个vport而已,所以能通过ovs-vsctl show可以看到。
三、实验任务
本实验需要创建两台虚拟机来模拟一个虚网,在虚拟机中启动 Open vSwitch服务,最后配置 Open vSwitch,创建GRE隧道并进行验证。
实验中用到的网络拓扑如下:
四、实验步骤
4.1 搭建环境
本实验需要两台虚拟机VM1和VM2,并且都安装内核为3.13,支持GRE的Mininet。
4.2 配置VM1
(1)Open vSwitch服务验证
验证虚拟机VM1的OvS服务是否被启动好:
1 |
# ps –ef|grep ovs |
OvS已启动。
(2)创建两个bridge
1 2 |
# ovs-vsctl add-br br0 # ovs-vsctl add-br br1 |
(3)配置br0上
1 2 3 4 |
# ifconfig eth0 0 up # ifconfig br0 20.0.2.12 netmask 255.255.255.248 # route add default gw 20.0.2.9 # ovs-vsctl add-port br0 eth0 |
(4)配置br1
给br1配置IP地址:
1 |
# ifconfig br1 172.171.6.6/24 up |
(5)查看OVS配置
1 |
# ovs-vsctl show |
(6)查看网络配置
4.3 配置VM2
(1)验证OVS服务并配置OVS,同VM1
1 2 3 4 5 6 |
# ovs-vsctl add-br br0 # ovs-vsctl add-br br1 # ifconfig eth0 0 up # ifconfig br0 20.0.2.12 netmask 255.255.255.248 # route add default gw 20.0.2.9 # ovs-vsctl add-port br0 eth0 |
给br1设置IP:
1 |
# ifconfig br1 172.171.6.7/24 |
(2)查看OVS配置
(3)查看网络配置
4.4 创建gre之前
创建gre隧道之前,做如下操作。
VM2的br0 ping VM1的br0,可以通信,如下图:
VM2的br1 ping VM1的br1,无法通信,如下图
反过来用VM1 ping VM2得到同样的结果.
4.5 创建gre隧道
(1)在VM1上配置GRE
1 |
# ovs-vsctl add-port br1 gre1 -- set interface gre1 type=gre option:remote_ip=20.0.2.11 |
(2)配置好的OVS如下
(3)在VM2上配置GRE
1 |
# ovs-vsctl add-port br1 gre1 -- set interface gre1 type=gre option:remote_ip=20.0.2.12 |
(4)配置好的OVS如下
4.6 验证gre隧道
(1)VM2的br0 ping VM1的br0,可以通信
(2)VM2的br1 ping VM1的br1,可以通信
(3)反过来用VM1 ping VM2同样都可以通信
4.7 抓包分析
通过抓包证明数据包的使用协议的确是GRE,具体如下图
五、实验结论
Open vSwitch创建GRE隧道可以让两个无法通信的机器通信起来,实验中,GRE把两个不通信的网桥连接起来,可以推断出,假如网桥上接主机,那么主机之间也可以通信。这在连接两个不同域之间的SDN网络有很大的作用,我们的“SDN创新实验平台”中的不同节点就是用Open vSwitch创建GRE隧道连接的。值得说的是用运行在Linux环境中的 Open vSwitch创建GRE隧道,LinuxKernel的最低版本为3.11。