一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Linux虛擬網(wǎng)絡(luò)設(shè)備之veth

 塞北de雪 2023-08-03 發(fā)布于江蘇

有了上一篇關(guān)于tun/tap的介紹之后,大家應(yīng)該對虛擬網(wǎng)絡(luò)設(shè)備有了一定的了解,本篇將接著介紹另一種虛擬網(wǎng)絡(luò)設(shè)備veth。

veth設(shè)備的特點

  • veth和其它的網(wǎng)絡(luò)設(shè)備都一樣,一端連接的是內(nèi)核協(xié)議棧。
  • veth設(shè)備是成對出現(xiàn)的,另一端兩個設(shè)備彼此相連
  • 一個設(shè)備收到協(xié)議棧的數(shù)據(jù)發(fā)送請求后,會將數(shù)據(jù)發(fā)送到另一個設(shè)備上去。

下面這張關(guān)系圖很清楚的說明了veth設(shè)備的特點:

+----------------------------------------------------------------+
|                                                                |
|       +------------------------------------------------+       |
|       |             Newwork Protocol Stack             |       |
|       +------------------------------------------------+       |
|              ↑               ↑               ↑                 |
|..............|...............|...............|.................|
|              ↓               ↓               ↓                 |
|        +----------+    +-----------+   +-----------+           |
|        |   eth0   |    |   veth0   |   |   veth1   |           |
|        +----------+    +-----------+   +-----------+           |
|192.168.1.11  ↑               ↑               ↑                 |
|              |               +---------------+                 |
|              |         192.168.2.11     192.168.2.1            |
+--------------|-------------------------------------------------+
               ↓
         Physical Network

上圖中,我們給物理網(wǎng)卡eth0配置的IP為192.168.1.11, 而veth0和veth1的IP分別是192.168.2.11和192.168.2.1。

示例

我們通過示例的方式來一步一步的看看veth設(shè)備的特點。

只給一個veth設(shè)備配置IP

先通過ip link命令添加veth0和veth1,然后配置veth0的IP,并將兩個設(shè)備都啟動起來

dev@debian:~$ sudo ip link add veth0 type veth peer name veth1
dev@debian:~$ sudo ip addr add 192.168.2.11/24 dev veth0
dev@debian:~$ sudo ip link set veth0 up
dev@debian:~$ sudo ip link set veth1 up

這里不給veth1設(shè)備配置IP的原因就是想看看在veth1沒有IP的情況下,veth0收到協(xié)議棧的數(shù)據(jù)后會不會轉(zhuǎn)發(fā)給veth1。

ping一下192.168.2.1,由于veth1還沒配置IP,所以肯定不通

dev@debian:~$ ping -c 4 192.168.2.1
PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data.
From 192.168.2.11 icmp_seq=1 Destination Host Unreachable
From 192.168.2.11 icmp_seq=2 Destination Host Unreachable
From 192.168.2.11 icmp_seq=3 Destination Host Unreachable
From 192.168.2.11 icmp_seq=4 Destination Host Unreachable

--- 192.168.2.1 ping statistics ---
4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3015ms
pipe 3

但為什么ping不通呢?是到哪一步失敗的呢?

先看看抓包的情況,從下面的輸出可以看出,veth0和veth1收到了同樣的ARP請求包,但沒有看到ARP應(yīng)答包:

dev@debian:~$ sudo tcpdump -n -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
20:20:18.285230 ARP, Request who-has 192.168.2.1 tell 192.168.2.11, length 28
20:20:19.282018 ARP, Request who-has 192.168.2.1 tell 192.168.2.11, length 28
20:20:20.282038 ARP, Request who-has 192.168.2.1 tell 192.168.2.11, length 28
20:20:21.300320 ARP, Request who-has 192.168.2.1 tell 192.168.2.11, length 28
20:20:22.298783 ARP, Request who-has 192.168.2.1 tell 192.168.2.11, length 28
20:20:23.298923 ARP, Request who-has 192.168.2.1 tell 192.168.2.11, length 28

dev@debian:~$ sudo tcpdump -n -i veth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth1, link-type EN10MB (Ethernet), capture size 262144 bytes
20:20:48.570459 ARP, Request who-has 192.168.2.1 tell 192.168.2.11, length 28
20:20:49.570012 ARP, Request who-has 192.168.2.1 tell 192.168.2.11, length 28
20:20:50.570023 ARP, Request who-has 192.168.2.1 tell 192.168.2.11, length 28
20:20:51.570023 ARP, Request who-has 192.168.2.1 tell 192.168.2.11, length 28
20:20:52.569988 ARP, Request who-has 192.168.2.1 tell 192.168.2.11, length 28
20:20:53.570833 ARP, Request who-has 192.168.2.1 tell 192.168.2.11, length 28

為什么會這樣呢?了解ping背后發(fā)生的事情后就明白了:

  1. ping進程構(gòu)造ICMP echo請求包,并通過socket發(fā)給協(xié)議棧,
  2. 協(xié)議棧根據(jù)目的IP地址和系統(tǒng)路由表,知道去192.168.2.1的數(shù)據(jù)包應(yīng)該要由192.168.2.11口出去
  3. 由于是第一次訪問192.168.2.1,且目的IP和本地IP在同一個網(wǎng)段,所以協(xié)議棧會先發(fā)送ARP出去,詢問192.168.2.1的mac地址
  4. 協(xié)議棧將ARP包交給veth0,讓它發(fā)出去
  5. 由于veth0的另一端連的是veth1,所以ARP請求包就轉(zhuǎn)發(fā)給了veth1
  6. veth1收到ARP包后,轉(zhuǎn)交給另一端的協(xié)議棧
  7. 協(xié)議棧一看自己的設(shè)備列表,發(fā)現(xiàn)本地沒有192.168.2.1這個IP,于是就丟棄了該ARP請求包,這就是為什么只能看到ARP請求包,看不到應(yīng)答包的原因

給兩個veth設(shè)備都配置IP

給veth1也配置上IP

dev@debian:~$ sudo ip addr add 192.168.2.1/24 dev veth1

再ping 192.168.2.1成功(由于192.168.2.1是本地IP,所以默認會走lo設(shè)備,為了避免這種情況,這里使用ping命令帶上了-I參數(shù),指定數(shù)據(jù)包走指定設(shè)備)

dev@debian:~$ ping -c 4 192.168.2.1 -I veth0
PING 192.168.2.1 (192.168.2.1) from 192.168.2.11 veth0: 56(84) bytes of data.
64 bytes from 192.168.2.1: icmp_seq=1 ttl=64 time=0.032 ms
64 bytes from 192.168.2.1: icmp_seq=2 ttl=64 time=0.048 ms
64 bytes from 192.168.2.1: icmp_seq=3 ttl=64 time=0.055 ms
64 bytes from 192.168.2.1: icmp_seq=4 ttl=64 time=0.050 ms

--- 192.168.2.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 0.032/0.046/0.055/0.009 ms
注意:對于非debian系統(tǒng),這里有可能ping不通,主要是因為內(nèi)核中的一些ARP相關(guān)配置導(dǎo)致veth1不返回ARP應(yīng)答包,如ubuntu上就會出現(xiàn)這種情況,解決辦法如下:
root@ubuntu:~# echo 1 > /proc/sys/net/ipv4/conf/veth1/accept_local
root@ubuntu:~# echo 1 > /proc/sys/net/ipv4/conf/veth0/accept_local
root@ubuntu:~# echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
root@ubuntu:~# echo 0 > /proc/sys/net/ipv4/conf/veth0/rp_filter
root@ubuntu:~# echo 0 > /proc/sys/net/ipv4/conf/veth1/rp_filter

再來看看抓包情況,我們在veth0和veth1上都看到了ICMP echo的請求包,但為什么沒有應(yīng)答包呢?上面不是顯示ping進程已經(jīng)成功收到了應(yīng)答包嗎?

dev@debian:~$ sudo tcpdump -n -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
20:23:43.113062 IP 192.168.2.11 > 192.168.2.1: ICMP echo request, id 24169, seq 1, length 64
20:23:44.112078 IP 192.168.2.11 
> 192.168.2.1: ICMP echo request, id 24169, seq 2, length 64
20:23:45.111091 IP 192.168.2.11 > 192.168.2.1: ICMP echo request, id 24169, seq 3, length 64
20:23:46.110082 IP 192.168.2.11 > 192.168.2.1: ICMP echo request, id 24169, seq 4, length 64


dev@debian:~$ sudo tcpdump -n -i veth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth1, link-type EN10MB (Ethernet), capture size 262144 bytes
20:24:12.221372 IP 192.168.2.11 > 192.168.2.1: ICMP echo request, id 24174, seq 1, length 64
20:24:13.222089 IP 192.168.2.11 > 192.168.2.1: ICMP echo request, id 24174, seq 2, length 64
20:24:14.224836 IP 192.168.2.11 > 192.168.2.1: ICMP echo request, id 24174, seq 3, length 64
20:24:15.223826 IP 192.168.2.11 > 192.168.2.1: ICMP echo request, id 24174, seq 4, length 64

看看數(shù)據(jù)包的流程就明白了:

  1. ping進程構(gòu)造ICMP echo請求包,并通過socket發(fā)給協(xié)議棧,
  2. 由于ping程序指定了走veth0,并且本地ARP緩存里面已經(jīng)有了相關(guān)記錄,所以不用再發(fā)送ARP出去,協(xié)議棧就直接將該數(shù)據(jù)包交給了veth0
  3. 由于veth0的另一端連的是veth1,所以ICMP echo請求包就轉(zhuǎn)發(fā)給了veth1
  4. veth1收到ICMP echo請求包后,轉(zhuǎn)交給另一端的協(xié)議棧
  5. 協(xié)議棧一看自己的設(shè)備列表,發(fā)現(xiàn)本地有192.168.2.1這個IP,于是構(gòu)造ICMP echo應(yīng)答包,準備返回
  6. 協(xié)議棧查看自己的路由表,發(fā)現(xiàn)回給192.168.2.11的數(shù)據(jù)包應(yīng)該走lo口,于是將應(yīng)答包交給lo設(shè)備
  7. lo接到協(xié)議棧的應(yīng)答包后,啥都沒干,轉(zhuǎn)手又把數(shù)據(jù)包還給了協(xié)議棧(相當于協(xié)議棧通過發(fā)送流程把數(shù)據(jù)包給lo,然后lo再將數(shù)據(jù)包交給協(xié)議棧的接收流程)
  8. 協(xié)議棧收到應(yīng)答包后,發(fā)現(xiàn)有socket需要該包,于是交給了相應(yīng)的socket
  9. 這個socket正好是ping進程創(chuàng)建的socket,于是ping進程收到了應(yīng)答包

抓一下lo設(shè)備上的數(shù)據(jù),發(fā)現(xiàn)應(yīng)答包確實是從lo口回來的:

dev@debian:~$ sudo tcpdump -n -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
20:25:49.590273 IP 192.168.2.1 > 192.168.2.11: ICMP echo reply, id 24177, seq 1, length 64
20:25:50.590018 IP 192.168.2.1 > 192.168.2.11: ICMP echo reply, id 24177, seq 2, length 64
20:25:51.590027 IP 192.168.2.1 > 192.168.2.11: ICMP echo reply, id 24177, seq 3, length 64
20:25:52.590030 IP 192.168.2.1 > 192.168.2.11: ICMP echo reply, id 24177, seq 4, length 64

試著ping下其它的IP

ping 192.168.2.0/24網(wǎng)段的其它IP失敗,ping一個公網(wǎng)的IP也失?。?/p>

dev@debian:~$ ping -c 1 -I veth0 192.168.2.2
PING 192.168.2.2 (192.168.2.2) from 192.168.2.11 veth0: 56(84) bytes of data.
From 192.168.2.11 icmp_seq=1 Destination Host Unreachable

--- 192.168.2.2 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

dev@debian:~$ ping -c 1 -I veth0 baidu.com
PING baidu.com (111.13.101.208) from 192.168.2.11 veth0: 56(84) bytes of data.
From 192.168.2.11 icmp_seq=1 Destination Host Unreachable

--- baidu.com ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

從抓包來看,和上面第一種veth1沒有配置IP的情況是一樣的,ARP請求沒人處理

dev@debian:~$ sudo tcpdump -i veth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth1, link-type EN10MB (Ethernet), capture size 262144 bytes
02:25:23.223947 ARP, Request who-has 192.168.2.2 tell 192.168.2.11, length 28
02:25:24.224352 ARP, Request who-has 192.168.2.2 tell 192.168.2.11, length 28
02:25:25.223471 ARP, Request who-has 192.168.2.2 tell 192.168.2.11, length 28
02:25:27.946539 ARP, Request who-has 123.125.114.144 tell 192.168.2.11, length 28
02:25:28.946633 ARP, Request who-has 123.125.114.144 tell 192.168.2.11, length 28
02:25:29.948055 ARP, Request who-has 123.125.114.144 tell 192.168.2.11, length 28

結(jié)束語

從上面的介紹中可以看出,從veth0設(shè)備出去的數(shù)據(jù)包,會轉(zhuǎn)發(fā)到veth1上,如果目的地址是veth1的IP的話,就能被協(xié)議棧處理,否則連ARP那關(guān)都過不了,IP forward啥的都用不上,所以不借助其它虛擬設(shè)備的話,這樣的數(shù)據(jù)包只能在本地協(xié)議棧里面打轉(zhuǎn)轉(zhuǎn),沒法走到eth0上去,即沒法發(fā)送到外面的網(wǎng)絡(luò)中去。

下一篇將介紹Linux下的網(wǎng)橋,到時候veth設(shè)備就有用武之地了。

參考

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    丰满人妻熟妇乱又乱精品古代| 一区二区三区精品人妻| 91天堂素人精品系列全集| 国产不卡的视频在线观看| 日本特黄特色大片免费观看| 日韩中文字幕视频在线高清版 | 日韩中文无线码在线视频| 好吊视频一区二区在线| 国产精品流白浆无遮挡| 日本高清不卡一二三区| 国内午夜精品视频在线观看| 又大又长又粗又黄国产| 国产在线日韩精品欧美| 国产爆操白丝美女在线观看| 国产色一区二区三区精品视频 | 日本免费熟女一区二区三区 | 久久精品a毛片看国产成人| 四季av一区二区播放| 中文字幕中文字幕在线十八区| 日本在线 一区 二区| 国产日产欧美精品视频| 中文字幕亚洲精品乱码加勒比| 欧美日本精品视频在线观看| 亚洲国产综合久久天堂| 视频一区二区三区自拍偷| 欧美国产极品一区二区| 中文字幕一区二区三区中文| 欧美午夜不卡在线观看| 国产精品欧美一区二区三区| 在线免费观看一二区视频| 熟女白浆精品一区二区| 亚洲午夜精品视频在线| 久久99爱爱视频视频| 国产欧美日产中文一区| 欧洲一区二区三区自拍天堂| 国产亚洲欧美日韩精品一区| 国产在线一区中文字幕| 国产一区二区三区草莓av| 熟女中文字幕一区二区三区| 中文字幕欧美精品人妻一区| 丝袜美女诱惑在线观看|