動機

雖然說是netns筆記,但其實主要是說linux的虛擬網路裝置…

TUN/TAP

TUN/TAP 可以想成一個網卡但與某個fd直連 所以有 TUN/TAP 有兩個 input與output 的來源

  1. 網路
  2. fd => OS中跑的程式

TUN可以看到IP層,TAP可以看到第二層

這個與一般用socket來read不同的是,我們不用聽到tcp或udp的port 雖然聽起來很像廢話,但都是write/read,我們能一般都是用tcp或udp,但TUN/TAP讓我們有能力看到第三、二層的封包。

TUN/TAP整體更像一個userspace與kernelspace溝通的手段,中間透過network stack這樣

veth-pair & bridge

可以想成有兩張網卡(TUN)直接用線接起來,主要搭配bridge(brctl)使用,這樣就可以模擬把線插在一般的switch

下面是用veth-pair連結兩個netns

# add the namespaces
ip netns add ns1
ip netns add ns2
# create the veth pair
ip link add tap1 type veth peer name tap2
# move the interfaces to the namespaces
ip link set tap1 netns ns1
ip link set tap2 netns ns2
# bring up the links
ip netns exec ns1 ip link set dev tap1 up
ip netns exec ns2 ip link set dev tap2 up
# add ip
ip netns exec ns1 ip a add 192.168.123.1/24 dev tap1
ip netns exec ns2 ip a add 192.168.123.2/24 dev tap2

把veth換成實體的網卡,就可以跑local breakout了,而方法也差不多,不過不用加網卡(ip link add),把link set的dev name換成要加的網卡就好

macvlan

可以想成 veth-pair & bridge 的打包一次到好的版本

同樣都是可以在L2把大家連在一起

有不同的模式

  1. bridge mode: 功能與veth-pair & bridge一樣,透過bridge(software)來route
  2. VEPA mode: 與bridge mode不同的點是 透過外面的switch(hardware) 來route
  3. private mode: 誰都不能通信
  4. Passthru mode: veth-pair

要注意的是macvlan不能用在802.11,還有macvlan每多一個網卡就會吃掉一個MAC

ipvlan

與macvlan很像,但可以運作在第三層

那兩者的差別在

ipvlan可以共用實體port的MAC,macvlan每多一個網卡就會吃掉一個MAC

ipvlan有L2與L3 mode 兩者差別是

L2的broadcast在L3 mode不會被處理,L2會

macvtap/ipvtap

就是macvlan/ipvlan的網卡,可以有TAP/TUN的功能,可以用fd寫與收資料了

bridge

L2的switch

可以用brctl改相關設定,像stp之類的

下面是用bridge配合veth pair把兩個netns連起來

# add the namespaces
ip netns add ns1
ip netns add ns2
# create the switch
BRIDGE=br-test
brctl addbr $BRIDGE
brctl stp   $BRIDGE off
ip link set dev $BRIDGE up
#
#### PORT 1
# create a port pair
ip link add tap1 type veth peer name br-tap1
# attach one side to linuxbridge
brctl addif br-test br-tap1 
# attach the other side to namespace
ip link set tap1 netns ns1
# set the ports to up
ip netns exec ns1 ip link set dev tap1 up
ip link set dev br-tap1 up
#
#### PORT 2
# create a port pair
ip link add tap2 type veth peer name br-tap2
# attach one side to linuxbridge
brctl addif br-test br-tap2
# attach the other side to namespace
ip link set tap2 netns ns2
# set the ports to up
ip netns exec ns2 ip link set dev tap2 up
ip link set dev br-tap2 up
# add ip
ip netns exec ns1 ip a add 192.168.123.1/24 dev tap1
ip netns exec ns2 ip a add 192.168.123.2/24 dev tap2

Ref

利用 Linux tap/tun 虚拟设备写一个 ICMP echo 程序 Macvlan 和 IPvlan Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN(转载) linux 网络虚拟化: ipvlan Introduction to Linux interfaces for virtual networking network namespace连接的4种方法及性能