(mininet)在主机上配置多个接口

问题描述 投票:0回答:3

我有一个场景,其中有一台具有两个接口的服务器机器。每个接口都有自己的 IP 地址。服务器计算机托管一个 HTTP 服务器,应该可以通过两个接口访问该服务器。

重现这种情况的完整 python 脚本:

from mininet.cli import CLI
from mininet.log import setLogLevel
from mininet.net import Mininet
from mininet.topo import Topo

class TestTopology(Topo):
    def __init__(self):
        Topo.__init__(self)
        host1_id = self.addHost('h1')
        host2_id = self.addHost('h2')
        server_id = self.addHost('server')
        self.addLink(server_id, host1_id)
        self.addLink(server_id, host2_id)

def configure_network(network):
    server = network.get('server')
    server.setIP('10.0.0.10', intf='server-eth0')
    server.setMAC('00:00:00:00:00:10', intf='server-eth0')
    server.setIP('10.0.0.11', intf='server-eth1')
    server.setMAC('00:00:00:00:00:11', intf='server-eth1')
    server.cmd("python -m SimpleHTTPServer 8080 &")

# Run 'sudo python *path_to_this_script*' in mininet VM.
if __name__ == '__main__':
    setLogLevel('info')
    net = Mininet(topo=TestTopology())
    configure_network(net)
    net.pingAll()
    CLI(net)

SimpleHTTPServer 默认监听 0.0.0.0。

“pingAll”测试显示 h1 可以访问服务器(反之亦然),但 h2 则不然。 当然,我也不能从 h2

wget

如何配置服务器接口,以便服务器通过这两个接口响应

ping
wget
命令?

服务器上的

/etc/network/interfaces
包含一些配置,但它是关于不存在的
eth0
接口,所以我假设它没有被使用。

注意:我已经了解到,对于 Linux,特定的 IP != 网络接口。服务器响应从 h1 到 10.0.0.10 和 10.0.0.11 的 ping,但我希望它在两个物理接口上都响应。

network-programming mininet network-interface
3个回答
1
投票

您可以尝试从 mininet.util 导入自定义

就我而言,重新排序代码是有效的。

这是我的代码:

#!/usr/bin/python

from mininet.net import Mininet
from mininet.node import Controller, RemoteController, OVSController
from mininet.node import CPULimitedHost, Host, Node
from mininet.node import OVSKernelSwitch, UserSwitch
from mininet.node import IVSSwitch
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink, Intf, Link
from mininet.util import makeNumeric, custom
from subprocess import call

def myNetwork():
    link = custom(TCLink, bw=10)
    net = Mininet( topo=None,
                   build=False,
                   ipBase='10.0.0.0/8')

    info( '*** Adding controller\n' )
    info( '*** Add switches\n')



    s5 = net.addSwitch('s5', cls=OVSKernelSwitch, failMode='standalone')
    s2 = net.addSwitch('s2', cls=OVSKernelSwitch, failMode='standalone')
    s7 = net.addSwitch('s7', cls=OVSKernelSwitch, failMode='standalone')
    s4 = net.addSwitch('s4', cls=OVSKernelSwitch, failMode='standalone')

    r8 = net.addHost('r8', cls=Node, ip='0.0.0.0')
    r8.cmd('sysctl -w net.ipv4.ip_forward=1')
    r9 = net.addHost('r9', cls=Node, ip='0.0.0.0')
    r9.cmd('sysctl -w net.ipv4.ip_forward=1')
    r10 = net.addHost('r10', cls=Node, ip='0.0.0.0')
    r10.cmd('sysctl -w net.ipv4.ip_forward=1')

    info( '*** Add hosts\n')
    h1 = net.addHost('h1', cls=Host, ip='192.168.2.1', defaultRoute=None)
    h2 = net.addHost('h2', cls=Host, ip='192.168.3.1', defaultRoute=None)

    info( '*** Add links\n')
    net.addLink(s2, r9)
    net.addLink(s4, r10)
    net.addLink(r9, s5)
    net.addLink(s7, r8)
    net.addLink(r8, h2)
    net.addLink(s5, h2)
    net.addLink(s2, h1)
    net.addLink(s4, h1)
    net.addLink(r10, s7)

    info( '*** Starting network\n')
    net.build()
    info( '*** Starting controllers\n')
    for controller in net.controllers:
        controller.start()

    info( '*** Starting switches\n')
    net.get('s5').start([])
    net.get('s2').start([])
    net.get('s7').start([])
    net.get('s4').start([])

    info( '*** Post configure switches and hosts\n')

    CLI(net)
    net.stop()

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

0
投票

我看到您正确配置了两个接口的 IP 地址,但没有以太网链路连接其他主机上的第二个接口,这就是该接口上没有连接的原因。为了正确配置它,您必须:

  1. 创建两个 intf 对象并为其分配特定的 IP 地址(10.0.0.10 和 10.0.0.11)
  2. 在交换机上连接这两个接口
  3. 将两个接口连接到服务器主机上
  4. 设置拓扑的其他主机和/或交换机

希望能帮助解决问题...


0
投票

我参加聚会超级晚了,但是在查找如何向 mininet 中的主机添加多个 IP 时出现了这个问题,所以回答以防万一这对其他人有帮助。

您要在两个不同的接口上添加来自同一子网的两个 IP。您没有指定前缀长度/网络掩码,因此 mininet 假定 10.0.0.x 为 /8。您可以在检查主机配置时看到这一点:

mininet> server ip a | grep 10.0.0
    inet 10.0.0.10/8 brd 10.255.255.255 scope global server-eth0
    inet 10.0.0.11/8 brd 10.255.255.255 scope global server-eth1

当您从 h2 向服务器发送 ping 时,它会到达服务器 eth1,源 IP 为 10.0.0.2。要发送回复,服务器会在其路由表中查找它:

mininet> server ip route
10.0.0.0/8 dev server-eth0 proto kernel scope link src 10.0.0.10
10.0.0.0/8 dev server-eth1 proto kernel scope link src 10.0.0.11

由于两个接口位于同一子网上,因此您会看到同一前缀有两条路由。 10.0.0.2 将匹配其中任何一个,但会选择列表中的第一个,因为它们是等效的。它告诉 Linux 将答案发送到“server-eth0”上的 ping。但 10.0.0.2 不在该接口上...(它在 server-eth1 上)。

您有几个选择:

  1. 添加一个交换机并将服务器、h1 和 h2 连接到它。在这里,您只需要服务器上的一个接口,但需要一个额外的交换机。
  2. 在服务器上创建一个网桥,使 eth0 和 eth1 被视为相同的接口(这类似于将 h1、h2 和服务器连接到同一交换机,但无需额外的硬件)。那么你要么在服务器上只有一个 IP,如果你想要两个,则可以有两个 IP,但无论哪种方式,它们都会位于桥接接口上。
  3. 将网络分割为两个独立的子网。 h1 和 server 类似于 10.0.10.0/24 ; h2 和服务器为 10.0.11.0/24。

第三个选项可能最有意义,但如果您希望 h1 和 h2 能够相互通信,您就必须研究路由。对于超级简单的设置,您可以将 h1 和 h2 的默认路由设置为通过服务器。

第一个选项(开关)如下所示:

self.addSwitch('s1')
self.addLink('s1', 'server')
self.addLink('s1', 'h1')
self.addLink('s1', 'h2')

第二个(桥)像这样(全部在服务器上):

ip addr del 10.0.0.10/8 dev server-eth0
ip addr del 10.0.0.11/8 dev server-eth1
brctl addbr br0
brctl addif br0 server-eth0
brctl addif br0 server-eth1
ip link set dev br0 up
ip addr add 10.0.0.10/8 dev br0
ip addr add 10.0.0.11/8 dev br0 # You don't need two IPs

最后是第三个(路由) - 这几乎与原始代码相同,只需记下额外的 IP 和前缀长度 (/24)

from mininet.cli import CLI
from mininet.log import setLogLevel
from mininet.net import Mininet
from mininet.topo import Topo

class TestTopology(Topo):
    def __init__(self):
        Topo.__init__(self)
        host1_id = self.addHost('h1', ip='10.0.10.2/24')
        host2_id = self.addHost('h2', ip='10.0.11.2/24')
        server_id = self.addHost('server')
        self.addLink(server_id, host1_id)
        self.addLink(server_id, host2_id)

def configure_network(network):
    server = network.get('server')
    server.setIP('10.0.10.1/24', intf='server-eth0')
    server.setMAC('00:00:00:00:00:10', intf='server-eth0')
    server.setIP('10.0.11.1/24', intf='server-eth1')
    server.setMAC('00:00:00:00:00:11', intf='server-eth1')
    server.cmd("python2 -m SimpleHTTPServer 8080 &")

# Run 'sudo python *path_to_this_script*' in mininet VM.
if __name__ == '__main__':
    setLogLevel('info')
    net = Mininet(topo=TestTopology())
    configure_network(net)
    # net.pingAll()
    CLI(net)

然后您可以使用正确的 IP 进行 ping 或 wget 操作:

h1 wget -O - 10.0.10.1:8080
h2 wget -O - 10.0.11.1:8080
© www.soinside.com 2019 - 2024. All rights reserved.