這篇文章將為大家詳細(xì)講解有關(guān)Linux 虛擬網(wǎng)絡(luò)設(shè)備 veth-pair有什么用,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
公司主營(yíng)業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)推出坪山免費(fèi)做網(wǎng)站回饋大家。
顧名思義,veth-pair 就是一對(duì)的虛擬設(shè)備接口,和 tap/tun 設(shè)備不同的是,它都是成對(duì)出現(xiàn)的。一端連著協(xié)議棧,一端彼此相連著。如下圖所示:
正因?yàn)橛羞@個(gè)特性,它常常充當(dāng)著一個(gè)橋梁,連接著各種虛擬網(wǎng)絡(luò)設(shè)備,典型的例子像“兩個(gè) namespace 之間的連接”,“Bridge、OVS 之間的連接”,“Docker 容器之間的連接” 等等,以此構(gòu)建出非常復(fù)雜的虛擬網(wǎng)絡(luò)結(jié)構(gòu),比如 OpenStack Neutron。
我們給上圖中的 veth0 和 veth2 分別配上 IP:10.1.1.2 和 10.1.1.3,然后從 veth0 ping 一下 veth2。理論上它們處于同網(wǎng)段,是能 ping 通的,但結(jié)果卻是 ping 不通。
抓個(gè)包看看,tcpdump -nnt -i veth0
root@ubuntu:~# tcpdump -nnt -i veth0 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on veth0, link-type EN10MB (Ethernet), capture size 262144 bytes ARP, Request who-has 10.1.1.3 tell 10.1.1.2, length 28 ARP, Request who-has 10.1.1.3 tell 10.1.1.2, length 28
可以看到,由于 veth0 和 veth2 處于同一個(gè)網(wǎng)段,且是第一次連接,所以會(huì)事先發(fā) ARP 包,但 veth2 并沒(méi)有響應(yīng) ARP 包。
經(jīng)查閱,這是由于我使用的 Ubuntu 系統(tǒng)內(nèi)核中一些 ARP 相關(guān)的默認(rèn)配置限制所導(dǎo)致的,需要修改一下配置項(xiàng):
echo 1 > /proc/sys/net/ipv4/conf/veth2/accept_local echo 1 > /proc/sys/net/ipv4/conf/veth0/accept_local echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter echo 0 > /proc/sys/net/ipv4/conf/veth0/rp_filter echo 0 > /proc/sys/net/ipv4/conf/veth2/rp_filter
完了再 ping 就行了。
root@ubuntu:~# ping -I veth0 10.1.1.3 -c 2 PING 10.1.1.3 (10.1.1.3) from 10.1.1.2 veth0: 56(84) bytes of data. 64 bytes from 10.1.1.3: icmp_seq=1 ttl=64 time=0.047 ms 64 bytes from 10.1.1.3: icmp_seq=2 ttl=64 time=0.064 ms --- 10.1.1.3 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 3008ms rtt min/avg/max/mdev = 0.047/0.072/0.113/0.025 ms
我們對(duì)這個(gè)通信過(guò)程比較感興趣,可以抓包看看。
對(duì)于 veth0 口:
root@ubuntu:~# tcpdump -nnt -i veth0 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on veth0, link-type EN10MB (Ethernet), capture size 262144 bytes ARP, Request who-has 10.1.1.3 tell 10.1.1.2, length 28 ARP, Reply 10.1.1.3 is-at 5a:07:76:8e:fb:cd, length 28 IP 10.1.1.2 > 10.1.1.3: ICMP echo request, id 2189, seq 1, length 64 IP 10.1.1.2 > 10.1.1.3: ICMP echo request, id 2189, seq 2, length 64 IP 10.1.1.2 > 10.1.1.3: ICMP echo request, id 2189, seq 3, length 64 IP 10.1.1.2 > 10.1.1.3: ICMP echo request, id 2244, seq 1, length 64
對(duì)于 veth2 口:
root@ubuntu:~# tcpdump -nnt -i veth2 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on veth2, link-type EN10MB (Ethernet), capture size 262144 bytes ARP, Request who-has 10.1.1.3 tell 10.1.1.2, length 28 ARP, Reply 10.1.1.3 is-at 5a:07:76:8e:fb:cd, length 28 IP 10.1.1.2 > 10.1.1.3: ICMP echo request, id 2189, seq 1, length 64 IP 10.1.1.2 > 10.1.1.3: ICMP echo request, id 2189, seq 2, length 64 IP 10.1.1.2 > 10.1.1.3: ICMP echo request, id 2189, seq 3, length 64 IP 10.1.1.2 > 10.1.1.3: ICMP echo request, id 2244, seq 1, length 64
奇怪,我們并沒(méi)有看到 ICMP 的 echo reply
包,那它是怎么 ping 通的?
其實(shí)這里 echo reply
走的是 localback 口,不信抓個(gè)包看看:
root@ubuntu:~# tcpdump -nnt -i lo tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes IP 10.1.1.3 > 10.1.1.2: ICMP echo reply, id 2244, seq 1, length 64 IP 10.1.1.3 > 10.1.1.2: ICMP echo reply, id 2244, seq 2, length 64 IP 10.1.1.3 > 10.1.1.2: ICMP echo reply, id 2244, seq 3, length 64 IP 10.1.1.3 > 10.1.1.2: ICMP echo reply, id 2244, seq 4, length 64
為什么?
我們看下整個(gè)通信流程就明白了。
echo request
,通過(guò) socket 發(fā)給協(xié)議棧。ip route show table 0
查看)。整個(gè)過(guò)程如下圖所示:
namespace 是 Linux 2.6.x 內(nèi)核版本之后支持的特性,主要用于資源的隔離。有了 namespace,一個(gè) Linux 系統(tǒng)就可以抽象出多個(gè)網(wǎng)絡(luò)子系統(tǒng),各子系統(tǒng)間都有自己的網(wǎng)絡(luò)設(shè)備,協(xié)議棧等,彼此之間互不影響。
如果各個(gè) namespace 之間需要通信,怎么辦呢,答案就是用 veth-pair 來(lái)做橋梁。
根據(jù)連接的方式和規(guī)模,可以分為“直接相連”,“通過(guò) Bridge 相連” 和 “通過(guò) OVS 相連”。
直接相連是最簡(jiǎn)單的方式,如下圖,一對(duì) veth-pair 直接將兩個(gè) namespace 連接在一起。
給 veth-pair 配置 IP,測(cè)試連通性:
# 創(chuàng)建 namespace ip netns a ns1 ip netns a ns2 # 創(chuàng)建一對(duì) veth-pair veth0 veth2 ip l a veth0 type veth peer name veth2 # 將 veth0 veth2 分別加入兩個(gè) ns ip l s veth0 netns ns1 ip l s veth2 netns ns2 # 給兩個(gè) veth0 veth2 配上 IP 并啟用 ip netns exec ns1 ip a a 10.1.1.2/24 dev veth0 ip netns exec ns1 ip l s veth0 up ip netns exec ns2 ip a a 10.1.1.3/24 dev veth2 ip netns exec ns2 ip l s veth2 up # 從 veth0 ping veth2 [root@localhost ~]# ip netns exec ns1 ping 10.1.1.3 PING 10.1.1.3 (10.1.1.3) 56(84) bytes of data. 64 bytes from 10.1.1.3: icmp_seq=1 ttl=64 time=0.073 ms 64 bytes from 10.1.1.3: icmp_seq=2 ttl=64 time=0.068 ms --- 10.1.1.3 ping statistics --- 15 packets transmitted, 15 received, 0% packet loss, time 14000ms rtt min/avg/max/mdev = 0.068/0.084/0.201/0.032 ms
Linux Bridge 相當(dāng)于一臺(tái)交換機(jī),可以中轉(zhuǎn)兩個(gè) namespace 的流量,我們看看 veth-pair 在其中扮演什么角色。
如下圖,兩對(duì) veth-pair 分別將兩個(gè) namespace 連到 Bridge 上。
同樣給 veth-pair 配置 IP,測(cè)試其連通性:
# 首先創(chuàng)建 bridge br0 ip l a br0 type bridge ip l s br0 up # 然后創(chuàng)建兩對(duì) veth-pair ip l a veth0 type veth peer name br-veth0 ip l a veth2 type veth peer name br-veth2 # 分別將兩對(duì) veth-pair 加入兩個(gè) ns 和 br0 ip l s veth0 netns ns1 ip l s br-veth0 master br0 ip l s br-veth0 up ip l s veth2 netns ns2 ip l s br-veth2 master br0 ip l s br-veth2 up # 給兩個(gè) ns 中的 veth 配置 IP 并啟用 ip netns exec ns1 ip a a 10.1.1.2/24 dev veth0 ip netns exec ns1 ip l s veth0 up ip netns exec ns2 ip a a 10.1.1.3/24 dev veth2 ip netns exec ns2 ip l s veth2 up # veth0 ping veth2 [root@localhost ~]# ip netns exec ns1 ping 10.1.1.3 PING 10.1.1.3 (10.1.1.3) 56(84) bytes of data. 64 bytes from 10.1.1.3: icmp_seq=1 ttl=64 time=0.060 ms 64 bytes from 10.1.1.3: icmp_seq=2 ttl=64 time=0.105 ms --- 10.1.1.3 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 999ms rtt min/avg/max/mdev = 0.060/0.082/0.105/0.024 ms
OVS 是第三方開(kāi)源的 Bridge,功能比 Linux Bridge 要更強(qiáng)大,對(duì)于同樣的實(shí)驗(yàn),我們用 OVS 來(lái)看看是什么效果。
如下圖所示:
同樣測(cè)試兩個(gè) namespace 之間的連通性:
# 用 ovs 提供的命令創(chuàng)建一個(gè) ovs bridge ovs-vsctl add-br ovs-br # 創(chuàng)建兩對(duì) veth-pair ip l a veth0 type veth peer name ovs-veth0 ip l a veth2 type veth peer name ovs-veth2 # 將 veth-pair 兩端分別加入到 ns 和 ovs bridge 中 ip l s veth0 netns ns1 ovs-vsctl add-port ovs-br ovs-veth0 ip l s ovs-veth0 up ip l s veth2 netns ns2 ovs-vsctl add-port ovs-br ovs-veth2 ip l s ovs-veth2 up # 給 ns 中的 veth 配置 IP 并啟用 ip netns exec ns1 ip a a 10.1.1.2/24 dev veth0 ip netns exec ns1 ip l s veth0 up ip netns exec ns2 ip a a 10.1.1.3/24 dev veth2 ip netns exec ns2 ip l s veth2 up # veth0 ping veth2 [root@localhost ~]# ip netns exec ns1 ping 10.1.1.3 PING 10.1.1.3 (10.1.1.3) 56(84) bytes of data. 64 bytes from 10.1.1.3: icmp_seq=1 ttl=64 time=0.311 ms 64 bytes from 10.1.1.3: icmp_seq=2 ttl=64 time=0.087 ms ^C --- 10.1.1.3 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 999ms rtt min/avg/max/mdev = 0.087/0.199/0.311/0.112 ms
關(guān)于Linux 虛擬網(wǎng)絡(luò)設(shè)備 veth-pair有什么用就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。