真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Linux虛擬網(wǎng)絡(luò)設(shè)備veth-pair有什么用

這篇文章將為大家詳細(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)站回饋大家。

01 veth-pair 是什么

顧名思義,veth-pair 就是一對(duì)的虛擬設(shè)備接口,和 tap/tun 設(shè)備不同的是,它都是成對(duì)出現(xiàn)的。一端連著協(xié)議棧,一端彼此相連著。如下圖所示:

Linux 虛擬網(wǎng)絡(luò)設(shè)備 veth-pair有什么用

正因?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。

02 veth-pair 的連通性

我們給上圖中的 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è)通信流程就明白了。

  1. 首先 ping 程序構(gòu)造 ICMP echo request,通過(guò) socket 發(fā)給協(xié)議棧。
  2. 由于 ping 指定了走 veth0 口,如果是第一次,則需要發(fā) ARP 請(qǐng)求,否則協(xié)議棧直接將數(shù)據(jù)包交給 veth0。
  3. 由于 veth0 連著 veth2,所以 ICMP request 直接發(fā)給 veth2。
  4. veth2 收到請(qǐng)求后,交給另一端的協(xié)議棧。
  5. 協(xié)議??幢镜赜?10.1.1.3 這個(gè) IP,于是構(gòu)造 ICMP reply 包,查看路由表,發(fā)現(xiàn)回給 10.1.1.0 網(wǎng)段的數(shù)據(jù)包應(yīng)該走 localback 口,于是將 reply 包交給 lo 口(會(huì)優(yōu)先查看路由表的 0 號(hào)表,ip route show table 0 查看)。
  6. lo 收到協(xié)議棧的 reply 包后,啥都沒(méi)干,轉(zhuǎn)手又回給協(xié)議棧。
  7. 協(xié)議棧收到 reply 包之后,發(fā)現(xiàn)有 socket 在等待包,于是將包給 socket。
  8. 等待在用戶態(tài)的 ping 程序發(fā)現(xiàn) socket 返回,于是就收到 ICMP 的 reply 包。

整個(gè)過(guò)程如下圖所示:

Linux 虛擬網(wǎng)絡(luò)設(shè)備 veth-pair有什么用

03 兩個(gè) namespace 之間的連通性

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 相連”。

3.1 直接相連

直接相連是最簡(jiǎn)單的方式,如下圖,一對(duì) veth-pair 直接將兩個(gè) namespace 連接在一起。

Linux 虛擬網(wǎng)絡(luò)設(shè)備 veth-pair有什么用

給 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

3.2 通過(guò) Bridge 相連

Linux Bridge 相當(dāng)于一臺(tái)交換機(jī),可以中轉(zhuǎn)兩個(gè) namespace 的流量,我們看看 veth-pair 在其中扮演什么角色。

如下圖,兩對(duì) veth-pair 分別將兩個(gè) namespace 連到 Bridge 上。

Linux 虛擬網(wǎng)絡(luò)設(shè)備 veth-pair有什么用

同樣給 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

3.3 通過(guò) OVS 相連

OVS 是第三方開(kāi)源的 Bridge,功能比 Linux Bridge 要更強(qiáng)大,對(duì)于同樣的實(shí)驗(yàn),我們用 OVS 來(lái)看看是什么效果。

如下圖所示:

Linux 虛擬網(wǎng)絡(luò)設(shè)備 veth-pair有什么用

同樣測(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ò),可以把它分享出去讓更多的人看到。


分享標(biāo)題:Linux虛擬網(wǎng)絡(luò)設(shè)備veth-pair有什么用
網(wǎng)頁(yè)路徑:http://weahome.cn/article/ppgjjp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部