創建新的網絡命名空間:
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