前面文章提到将物理或者虚拟主机映射到VTN网络中,有三种方式,上篇文章讲解了如何通过主机所连接的交换机端口进行port map,在这篇文章则讲解如何进行mac map并进行测试。
下面是我们进行功能测试的网络拓扑:
在mininet中通过如下脚本topo_handson.py创建如上网络拓扑:
#!/usr/bin/python
from mininet.topo import Topo
class MyTopo2( Topo ):
"Simple topology example."
def __init__( self ):
"Create custom topo."
# Initialize topology
Topo.__init__( self )
# Add hosts and switches
Switch1 = self.addSwitch( 's1' )
Switch2 = self.addSwitch( 's2' )
Switch3 = self.addSwitch( 's3' )
Host1 = self.addHost( 'h1' )
Host2 = self.addHost( 'h2' )
Host3 = self.addHost( 'h3' )
Host4 = self.addHost( 'h4' )
# Add links
self.addLink( Host1, Switch1 )
self.addLink( Host2, Switch1 )
self.addLink( Host3, Switch2 )
self.addLink( Host4, Switch2 )
self.addLink( Switch1, Switch3 )
self.addLink( Switch2, Switch3 )
topos = { 'mytopo2': ( lambda: MyTopo2() ) }
执行:
sudo mn --controller=remote,ip=192.168.26.123 --custom topo_handson.py --topo mytopo2
如下:
root@odl:~# sudo mn --controller=remote,ip=192.168.26.123 --custom topo_handson.py --topo mytopo2
*** Creating network
*** Adding controller
Connecting to remote controller at 192.168.26.123:6653
*** Adding hosts:
h1 h2 h3 h4
*** Adding switches:
s1 s2 s3
*** Adding links:
(h1, s1) (h2, s1) (h3, s2) (h4, s2) (s1, s3) (s2, s3)
*** Configuring hosts
h1 h2 h3 h4
*** Starting controller
c0
*** Starting 3 switches
s1 s2 s3 ...
*** Starting CLI:
mininet> net
h1 h1-eth0:s1-eth1
h2 h2-eth0:s1-eth2
h3 h3-eth0:s2-eth1
h4 h4-eth0:s2-eth2
s1 lo: s1-eth1:h1-eth0 s1-eth2:h2-eth0 s1-eth3:s3-eth1
s2 lo: s2-eth1:h3-eth0 s2-eth2:h4-eth0 s2-eth3:s3-eth2
s3 lo: s3-eth1:s1-eth3 s3-eth2:s2-eth3
c0
host1、host3的ip如下:
mininet> h1 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: h1-eth0@if880: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 5e:36:7d:f7:c2:88 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.0.1/8 brd 10.255.255.255 scope global h1-eth0
valid_lft forever preferred_lft forever
inet6 fe80::5c36:7dff:fef7:c288/64 scope link
valid_lft forever preferred_lft forever
mininet> h3 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: h3-eth0@if882: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether aa:30:ff:aa:3a:0c brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.0.3/8 brd 10.255.255.255 scope global h3-eth0
valid_lft forever preferred_lft forever
inet6 fe80::a830:ffff:feaa:3a0c/64 scope link
valid_lft forever preferred_lft forever
可以发现,主机h1 ping h3是不通的:
mininet> h1 ping h3
PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.
From 10.0.0.1 icmp_seq=1 Destination Host Unreachable
From 10.0.0.1 icmp_seq=2 Destination Host Unreachable
From 10.0.0.1 icmp_seq=3 Destination Host Unreachable
注意:
1)如果您使用的是铍的发行版,那么需要手动在Mininet中添加的如下流表,这些流表会将数据包转发给控制器(只有在OpenFlow 1.3或使用OVS版本(>2.1.1)时才需要此配置)
#s1、s2、s3、s4为交换机名或者说是ovs的网桥名
sudo ovs-ofctl add-flow s1 priority=0,actions=output:CONTROLLER
sudo ovs-ofctl add-flow s2 priority=0,actions=output:CONTROLLER
sudo ovs-ofctl add-flow s3 priority=0,actions=output:CONTROLLER
sudo ovs-ofctl add-flow s4 priority=0,actions=output:CONTROLLER
2)如果您使用的是铍SRq或者更新版本,则不需要如上配置,因为VTN Manager 自身下发了丢弃流表到OF1.3交换机中,可以将不匹配的包转发给控制器。
下面我们通过mac映射,将h1的mac:5e:36:7d:f7:c2:88, h3的mac:aa:30:ff:aa:3a:0c映射到VTN网络中:
1.创建VTN网络
[root@test ~]# curl --user "admin":"admin" -H "Content-type: application/json" -X POST http://192.168.26.123:8181/restconf/operations/vtn:update-vtn -d '{"input":{"tenant-name":"Tenant1"}}'
2.创建VTN虚拟网桥
[root@test ~]# curl --user "admin":"admin" -H "Content-type: application/json" -X POST http://192.168.26.123:8181/restconf/operations/vtn-vbridge:update-vbridge -d '{"input":{"tenant-name":"Tenant1","bridge-name":"vBridge1"}}'
3.将h1、h3的mac映射进虚拟网桥
[root@test ~]# curl --user "admin":"admin" -H "Content-type: application/json" -X POST http://192.168.26.123:8181/restconf/operations/vtn-mac-map:set-mac-map -d '{"input":{"operation":"SET","allowed-hosts":["5e:36:7d:f7:c2:88@0","aa:30:ff:aa:3a:0c@0"],"tenant-name":"Tenant1","bridge-name":"vBridge1"}}'
4.测试h1和h3的联通性
mininet> h1 ping h3
PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.
From 10.0.0.1 icmp_seq=1 icmp_seq=1 ttl=64 time=0.643 ms
From 10.0.0.1 icmp_seq=2 icmp_seq=2 ttl=64 time=0.409 ms
mac map实践功能正常
下面有两点需要注意:
1.在添加mac映射时,每次添加一个mac映射会覆盖掉之前的mac映射,除非不是往同一个网桥上map;遇到这种情况,可以在每次mac map时获取之前映射的mac,然后把之前的mac以及当前需要map的mac一起映射,这样就不会导致新的map会覆盖旧的map;
2. 在添加mac map时,注意下这个:"allowed-hosts":["5e:36:7d:f7:c2:88@0","aa:30:ff:aa:3a:0c@0"],里面的mac格式为:“xx:xx:xx:xx:xx:xx@0”,不然会出现格式错误。
下面是调用mac map的部分接口:
创建mac map:
curl --user "admin":"admin" -H "Content-type: application/json" -X POST http://192.168.26.123:8181/restconf/operations/vtn-mac-map:set-mac-map -d '{"input":{"operation":"SET","allowed-hosts":["5e:36:7d:f7:c2:88@0"],"tenant-name":"Tenant1","bridge-name":"vBridge1"}}'
删除mac map:
没有提供mac map的删除接口,我们可以变通的使用创建mac map的接口,在获取已经map的mac 里删除需要删除map的mac,然后重新创建mac map
这里是mac map 接口的参数解析,建议细看一下,下篇文章我们实践vlan map。