Mininet 主机无法 ping Mininet 虚拟机 IP

Mininet 主机无法 ping Mininet 虚拟机 IP

我有一个简单的拓扑,包含一台交换机和两台主机。

主机 h1 和 h2 可以正常互相 ping 通。我分别为主机 1 和 2 提供了 IP 192.168.1.17 和 18。

迷你网IP是192.168.1.16。我还将其设置为主机的默认网关。

我仍然无法从 mininet ping 主机,反之亦然。

请注意,mininet 虚拟机 IP 可从主机操作系统以及我的其他虚拟机进行 ping 操作。我缺少什么?请帮忙

蟒蛇代码是:

from mininet.topo import Topo

class MyTopo( Topo ):
    "Simple topology example."

    def build( self ):
        "Create custom topo."

        # Add hosts and switches
        switch = self.addSwitch('s1')
        host1 = self.addHost('h1')
        host2 = self.addHost('h2')

        # Add links
        self.addLink(host1, switch)
        self.addLink(host2, switch)


topos = { 'mytopo': ( lambda: MyTopo() ) }

交换机也无法 ping 通主机。我到底需要做什么

答案1

我有一个使用以下网络配置运行的 mininet 虚拟机:

mininet@mininet-vm:~/shoaib$ ip addr
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:b5:66:16 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.170/24 brd 192.168.122.255 scope global dynamic eth0
       valid_lft 2822sec preferred_lft 2822sec

如果我从以下内容开始topo.py

from mininet.topo import Topo

class MyTopo( Topo ):
    "Simple topology example."

    def build( self ):
        "Create custom topo."

        # Add hosts and switches
        switch = self.addSwitch('s1')
        host1 = self.addHost('h1', ip='192.168.37.17/24')
        host2 = self.addHost('h2', ip='192.168.37.18/24')

        # Add links
        self.addLink(host1, switch)
        self.addLink(host2, switch)


topos = { 'mytopo': ( lambda: MyTopo() ) }

这在routes.mn

h1 ip route add default via 192.168.37.16
h2 ip route add default via 192.168.37.16

然后我启动拓扑并分配路由:

mininet@mininet-vm:~/shoaib$ sudo -E mn --custom topo.py --topo mytopo
*** Creating network
*** Adding controller
*** Adding hosts:
h1 h2
*** Adding switches:
s1
*** Adding links:
(h1, s1) (h2, s1)
*** Configuring hosts
h1 h2
*** Starting controller
c0
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet>

并分配路线:

mininet> source routes.mn
mininet>

然后我们看到 mininet 在主机上创建了一个 OpenVswitch 桥,配置如下:

mininet> sh ip addr show s1
38: s1: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether 1e:49:17:d6:02:4d brd ff:ff:ff:ff:ff:ff

此时,我们注意到有关接口的两件事s1

  1. 链接打不开,并且
  2. 它没有地址。

让我们给它分配给默认路由的地址并打开链接:

mininet> sh ip addr add 192.168.37.16/24 dev s1
mininet> sh ip link set s1 up

这让我们:

mininet> sh ip addr show s1
38: s1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether 1e:49:17:d6:02:4d brd ff:ff:ff:ff:ff:ff
    inet 192.168.37.16/24 scope global s1
       valid_lft forever preferred_lft forever

此时,主机 h1 和 h2 可以使用网关地址 ping mininet 主机:

mininet> h1 ping -c 1 192.168.37.16
PING 192.168.37.16 (192.168.37.16) 56(84) bytes of data.
64 bytes from 192.168.37.16: icmp_seq=1 ttl=64 time=1.10 ms

--- 192.168.37.16 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.097/1.097/1.097/0.000 ms

还有主要主机地址:

mininet> h1 ping -c 1 192.168.122.170
PING 192.168.122.170 (192.168.122.170) 56(84) bytes of data.
64 bytes from 192.168.122.170: icmp_seq=1 ttl=64 time=0.547 ms

--- 192.168.122.170 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.547/0.547/0.547/0.000 ms

但他们不能到达 mininet 主机之外的任何地址:

mininet> h1 ping -c 1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

--- 8.8.8.8 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

这是因为这些数据包将被本地网络上的网关丢弃。如果我们希望它起作用,最简单的解决方案是在我们的 mininet 主机上的 netfilter 配置中添加一个伪装规则:

mininet> sh iptables -t nat -A POSTROUTING -s 192.168.37.0/24 -o eth0 -j MASQUERADE

现在我们可以访问外部主机了:

mininet> h1 ping -c 1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=115 time=10.6 ms

--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 10.639/10.639/10.639/0.000 ms

如果我们将上述所有命令放入setup.mn

h1 ip route add default via 192.168.37.16
h2 ip route add default via 192.168.37.16
sh ip addr add 192.168.37.16/24 dev s1
sh ip link set s1 up
sh iptables -t nat -A POSTROUTING -s 192.168.37.0/24 -o eth0 -j MASQUERADE

那么这就简化为:

$ sudo mn --custom topo.py --topo mytopo
mininet> source setup.mn

笔记

  • 重要的是,我们用于 mininet 主机的地址范围不能与 mininet 虚拟机使用的地址范围冲突或者其他本地网络。

  • 192.168.37.0/24我正在使用mininet 主机的地址范围,因为192.168.1.0/24我的本地(物理)网络已在使用该地址范围。

  • ping并不是一个很好的诊断工具,特别是对于远程主机。ping即使您可以成功建立连接,也可能会失败。我们不需要担心这个例子中的行为,但它值得记住。

相关内容