ip netns 常用的namespace的命令

netns是在linux中提供網絡虛擬化的一個項目,使用netns網絡空間虛擬化可以在本地虛擬化出多個網絡環境,目前netns在lxc容器中被用來爲容器提供網絡。

使用netns創建的網絡空間獨立於當前系統的網絡空間,其中的網絡設備以及iptables規則等都是獨立的,就好像進入了另外一個網絡一樣。

netns虛擬網絡空間的網絡通信依賴於物理接口,光講聽上去很虛,我們來操練點實際的看看:

1.創建虛擬網絡空間:

ip netns add ns1

這樣我們就得到了一個名爲ns1的網絡空間,虛擬網絡空間除了網絡是虛的以外,文件系統完全和當前系統共享,也就是說所有本地可以使用的命令都可以在虛擬網絡中使用,我們進入ns1看看情況:

ip netns exec ns1 bash

ifconfig -a

~# ifconfig -a
lo Link encap:Local Loopback
LOOPBACK MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

可以看到ns1中默認添加了一個本地迴路設備,其他神馬也沒有,下面我們退出ns1,給他添加點網卡,之所以要在外部添加網卡是因爲我們要爲後面聯通網絡做準備,

exit

ip link add name ns1-nic type veth peer name ns1-vnic

這裏我們添加了一對veth設備,veth設備是成對出現的,兩個設備之間的數據是相互貫通的,我們把ns1-vnic加入到ns1網絡空間中:

ip link set ns1-vnic netns ns1

這樣ns1-vnic就進入到ns1空間了,在本地網絡中已經無法查看到,我們重新進入ns1看看現在的情況:

ip netns exec ns1 bash

# ifconfig -a
lo Link encap:Local Loopback
LOOPBACK MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

ns1-vnic Link encap:Ethernet HWaddr 92:69:39:f3:b3:be
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

可以看到多出來了一塊網卡,雖然網卡名字有點醜,不過網卡名字可以隨意修改的,我們改一改:

ip link set ns1-vnic name eth0
# ifconfig -a
eth0 Link encap:Ethernet HWaddr 92:69:39:f3:b3:be
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

lo Link encap:Local Loopback
LOOPBACK MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

剛纔把默認的名字修改爲了eth0,下面我們給他分配一個private ip address:

ip addr add 10.0.0.100/24 dev eth0

然後把它啓動起來:

ip link set eth0 up
# ifconfig
eth0 Link encap:Ethernet HWaddr 92:69:39:f3:b3:be
inet addr:10.0.0.100 Bcast:0.0.0.0 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

然後我們再把迴環起起來,ping一下自己感受一下:

# ip link set lo up
root@ubuntu:~# ping 10.0.0.100
PING 10.0.0.100 (10.0.0.100) 56(84) bytes of data.
64 bytes from 10.0.0.100: icmp_req=1 ttl=64 time=0.072 ms
64 bytes from 10.0.0.100: icmp_req=2 ttl=64 time=0.040 ms

嗷嗷!ping自己通了!那麼我們怎麼樣讓ns1中的eth0和真實server中的網絡進行通信呢?首先讓他能和本地物理機通信,我們在物理機網絡中採用橋接的方式,把剛纔添加veth虛擬網卡的時候被拆開的一對的剩下一隻添加的網橋裏面,利用成對veth相互之間數據貫通的特性來實現網絡互通:

先退出ns1,本地添加網橋:

exit

brctl addbr testbr

brctl addif testbr ns1-nic

ip link set ns1-nic up

然後給網橋設置一個ip地址:

ip addr add 10.0.0.1/24 dev testbr

 ip link set testbr up

~# ifconfig testbr
testbr Link encap:Ethernet HWaddr 6a:d1:34:5b:3c:99
inet addr:10.0.0.1 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::68d1:34ff:fe5b:3c99/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:468 (468.0 B)

 

下面來ping一下ns1中的eth0網卡ip10.0.0.100感受一下:

~# ping 10.0.0.100
PING 10.0.0.100 (10.0.0.100) 56(84) bytes of data.
64 bytes from 10.0.0.100: icmp_req=1 ttl=64 time=0.200 ms
64 bytes from 10.0.0.100: icmp_req=2 ttl=64 time=0.042 ms

嗷嗷!又通了!

我們進入ns1往10.0.0.1來ping一下:

~# ip netns exec ns1 ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_req=1 ttl=64 time=0.057 ms
64 bytes from 10.0.0.1: icmp_req=2 ttl=64 time=0.063 ms

嗷嗷!是通的!

但是現在ns1中的網絡還訪問不到外網,那麼如何才能讓ns1中的網絡可以訪問到外面的世界呢?

有點晚了,請聽下回分解!感興趣的同學可以這裏評論留言給我,或者看博客左上方的微博地址給我at一下。:-)


常用的namespace的命令:


1. 添加一個namespace

sudo ip netns add [name]



2. 在namespace中啓用一個設備

sudo ip netns exec   [name]  ip link set lo up



3. 在namespace中新加一個設備

sudo ip link set  [dev-name]   netns  [name]

啓用:

sudo ip netns exec   [name]  ip link set [dev-name] up



4. 查看指定namespace中指定設備的參數信息

sudo ip netns exec  [name] ip addr show   [dev-name]   permanent scope global



5. 爲namespace中指定設備設置ip

sudo ip netns exec   [name]  ip -4 addr add 192.168.1.2/24 brd 192.168.1.255 scope global dev   [dev-name]  



6.查看所有network namespace

ip netns list



7.ping虛擬機實例

ip netns exec [name] ping 192.168.1.3

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章