Mininet互通(mininet内主机跨宿主机通信、mininet与真机通信、mininet内主机访问外网)怎么实现?

图中的ens33、ens37均是网卡,此处的互通指的是ubuntu_1、ubuntu_2、mininet_1内的主机、mininet_2内的主机全部都可以互相通信。

借助的原理就是mininet内的出口OVS(Open vSwitch)占用宿主机ubuntu主机网卡,从而达到mininet内虚拟主机ubuntu宿主机在网络中同等地位的目的,占用网卡后的网络拓扑可以这么理解。

1 实验环境

  • Ubuntu 18.04

  • mininet 2.3.0

  • python 2.7.17

2 实验步骤

实验采用真机方式实现,每台宿主机Ubuntu都有两个网口。两个网卡具体是有线无线的都行,我这里是一个RJ45真实网口,一个USB免驱无线网卡。两台主机的真实网卡插路由器LAN口,无线网卡连接路由器的WiFi。这样四个网卡相当于是在同一局域网环境下。

如果想用虚拟机做实验的话,就将虚拟机桥接主机,再将USB无线网卡给虚拟机。主机和无线网卡都连接手机热点。

ifconfig一下,一般能看到俩网卡。比如一个是ens33,一个是ens38

方案是将每台主机的ens33网卡分配给Mininet OVS。两台主机操作一致。都是

2.1 释放那个网卡

sudo ifconfig ens33 0.0.0.0

2.2 将下面的python程序保存为topo.py

注意,os.popen('ovs-vsctl add-port s1 ens33')这个里面的ens33需要改成你需要让mininet占用的网卡名称。

#!/usr/bin/env python
import os
from mininet.net import Mininet
from mininet.node import Controller, RemoteController
from mininet.cli import CLI
from mininet.link import Intf
from mininet.log import setLogLevel, info

def ToRealnet():

 net = Mininet( topo=None, build=False)

 info( '*** Adding controller\n' )
 net.addController(name='m1')

 info( '*** Add switches\n')
 s1 = net.addSwitch('s1')

 info( '*** Add hosts\n')
 h1 = net.addHost('h1', ip='0.0.0.0')   # ubuntu_2这里是h3
 h2 = net.addHost('h2', ip='0.0.0.0')   # ubuntu_2这里是h4

 info( '*** Add links\n')
 net.addLink(h1, s1)
 net.addLink(h2, s1)

 info( '*** Starting network\n')
 net.start()
 os.popen('ovs-vsctl add-port s1 ens33')
 h1.cmdPrint('dhclient '+h1.defaultIntf().name)
 h2.cmdPrint('dhclient '+h2.defaultIntf().name)
 CLI(net)
 net.stop()

if __name__ == '__main__':
 setLogLevel( 'info' )
 ToRealnet()

2.3 执行程序

sudo python topo.py

然后就可以看到h1和h2都通过dhcp方式拥有了自己的IP

2.4 检验

最后在另一台主机上也执行相同的操作。两台主机上的h1、h2、h3、h4,宿主机ubuntu_1、ubuntu_2,就都可以互通ping了

3 结束语

结束mininet后,记得清理虚拟主机

sudo mn -c

清理之后,发现占用的网卡还是不能正常工作,可以断开在重新连接,不行重启绝对行。

3.1 如果宿主机无互联需求

这种情况只需要一个网卡给mininet用,也可以做到两台机器里面的mininet主机互通。但是当mininet占用了唯一的网卡之后,宿主机将没法连接外界了。

3.2 如果只想要mininet里面的主机可以上外网

这种情况可以直接采用NAT解决

sudo mn --nat

不占用主机网卡,建立好后可以直接ping外网,但是外界主机访问不了mininet内的h1、h2(不能说绝对访问不了,至少麻烦点)。没法直接 ping www.baidu.com是因为主机没配置DNS。

参考

  • enhancement-ryu/mininetconnecttorealinternet.py at master · cotyb/enhancement-ryu · GitHub

  • 将Mininet与真实网络相连接 - cotyb - 博客园 (cnblogs.com)

  • Mininet主机与真实网络互通方案实现_BoyLJS的博客-CSDN博客

你可能感兴趣的:(Mininet互通(mininet内主机跨宿主机通信、mininet与真机通信、mininet内主机访问外网)怎么实现?)