什么是虛擬網絡設備呢?


OpenStack虛擬化網絡實現中大量應用了多種虛擬網絡設備,了解這些設備是理解OpenStack虛擬網絡實現的基礎,本文來簡單介紹這些虛擬網絡設備。

TUN/TAP設備

TUN/TAP設備是linux內核中實現的虛擬網卡。物理網卡是從物理線路上收發數據包,而TUN/TAP設備是從用戶態應用程序上收發以太網幀或IP包。用戶態進程對 /dev/net/tun 文件調用 open() 獲取一個文件描述符,並調用 ioctl() 掛接到該設備上,接着通過讀寫該文件描述符從TUN/TAP設備的收發數據包。收發的數據包由用戶態進程構造好。TUN和TAP設備的區別在於TUN設備收發的是IP包,而TAP設備收發的是以太網幀。

在進程中創建及使用TUN/TAP設備可以參考官方文檔: https://www.kernel.org/doc/Documentation/networking/tuntap.txt

可以使用iproute2工具包中的ip命令創建TUN/TAP設備, 如:

ip tuntap add dev tap0 mode tap ip tuntap add dev tun0 mode tun

通過 ip link 命令可以看到設備已經創建:

[root@compute1 ~]# ip link show tap0 23: tap0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 500 link/ether a6:73:4e:90:f9:3e brd ff:ff:ff:ff:ff:ff [root@compute1 ~]# ip link show tun0 24: tun0: <POINTOPOINT,MULTICAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 500 link/none

設備創建完成后可以和物理設備一樣對TAP進行配置IP地址等操作,如:

[root@compute1 ~]# ip addr add 192.168.1.2/24 dev tap0 [root@compute1 ~]# ip link set dev tap0 up [root@compute1 ~]# ip addr list dev tap0 23: tap0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 500 link/ether 36:f2:68:6a:fd:6d brd ff:ff:ff:ff:ff:ff inet 192.168.1.2/24 scope global tap0 valid_lft forever preferred_lft forever

刪除已創建的設備:

ip tuntap del dev tap0 mode tap ip tuntap del dev tun0 mode tun

Linux bridge

Linux bridge是虛擬二層交換設備, 它基於MAC地址對數據包在bridge的port間進行轉發。物理網卡和TAP等虛擬網絡設備都可以連接到Linux bridge上。

可以使用 brctl 工具或 iproute2 工具包中的ip命令操作Linux bridge

創建bridge

brctl addbr br0

添加設備到bridge

brctl addif br0 eth0

顯示bridge

brctl show

啟動bridge

ip link set dev br0 up

停止bridge

ip link set dev br0 down

刪除bridge

brctl delbr br0

使用IP命令操作bridge:

創建bridge並啟動

ip link add name br0 type bridge ip link set dev br0 up

先將該端口設置為混雜模式並啟動該接口

ip link set dev eth0 promisc on ip link set dev eth0 up

將接口添加到bridge

ip link set dev eth0 master br0

若要刪除網橋,應首先移除它所關聯的所有接口,同時關閉接口的混雜模式並關閉接口以將其恢復至原始狀態。

ip link set dev eth0 promisc off ip link set dev eth0 down ip link set dev eth0 nomaster

刪除bridge

ip link delete br0 type bridge

OVS: Open vSwitch

官網: http://openvswitch.org

OVS是一個產品級別的開源虛擬交換機。相較於Linux bridge, 它提供了各多的功能特性和自動化的編程支持。OVS使用OPENFLOW協議的流表來控制轉發邏輯。

一些簡單的操作:

創建bridge

ovs-vsctl add-br ovsbr0

查看bridge

ovs-vsctl show

添加Port, 並設置VLAN ID為2:

ovs-vsctl add-port ovsbr0 tap1 tag=2

刪除Port

ovs-vsctl del-port ovsbr0 tap1

刪除bridge

ovs-vsctl del-br ovsbr0

network namespace

一般情況下,Linux的網絡接口,路由表、協議棧、iptables規則等資源由操作系統的全部進程共享。通過使用netowrk namespace, 可以將這些網絡資源隔離開,只由namespace內的進程共享。

namespace示例:

創建namespace

ip netns add ns1

查看namespace

ip netns list

將設備添加進namespace,這樣在全局的環境下,該設備不再可見

ip link set dev tap1 netns ns1

查看namespace內設備

ip netns exec ns1 ip link list

可以直接在namespace中執行bash, 再統一對namespace內的設備進行處理

ip netns exec ns1 bash

刪除namespace

ip netns del ns1

veth pair

Virtual Ethernet Pair簡稱veth pair, 是一對邏輯相連的端口或網絡接口。從其中一個端口進入的數據包將從另一端口流出。可以使用veth pair設備來連接Linux bridge或者OVS的bridge,也可以通過veth pair將兩個network namespace連接起來。

創建veth pair:

ip link add dev veth0 type veth peer name veth1

查看創建的veth pair:

[root@compute1 ~]# ip link list ... 29: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 link/ether f6:eb:23:3b:f1:5b brd ff:ff:ff:ff:ff:ff 30: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 link/ether ba:8d:1c:cf:04:a0 brd ff:ff:ff:ff:ff:ff

從輸出可以看到對應的接口設備的名稱。

以下示例將veth pair的兩個接口分別添加到兩個namespace中,從而將兩個namespace連接起來。

ip netns add ns1 ip netns add ns2 ip link set veth0 netns ns1 ip link set veth1 netns ns2 ip netns exec ns1 ip link set dev veth0 up ip netns exec ns2 ip likn set dev veth1 up


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM