构造一个简单的三主机拓扑:
其中h1将作为路由器。
构建三个主机的代码如下:
#!/usr/bin/python
from mininet.net import Mininet
from mininet.node import Controller, RemoteController
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import Link, TCLink
from mininet.topo import Topo
import logging
class HostTopo(Topo):
def create_nodes(self, length):
for i in range(0, length):
self.host_list.append(self.addHost('h' + str(i)))
def create_links(self, length):
for i in range(0, length-1):
self.addLink(self.host_list[i], self.host_list[i+1])
def __init__(self, length):
logger.debug("Class SimpleTopo init")
self.host_list = []
Topo.__init__(self)
self.create_nodes(length)
self.create_links(length)
def create_topo(length):
topo = HostTopo(length)
net = Mininet(topo = topo, link = TCLink, controller = None) #不加入控制器
net.start()
CLI(net)
net.stop()
if __name__ == '__main__':
logger = logging.getLogger(__name__)
setLogLevel('info')
if os.getuid() != 0:
logger.debug("You are NOT root")
elif os.getuid() == 0:
create_topo(3)
在命令行打开文件后,查看网络的连接状态:
下面先给每个网卡配置IP地址:
这一步要特别注意!h0-eth0与h1-eth0的IP网络号必须相同!因为路由器的接口与其直接相连的局域网(或是主机)的网络号必须一致,否则在后面添加路由的时候会显示网络不可达!h2-eth0和h1-eth1同理。
接下来添加路由:
这里添加的是默认路由,也就是不论目的地址是什么,都按照这个路由进行转发。"gw"是"getway"网关的意思,也就是路由器(路由器有时也被习惯称为网关)。"gw"后面是域h0-eth0直接相连的h1-eth0的接口IP地址,如果h0-eth0, h1-eth0网络号不同的话,这里就会显示网络不可达的错误信息。
再启动h1的ipv4路由转发功能:
不过这一步我试过,好像也是可以省略的。
最后就是调试环节啦!
一开始h0 ping h2不通。
进行上述的操作后,h0 ping h2就能通了。
不过我在实验的时候发现了一个很奇怪的地方。
在构建完路由实验后,输入pingall,出现h0 -> h1, h2 -> h1不通的情况:
但是在单独ping,比如h0 ping h1的时候,却显示可达:
不明白这是什么情况,欢迎大佬指出。
小结
本实验需要注意的地方是:
1 . 主机和路由器相连的接口的IP网络号必须设置为相同的。
2 . 熟悉添加路由的方式。
3 . 可以用sysctl激活路由器转发IPv4的功能。
附加内容
一个接口可以分配多个具有全局意义的IP地址,也可以连接到多个网络。
可以发现,h0-eth0多了一个同网络(10.0.1.0)的IP地址时,h2依然可以ping h0。
(一开始加错ip地址了,10.0.1.4/24打成10.0.1.4/32,后面就将它删除掉)
接下来给h0-eth0增加一个不同网络的地址。
依然可以ping通。
(注意,因为h1是路由器,且h0-eh0 < – > h1-eh0,因此h1-eth0也要多增加一个地址,否则会ping不通)
来源:CSDN
作者:shamansi99
链接:https://blog.csdn.net/shamansi99/article/details/104074899