图中的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博客