动态

详情 返回 返回

軟件定義網絡--01 (OVS+ ryu + Mininet 環境準備) - 动态 详情

創建新的網絡命名空間:

sudo ip netns add ns1
sudo ip netns add ns2

創建一對 veth 接口:(連接2個不同的命名空間)

sudo ip link add veth1 type veth peer name veth2

將 veth1 移動到命名空間 ns1,將 veth2 移動到命名空間 ns2:

sudo ip link set veth1 netns ns1
sudo ip link set veth2 netns ns2

在 ns1 中配置 veth1 接口:

sudo ip netns exec ns1 ip addr add 192.168.1.2/24 dev veth1
sudo ip netns exec ns1 ip link set veth1 up
sudo ip netns exec ns1 ip link set lo up

在 ns2 中配置 veth2 接口:

sudo ip netns exec ns2 ip addr add 192.168.1.3/24 dev veth2
sudo ip netns exec ns2 ip link set veth2 up
sudo ip netns exec ns2 ip link set lo up

在 ns1 中配置路由:

sudo ip netns exec ns1 ip route add default dev veth1

查看某個命名空間的網絡接口:

sudo ip netns exec ns1 ip link show 

查看網絡接口:

sudo ip link show 

查看命名空間:

sudo ip netns show 

啓動/禁用網絡接口:

ip link set eth0 up/down

查看主命名空間中 veth1 的 IP 地址:

ip addr show dev veth1

如果 veth1 在命名空間 ns1 中:

sudo ip netns exec ns1 ip addr show dev veth1

在主命名空間中綁定 IP 地址:

ip addr add 192.168.1.2/24 dev veth1

Open vSwitch(OVS)是一種高性能、多層虛擬交換機,廣泛應用於各種網絡虛擬化和雲計算環境中。

  • 在數據中心中,OVS用於在虛擬機(VM)或容器之間提供網絡連接和隔離。它支持多種隧道協議(如 VXLAN、GRE)和 VLAN,以實現虛擬網絡的分段和隔離。
  • 在雲計算平台(如 OpenStack、Kubernetes)中,OVS用於實現虛擬網絡的創建和管理,為不同租户提供隔離的網絡環境。

創建虛擬交換機:

sudo ovs-vsctl add-br br0

查看當前的 OVS 配置:

sudo ovs-vsctl show

將虛擬機的虛擬網絡接口 vnet0 添加到網橋 br0:

sudo ovs-vsctl add-port br0 vnet0

使用 ovs-ofctl 工具配置 OVS 的流表。例如,將所有來自 eth0 的流量轉發到 vnet0:

sudo ovs-ofctl add-flow br0 in_port=eth0,actions=output:vnet0

Ryu 是一個開源的 SDN 控制器框架,使用 Python 編寫。

apt install python3-venv
python3 -m venv ryu-env

激活虛擬環境:

source ryu-env/bin/activate
pip install ryu

如果安裝ryu有兼容問題, 編輯 ryu/hooks.py 文件,註釋掉或修改不兼容的部分:

git clone https://github.com/faucetsdn/ryu.git
cd ryu
修改源碼
# _main_module()._orig_get_script_args = easy_install.get_script_args
pip install .

Mininet 是一個用於創建虛擬網絡的工具,常用於測試 SDN 控制器。

sudo apt-get install mininet

Mininet 可以創建複雜的topo:

#!/usr/bin/python

from mininet.net import Mininet
from mininet.node import Controller, OVSSwitch
from mininet.cli import CLI
from mininet.log import setLogLevel, info

def customTopo():
    net = Mininet(controller=Controller, switch=OVSSwitch)

    info('*** Adding controller\n')
    net.addController('c0')

    info('*** Adding switches\n')
    s1 = net.addSwitch('s1')
    s2 = net.addSwitch('s2')

    info('*** Adding hosts\n')
    h1 = net.addHost('h1')
    h2 = net.addHost('h2')
    h3 = net.addHost('h3')
    h4 = net.addHost('h4')

    info('*** Creating links\n')
    net.addLink(h1, s1)
    net.addLink(h2, s1)
    net.addLink(s1, s2)
    net.addLink(s2, h3)
    net.addLink(s2, h4)

    info('*** Starting network\n')
    net.start()

    info('*** Running CLI\n')
    CLI(net)

    info('*** Stopping network\n')
    net.stop()

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

集成 SDN 控制器測試:

  • 啓動 Ryu 控制器

    ryu-manager ryu.app.simple_switch_13
  • 啓動 Mininet 並連接到 Ryu 控制器

    sudo mn --topo single,3 --mac --switch ovsk --controller remote,ip=127.0.0.1,port=6633
  • 在 Mininet 中進行測試
mininet> pingall
mininet> h1 iperf -s
mininet> h2 iperf -c h1

禁用鏈路

mininet> link s1 h1 down

啓用鏈路

mininet> link s1 h1 up

Add a new 评论

Some HTML is okay.