Linux網(wǎng)絡(luò)命名空間

Linux 3.8內(nèi)核中包括了6種命名空間:

命名空間 描述
Mount(mnt) 隔離掛載點(diǎn)
Process ID(process) 隔離進(jìn)程ID
Network(net) 隔離網(wǎng)絡(luò)設(shè)備蚓哩、協(xié)議棧缘眶、端口等
InterProcess Communication(ipc) 隔離進(jìn)程間通信
UTS 隔離Hostname和NIS域名
User ID(user) 隔離用戶和group ID

還有一個(gè)CGroup Name Space拦坠,和上述這些命名空間是container技術(shù)的一個(gè)基礎(chǔ)坠狡。

這篇文章我們只討論Network Namespaces

1. 創(chuàng)建一個(gè)新的network namespace

$ ip netns add blue

查看新創(chuàng)建network namespace

$ ip netns list

2. 分配一個(gè)網(wǎng)絡(luò)接口給Network Namespaces

首先我們考慮一下虛擬網(wǎng)卡Veth泵三, veth很有意思咽安;它都是成對(duì)出現(xiàn)的伴网,就像一個(gè)管道的兩端,從這個(gè)管道的一端的veth進(jìn)去的數(shù)據(jù)會(huì)從另一端的veth再出來妆棒。也就是說澡腾,你可以使用veth接口把一個(gè)網(wǎng)絡(luò)命名空間連接到外部的默認(rèn)命名空間或者global命名空間,而物理網(wǎng)卡就存在這些命名空間里糕珊。
首先我們來創(chuàng)建一個(gè)veth對(duì):

$ ip link add veth0 type veth peer name veth1

這一條命令就會(huì)同時(shí)創(chuàng)建veth0和veth1兩個(gè)虛擬網(wǎng)卡动分,運(yùn)行如下命令來驗(yàn)證一下

$ ip link list

這個(gè)時(shí)候你就可以看到這一對(duì)veth接口了

4: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether be:68:5b:da:60:1d brd ff:ff:ff:ff:ff:ff
5: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether d2:70:e9:c1:31:2f brd ff:ff:ff:ff:ff:ff

這個(gè)時(shí)候這兩個(gè)網(wǎng)卡還都屬于“default”或“global”命名空間,和物理網(wǎng)卡一樣红选。
現(xiàn)在我們要把這個(gè)global namesapce連接到blue namespace澜公,做法就是把其中的一個(gè)veth轉(zhuǎn)移到blue命名空間中去,

$ ip link set veth1 netns blue 

這個(gè)時(shí)候再用命令ip link list來查看就會(huì)發(fā)現(xiàn)veth1不見了喇肋,這個(gè)時(shí)候veth1以及設(shè)置到了blue命名空間中了坟乾,運(yùn)行如下命令查看

$ ip netns exec blue ip link list

這個(gè)時(shí)候你可以看到里面有兩個(gè)網(wǎng)絡(luò)接口

  • 一個(gè)是回環(huán)網(wǎng)絡(luò)lo
  • 另一個(gè)是veth1
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
4: veth1@if5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether be:68:5b:da:60:1d brd ff:ff:ff:ff:ff:ff link-netnsid 0

3. 配置Network Namespaces里面的網(wǎng)絡(luò)接口

可以通過運(yùn)行如下命令來配置blue命名空間中的veth1接口

$ ip netns exec blue ip addr add 10.1.1.1/24 dev veth1
$ ip netns exec blue ip link set veth1 up
$ ip netns exec blue ip link set lo up

這個(gè)命令中迹辐,通過ip addr add命令給veth1分配了一個(gè)IP 地址,并且把這個(gè)網(wǎng)卡啟動(dòng)了甚侣;同時(shí)也啟動(dòng)了回環(huán)網(wǎng)卡明吩;
然后查看一下blue命名空間里面的兩個(gè)網(wǎng)卡的狀態(tài)

$ ip netns exec blue ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
11: veth1@if12: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000
    link/ether a6:41:bf:fc:8c:5e brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.1.1.1/32 scope global veth1
       valid_lft forever preferred_lft forever

同時(shí)還需要配置一下host上面對(duì)端網(wǎng)卡的ip

$ ip addr add 10.1.1.2/24 dev veth0
$ ip link set veth0 up

這個(gè)時(shí)候在blue命名空間里面ping 10.1.1.1(veth1)已經(jīng)ok了

root@ubuntu:~# ip netns exec blue ping 10.1.1.1
PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data.
64 bytes from 10.1.1.1: icmp_seq=1 ttl=64 time=0.058 ms

但是依舊ping不通10.1.1.2(veth0)
這是因?yàn)閎lue命名空間中的路由還沒有設(shè)置。

4. 設(shè)置命名空間內(nèi)的路由

通過如下命令來設(shè)置一個(gè)默認(rèn)路由

$ ip netns exec blue ip route add default via 10.1.1.1
$ ip netns exec blue ip route show
default via 10.1.1.1 dev veth1

所有找不到目的地址的數(shù)據(jù)包都通過設(shè)備veth1轉(zhuǎn)發(fā)出去殷费。
這個(gè)時(shí)候就可以成功ping通host上的veth0網(wǎng)卡了

$ip netns exec blue ping 10.1.1.2
PING 10.1.1.2 (10.1.1.2) 56(84) bytes of data.
64 bytes from 10.1.1.2: icmp_seq=1 ttl=64 time=0.086 ms

但是到了這里依舊還不夠印荔,blue命名空間中已經(jīng)可以聯(lián)通主機(jī)上的網(wǎng)絡(luò),但是依舊連不同主機(jī)以外的外部網(wǎng)絡(luò)详羡。這個(gè)時(shí)候必須在host主機(jī)上啟動(dòng)轉(zhuǎn)發(fā)仍律,并且在iptables中設(shè)置偽裝

5. 使能IP轉(zhuǎn)發(fā):IP_FORWARD

Linux系統(tǒng)的IP轉(zhuǎn)發(fā)的意思是,當(dāng)Linux主機(jī)存在多個(gè)網(wǎng)卡的時(shí)候实柠,允許一個(gè)網(wǎng)卡的數(shù)據(jù)包轉(zhuǎn)發(fā)到另外一張網(wǎng)卡水泉;在linux系統(tǒng)中默認(rèn)禁止IP轉(zhuǎn)發(fā)功能,可以打開如下文件查看主到,如果值為0說明禁止進(jìn)行IP轉(zhuǎn)發(fā)

cat /proc/sys/net/ipv4/ip_forward

運(yùn)行如下的命令茶行,其中ens160是host的一個(gè)對(duì)外網(wǎng)卡躯概,這樣的就允許ens160和veth0之間的轉(zhuǎn)發(fā)登钥;也就是說blue命名空間可以和外網(wǎng)聯(lián)通了。


#使能ip轉(zhuǎn)發(fā)

echo 1 > /proc/sys/net/ipv4/ip_forward

#刷新forward規(guī)則
iptables -F FORWARD
iptables -t nat -F

#刷新nat規(guī)則
iptables -t nat -L -n

#使能IP偽裝
iptables -t nat -A POSTROUTING -s 10.1.1.0/255.255.255.0 -o ens160 -j MASQUERADE

#允許veth0和ens160之間的轉(zhuǎn)發(fā)
iptables -A FORWARD -i ens160 -o veth0 -j ACCEPT
iptables -A FORWARD -o ens160 -i veth0 -j ACCEPT
  • 使能IP偽裝這條語句娶靡,添加了一條規(guī)則到NAT表的POSTROUTING鏈中牧牢,對(duì)于源IP地址為10.1.1.0網(wǎng)段的數(shù)據(jù)包,用ens160網(wǎng)口的IP地址替換并發(fā)送姿锭。
  • iptables -A FORWARD這兩條語句使能物理網(wǎng)口ens160和veth0之間的數(shù)據(jù)轉(zhuǎn)發(fā)

6. 演示一下整個(gè)流程

7. 完整的示例代碼

#!/bin/bash
#Create new namesapce
ip netns delete ns1
ip netns add ns1

ip link add veth0 type veth peer name veth1
ip link set veth0 netns ns1

echo "====Create New Network namespace and spcify a eth===="
ip netns list
ip netns ns exec if config -a

#Assign the IP and bring up
ip addr add 10.100.1.1/24 dev veth1
ip link set veth1 up

ip netns exec ns1 ip addr add 10.100.1.2/24 dev veth0
ip netns exec ns1 ip link set veth0 up
ip netns exec ns1 ip link set lo up

echo "====Bring up the veth0 and lo inside Namespace===="
ip netns exec ns1 ip addr show

#add route inside namespace
ip netns exec ns1 ip route add default via 10.100.1.1

echo "====Add new default rout inside the namespace===="
ip netns exec ns1 ip route show

echo "====Tryting to ping the veth1 on host===="
ip netns exec ns1 ping 10.100.1.1 -c 4

#Config the host to enable forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -P FORWARD DROP
iptables -F FORWARD

iptables -t nat -F

#enalbe masquerading of 10.100.1.0
iptables -t nat -A POSTROUTING -s 10.100.1.0/255.255.255.0 -o ens160 -j MASQUERADE

#Allow forwarding
iptables -A FORWARD -i ens160 -o veth1 -j ACCEPT
iptables -A FORWARD -o ens160 -i veth1 -j ACCEPT

echo "====Enable the forwarding of veth1 to ens160(NIC)on host ===="
echo "Show the iptables of filter"
iptables -L -n

echo "Show the iptables of nat"
iptables -t nat -L -n

參考文檔

https://coolshell.cn/articles/17010.html
https://coolshell.cn/articles/17029.html
https://segmentfault.com/a/1190000005794036
https://blogs.igalia.com/dpino/2016/04/10/network-namespaces/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末塔鳍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子呻此,更是在濱河造成了極大的恐慌轮纫,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焚鲜,死亡現(xiàn)場(chǎng)離奇詭異掌唾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)忿磅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門糯彬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人葱她,你說我怎么就攤上這事撩扒。” “怎么了吨些?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵搓谆,是天一觀的道長(zhǎng)炒辉。 經(jīng)常有香客問我,道長(zhǎng)挽拔,這世上最難降的妖魔是什么辆脸? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮螃诅,結(jié)果婚禮上啡氢,老公的妹妹穿的比我還像新娘。我一直安慰自己术裸,他們只是感情好倘是,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著袭艺,像睡著了一般搀崭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上猾编,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天瘤睹,我揣著相機(jī)與錄音阱穗,去河邊找鬼灯帮。 笑死集惋,一個(gè)胖子當(dāng)著我的面吹牛拦键,可吹牛的內(nèi)容都是我干的侨艾。 我是一名探鬼主播虏肾,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼侣灶,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼锰茉!你這毒婦竟也來了倔既?” 一聲冷哼從身側(cè)響起恕曲,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渤涌,沒想到半個(gè)月后佩谣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡实蓬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年茸俭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞳秽。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓣履,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出练俐,到底是詐尸還是另有隱情袖迎,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站燕锥,受9級(jí)特大地震影響辜贵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜归形,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一托慨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧暇榴,春花似錦厚棵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至奸例,卻和暖如春彬犯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背查吊。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工谐区, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逻卖。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓宋列,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親箭阶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子虚茶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

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

  • 簡(jiǎn)介 用簡(jiǎn)單的話來定義tcpdump戈鲁,就是:dump the traffic on a network仇参,根據(jù)使用者...
    保川閱讀 5,956評(píng)論 1 13
  • 概述 自從docker容器出現(xiàn)以來,容器的網(wǎng)絡(luò)通信就一直是大家關(guān)注的焦點(diǎn)婆殿,也是生產(chǎn)環(huán)境的迫切需求诈乒。而容器的網(wǎng)絡(luò)通信...
    糙老爺們兒吃什么櫻桃閱讀 3,621評(píng)論 1 5
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無法避免 以后資料會(huì)慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,161評(píng)論 2 33
  • 一、現(xiàn)今互聯(lián)網(wǎng)模型 1婆芦、OSI七層模型 什么是OSI七層模型怕磨? 開放系統(tǒng)互連參考模型 (Open System I...
    魏鎮(zhèn)坪閱讀 1,628評(píng)論 1 3
  • 綠松石有兩大特性,一是稀缺性消约,二是唯一性肠鲫,你找不到兩顆完全一樣的綠松石,無論是形制還是質(zhì)地或粮。對(duì)于綠松石玩家导饲,不同的...
    侯師傅貿(mào)易閱讀 411評(píng)論 0 0