创建新的网络命名空间:
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。