(mininet) Настройка нескольких интерфейсов на хосте

У меня есть сценарий, в котором есть серверная машина с двумя интерфейсами. Каждый из этих интерфейсов имеет свой собственный 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. Конечно, я тоже не могу wget с h2.

Как настроить интерфейсы сервера, чтобы сервер отвечал на команды ping и wget через оба этих интерфейса?

/etc/network/interfaces на сервере содержит некоторую конфигурацию, но она относится к несуществующему интерфейсу eth0, поэтому я предположил, что он не используется.

ПРИМЕЧАНИЕ. Я уже узнал, что для Linux определенный IP-адрес != сетевой интерфейс. Сервер отвечает на пинги как на 10.0.0.10, так и на 10.0.0.11 с h1, но я бы хотел, чтобы он отвечал на обоих физических интерфейсах.


person bmscicho    schedule 29.12.2016    source источник


Ответы (2)


Вы можете попробовать импортировать пользовательские настройки из 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()
person Nilesh Chaturvedi    schedule 17.05.2017
comment
Меня смущает этот ответ, почему хостов и коммутаторов значительно больше, чем в исходном вопросе? - person ollie299792458; 11.02.2019

Я вижу, что вы правильно настроили IP-адрес для обоих интерфейсов, но нет канала Ethernet, соединяющего второй интерфейс с другими хостами, поэтому на этом интерфейсе нет подключения. Для правильной настройки необходимо:

  1. Создайте два объекта intf и назначьте им конкретные IP-адреса (10.0.0.10 и 10.0.0.11).
  2. Соедините эти два интерфейса на коммутаторе
  3. Прикрепите оба интерфейса к узлу сервера
  4. Настройте другие хосты и/или коммутаторы вашей топологии

Надеюсь поможет решить проблему...

person Alex Ferreira    schedule 04.01.2017