Linux 網(wǎng)絡(luò)虛擬化(Docker 組網(wǎng)模型)

在 Linux 中很多的資源都是全局的御滩。比如進程有全局的進程 ID鸥拧,網(wǎng)絡(luò)也有全局的路由表党远。當(dāng)一臺 Linux 上跑多個進程的時候削解,如果我們要使用不同的路由策略,這些進程可能會沖突沟娱,那就需要將這個進程放在一個獨立的 namespace 里面氛驮,這樣就可以獨立配置網(wǎng)絡(luò)了。

Linux 中 namespace 的作用就是用來隔離內(nèi)核資源济似,共有 6 種不同類型的 namespace:

  • user namespace 隔離用戶權(quán)限
  • mount namespace 修改進程的文件系統(tǒng)視圖(chroot 重新掛載根節(jié)點)
  • pid namespace 保證了容器的 init 進程是以 1 號進程來啟動的
  • network namespace 網(wǎng)絡(luò)虛擬化
  • uts namespace 隔離了 hostname 和 domain
  • ipc namespace 進程間通信

network namespace 技術(shù)是實現(xiàn)網(wǎng)絡(luò)虛擬化的重要功能矫废,它可以創(chuàng)建多個隔離的網(wǎng)絡(luò)空間,這些網(wǎng)絡(luò)空間都有各自獨立的私有的網(wǎng)絡(luò)棧信息砰蠢,包括:網(wǎng)卡(Network Interface)蓖扑、回環(huán)設(shè)備(Loopback Device)、路由表(Routing Table)和 iptables 規(guī)則台舱。

關(guān)于 network namespace 的增刪改查功能已經(jīng)集成到 Linux 工具的 netns 命令中律杠,下面通過一個 demo 來演示一下 Linux Network Namespace 的功能。

[root@ ~]# ip netns add namespace-1
[root@ ~]# ip netns add namespace-2
[root@ ~]# ip netns exec namespace-1 ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

創(chuàng)建了兩個網(wǎng)絡(luò)空間竞惋,默認(rèn)情況下都只會有一個回環(huán)接口柜去,處于 DOWN 狀態(tài)。現(xiàn)在要解決一下四個問題:

僅有一個本地回環(huán)設(shè)備是無法與宿主機或外界通信的拆宛,如果想與外界通信嗓奢,就需要有網(wǎng)卡,這里扮演網(wǎng)卡角色的就是 Linux 中的虛擬設(shè)備 veth pair 對浑厚。

Veth Pair 設(shè)備的特點是:它被創(chuàng)建出來后股耽,總是以兩張?zhí)摂M網(wǎng)卡(Veth Peer)的形式成對出現(xiàn)的。并且钳幅,從其中一個網(wǎng)卡發(fā)出的數(shù)據(jù)包物蝙,可以直接出現(xiàn)在與它對應(yīng)的另一張“網(wǎng)卡”上,哪怕這兩個“網(wǎng)卡”在不同的 Network Namespace 里贡这。

當(dāng)每個 veth 設(shè)備在不同的 Network Namespace 的時候茬末,Namespace 之間就可以用這對 veth 設(shè)備來進行網(wǎng)絡(luò)通訊了,這就使得 Veth Pair 常常被用作連接不同 Network Namespace 的“網(wǎng)線”。

下面通過命令創(chuàng)建 veth pair 對丽惭,創(chuàng)建成功后可以看到击奶,他們在宿主機上就表現(xiàn)為兩張網(wǎng)卡,然后分別把兩端移動到兩個 network namespace 中责掏,并為虛擬網(wǎng)卡配置 IP柜砾。此時在兩個 network namespace 中就可以互相 ping 通。

[root@ ~]# ip link add veth0 type veth peer name veth1
[root@ ~]# ip addr
44: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 22:f7:2f:62:e6:5a brd ff:ff:ff:ff:ff:ff
45: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 5e:e4:9f:67:f0:d2 brd ff:ff:ff:ff:ff:ff

[root@ ~]# ip link set veth0 netns namespace-1
[root@ ~]# ip link set veth1 netns namespace-2

[root@iZ2zece2l8yr2f8qhrnr3lZ ~]# ip netns exec namespace-1 ifconfig veth0 172.14.0.2/24 up
[root@iZ2zece2l8yr2f8qhrnr3lZ ~]# ip netns exec namespace-2 ifconfig veth1 172.14.0.3/24 up

雖然現(xiàn)在這兩塊虛擬網(wǎng)卡可以互相通信了换衬,但是仍然是不能連接外部網(wǎng)絡(luò)的痰驱,并且和宿主機物理網(wǎng)卡也是不能通信的。要想通信有一下幾種解決方式:

  • 虛擬網(wǎng)橋(交換機)
  • NAT 網(wǎng)絡(luò)地址轉(zhuǎn)換

下面介紹第一種瞳浦,這也就是容器的主機內(nèi)組網(wǎng)模型:veth pair + bridge 的模式担映。

Linux Bridge 網(wǎng)橋是一種軟件配置,用于連結(jié)兩個或更多個不同網(wǎng)段叫潦。它的行為就像是一臺虛擬的二層網(wǎng)絡(luò)交換機蝇完,工作于透明模式(即其他機器不必關(guān)注網(wǎng)橋的存在與否)。任意的真實物理設(shè)備(例如 eth0)和虛擬設(shè)備(例如 veth tap0)都可以連接到網(wǎng)橋矗蕊。

下面演示下 bridge 網(wǎng)橋的作用短蜕,命令用的是 bridge-utils 軟件包里的 brctl 工具來管理網(wǎng)橋。首先創(chuàng)建兩個 veth pair 對傻咖,并分別將各自的一段移動到 network namespace 中朋魔,另一端插入到網(wǎng)橋上。

當(dāng)成功創(chuàng)建一個網(wǎng)橋 test-bridge 并為其配置好 IP 的時候(ip 要在同一個網(wǎng)段)卿操,會默認(rèn)在宿主機上維護一條此網(wǎng)段的路由規(guī)則(直連規(guī)則警检,二層網(wǎng)絡(luò)通信,ARP 廣播)硬纤〗庾遥可以看到任何目的地到這個網(wǎng)段 (192.168.1.0/24) 的請求都會經(jīng)過網(wǎng)橋設(shè)備轉(zhuǎn)發(fā),也就是說在宿主機上可以 ping 通筝家。

[root@ ~]# route
Destination Gateway Genmask        Flags Metric Ref  Use Iface
172.14.0.0  0.0.0.0 255.255.255.0  U     0      0    0   test-bridge

由于網(wǎng)絡(luò)空間中的路由表沒有默認(rèn)網(wǎng)關(guān)洼裤,因此無法從 172.14 范圍之外到達其他計算機。要解決這個問題溪王,需要給網(wǎng)絡(luò)名稱空間一個默認(rèn)的網(wǎng)關(guān)路由腮鞍。

[root@]# ip netns exec namespace-1 route add default gw 172.14.0.1
[root@]# ip netns exec namespace-2 route add default gw 172.14.0.1

[root@ ~]# ip netns exec namespace-1 route
Destination  Gateway  Genmask        Flags Metric Ref  Use Iface
default      gateway  0.0.0.0        UG    0      0      0 veth1
172.14.0.0   0.0.0.0  255.255.255.0  U     0      0      0 veth1  

梳理下上面所形成的一個網(wǎng)絡(luò)棧,將兩個 network namespace 和 bridge 組成了一個子網(wǎng)莹菱,bridge 上的 IP 就是這個子網(wǎng)的網(wǎng)關(guān) IP移国。network namespace 中的數(shù)據(jù)包通過 veth 設(shè)備到達 bridge,bridge 中的數(shù)據(jù)包要把數(shù)據(jù)包轉(zhuǎn)發(fā)到 eth0 上道伟,這里需要做兩個網(wǎng)絡(luò)設(shè)備接口之間的數(shù)據(jù)包轉(zhuǎn)發(fā)迹缀,用到了 Linux 協(xié)議棧里的一個常用參數(shù) ip_forward使碾。

sysctl -w net.ipv4.ip_forward=1

# filter(顯式地允許 test-bridge 和 eth0 之間的包轉(zhuǎn)發(fā))
:FORWARD DROP [0:0]
-A FORWARD -i test-bridge -o eth0 -j ACCEPT
-A FORWARD -i eth0 -o test-bridge -j ACCEPT

此時,通過一些虛擬網(wǎng)絡(luò)設(shè)備:Veth Pair 虛擬網(wǎng)卡祝懂、Bridge 網(wǎng)橋票摇、Routing Table 路由規(guī)則,解決了 network namespace 之間的通信砚蓬,以及 network namespace 與 宿主機之間的通信矢门。但是現(xiàn)在 network namespace 還無法與局域網(wǎng)、外部網(wǎng)絡(luò)通信灰蛙。

與外部網(wǎng)絡(luò)通信祟剔,就需要用到 NAT 網(wǎng)絡(luò)地址轉(zhuǎn)換技術(shù),由于網(wǎng)絡(luò)空間的 IP 地址都是私有的摩梧,經(jīng)過物理網(wǎng)絡(luò)時是不能被識別的物延,這個時候就需要對出去的包做地址偽裝,對回來的包再做目標(biāo)地址轉(zhuǎn)換障本。

所有從 namespace 內(nèi)部發(fā)出來的包教届,都要做地址偽裝,將源 IP 地址驾霜,轉(zhuǎn)換為物理網(wǎng)卡的 IP 地址。如果有多個 namespace买置,所有的 namespace 共享一個宿主機的 IP 地址粪糙,但是在 conntrack 表中,記錄下這個出去的連接忿项。

當(dāng)服務(wù)器返回結(jié)果到達宿主機時蓉冈,會根據(jù) conntrack 表中的規(guī)則,取出原來的私網(wǎng) IP轩触,通過 DNAT 將地址轉(zhuǎn)換為私網(wǎng) IP 地址寞酿,通過網(wǎng)橋 bridge 實現(xiàn)對 network namespace 的訪問。

iptables 是最常用的一種配置工具脱柱。其在 Docker伐弹、Kubernetes、Istio 網(wǎng)絡(luò)中應(yīng)用甚廣榨为,像 Docker 容器的端口映射惨好,Kubernetes Service 的工作模式,Istio 的流量接管等都是通過 iptables 來實現(xiàn)的随闺。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載日川,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末矩乐,一起剝皮案震驚了整個濱河市龄句,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖分歇,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件透葛,死亡現(xiàn)場離奇詭異,居然都是意外死亡卿樱,警方通過查閱死者的電腦和手機僚害,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來繁调,“玉大人萨蚕,你說我怎么就攤上這事√阋龋” “怎么了岳遥?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長裕寨。 經(jīng)常有香客問我浩蓉,道長,這世上最難降的妖魔是什么宾袜? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任捻艳,我火速辦了婚禮,結(jié)果婚禮上庆猫,老公的妹妹穿的比我還像新娘认轨。我一直安慰自己,他們只是感情好月培,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布嘁字。 她就那樣靜靜地躺著,像睡著了一般杉畜。 火紅的嫁衣襯著肌膚如雪纪蜒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天此叠,我揣著相機與錄音纯续,去河邊找鬼。 笑死拌蜘,一個胖子當(dāng)著我的面吹牛杆烁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播简卧,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼兔魂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了举娩?” 一聲冷哼從身側(cè)響起析校,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤构罗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后智玻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遂唧,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年吊奢,在試婚紗的時候發(fā)現(xiàn)自己被綠了盖彭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡页滚,死狀恐怖召边,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情裹驰,我是刑警寧澤隧熙,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站幻林,受9級特大地震影響贞盯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沪饺,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一躏敢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧随闽,春花似錦父丰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽攘烛。三九已至魏滚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坟漱,已是汗流浹背鼠次。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芋齿,地道東北人腥寇。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像觅捆,于是被迫代替她去往敵國和親赦役。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容