前面文章提到将物理或者虚拟主机映射到VTN网络中,有三种方式,上篇文章讲解了如何通过主机所连接的交换机端口进行port map,在这篇文章则讲解如何进行mac map并进行测试。

下面是我们进行功能测试的网络拓扑:

Single Controller Mapping.png

在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。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐