马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
netns是在linux中提供网络虚拟化的一个项目,使用netns网络空间虚拟化可以在本地虚拟化出多个网络环境,目前netns在lxc容器中被用来为容器提供网络。 使用netns创建的网络空间独立于当前系统的网络空间,其中的网络设备以及iptables规则等都是独立的,就好像进入了另外一个网络一样。 netns虚拟网络空间的网络通信依赖于物理接口,光讲听上去很虚,我们来操练点实际的看看: 1.创建虚拟网络空间: ip netns add ns1 这样我们就得到了一个名为ns1的网络空间,虚拟网络空间除了网络是虚的以外,文件系统完全和当前系统共享,也就是说所有本地可以使用的命令都可以在虚拟网络中使用,我们进入ns1看看情况: ip netns exec ns1 bash ifconfig -a ~# ifconfig -a
* z+ N" U% ], d5 ~3 O! p* x9 Z; ?lo Link encap:Local Loopback
: |$ C: G: ]1 }* J; v! N! ~/ a- \LOOPBACK MTU:16436 Metric:1$ C; a6 F: o$ \
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
1 S' ?& @3 F" L, y1 h/ FTX packets:0 errors:0 dropped:0 overruns:0 carrier:01 S; R8 `3 {0 ^: Y
collisions:0 txqueuelen:0
6 R" l! R; M7 @8 J# FRX 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
6 G; c0 z; t6 |: |' K3 r* m! Ilo Link encap:Local Loopback1 G6 J6 z& h0 N2 e" c' G
LOOPBACK MTU:16436 Metric:1
8 }: D: G6 m: Z, b, A( TRX packets:0 errors:0 dropped:0 overruns:0 frame:0: i. ]# f/ i$ V( b" x" }
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0( I5 w$ h+ @" Y
collisions:0 txqueuelen:0
5 g& R. W% d$ y1 lRX bytes:0 (0.0 B) TX bytes:0 (0.0 B) ns1-vnic Link encap:Ethernet HWaddr 92:69:39:f3:b3:be
/ l( k' c) }- l$ _( iBROADCAST MULTICAST MTU:1500 Metric:1' y' l% y4 F& K n
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
' n5 J' [' x& J$ ?% f+ TTX packets:0 errors:0 dropped:0 overruns:0 carrier:0
" H% E3 [: e+ p# wcollisions:0 txqueuelen:1000
. p9 R4 D! w9 K! `RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) 可以看到多出来了一块网卡,虽然网卡名字有点丑,不过网卡名字可以随意修改的,我们改一改: ip link set ns1-vnic name eth0- [( a8 N9 o2 H* [, q+ k
# ifconfig -a' `8 g' j* f4 ?* f! l' ?* r
eth0 Link encap:Ethernet HWaddr 92:69:39:f3:b3:be' }3 j# }4 _8 g1 S
BROADCAST MULTICAST MTU:1500 Metric:13 h0 M: m6 d- B5 V0 o
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
6 W& ]" b6 i0 P' i: I% S& l" _TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
2 G. B8 C. w6 _( U! hcollisions:0 txqueuelen:1000
7 _' W: U" r# V/ n6 k; d+ [RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) lo Link encap:Local Loopback& }% `- {& s6 |8 d. O R- Z
LOOPBACK MTU:16436 Metric:1
0 u) j, \9 o. z9 M! [ g3 P- ~0 P" R4 V- hRX packets:0 errors:0 dropped:0 overruns:0 frame:0
8 O/ G& D3 |- i2 Y# i: w6 CTX packets:0 errors:0 dropped:0 overruns:0 carrier:0
6 z) N# g: Y% U( W0 L3 ]4 o9 h- F# rcollisions:0 txqueuelen:0
6 {$ `8 \. M# U0 kRX 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 up2 h( P; U- x# @7 q
# ifconfig
9 F& |/ ]; ` \6 x1 [4 `eth0 Link encap:Ethernet HWaddr 92:69:39:f3:b3:be
- Q& S, C. ~4 n; h- g# F; `6 jinet addr:10.0.0.100 Bcast:0.0.0.0 Mask:255.255.255.0
1 w1 u; Y$ P5 eUP BROADCAST MULTICAST MTU:1500 Metric:1. }' I7 F9 V" o/ a
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
6 [/ \; f4 ^% f' RTX packets:0 errors:0 dropped:0 overruns:0 carrier:0
& I* L4 S- H6 `8 E) T: Z1 y, ucollisions:0 txqueuelen:1000
1 t8 ]7 t$ R4 q8 d4 QRX bytes:0 (0.0 B) TX bytes:0 (0.0 B) 然后我们再把回环起起来,ping一下自己感受一下: # ip link set lo up, s. n( M" [7 W
root@ubuntu:~# ping 10.0.0.100
) ]1 B8 \0 D. e, oPING 10.0.0.100 (10.0.0.100) 56(84) bytes of data.
+ {* ]3 F$ |- }& g64 bytes from 10.0.0.100: icmp_req=1 ttl=64 time=0.072 ms
7 b- ^, f% s; O/ l64 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" f& F( d$ H z% \" D
testbr Link encap:Ethernet HWaddr 6a:d1:34:5b:3c:99
# Y0 w. Q6 Y+ h _) N. P$ Finet addr:10.0.0.1 Bcast:0.0.0.0 Mask:255.255.255.0+ w& o8 O% b9 K1 T, n
inet6 addr: fe80::68d1:34ff:fe5b:3c99/64 Scope:Link
9 X: Y5 w. ~% @UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
/ B- [% S, a1 y1 p! ?. ^8 FRX packets:0 errors:0 dropped:0 overruns:0 frame:0( |0 k$ W' z! E8 D0 U
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0( f' _7 |. _* F8 j) u
collisions:0 txqueuelen:0
! m- N$ k1 n' U' \7 uRX bytes:0 (0.0 B) TX bytes:468 (468.0 B) / V+ H$ k' S- N$ c6 y- P1 I
下面来ping一下ns1中的eth0网卡ip10.0.0.100感受一下: ~# ping 10.0.0.100' V3 e, _; q# S9 y3 G
PING 10.0.0.100 (10.0.0.100) 56(84) bytes of data./ }' C+ H, J+ q5 G# J
64 bytes from 10.0.0.100: icmp_req=1 ttl=64 time=0.200 ms" J. }/ B+ ]$ l
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
( t/ `# r& ?. `PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
2 C" c2 Y3 M7 c* S7 P0 s) y64 bytes from 10.0.0.1: icmp_req=1 ttl=64 time=0.057 ms
" G) \' e+ N5 J0 K3 \64 bytes from 10.0.0.1: icmp_req=2 ttl=64 time=0.063 ms 嗷嗷!是通的! 但是现在ns1中的网络还访问不到外网,那么如何才能让ns1中的网络可以访问到外面的世界呢? 有点晚了,请听下回分解!感兴趣的同学可以这里评论留言给我,或者看博客左上方的微博地址给我at一下。:-) : {2 @8 Y% f6 g0 P
常用的namespace的命令:
+ g% b6 Q7 t: a/ H" F/ `1. 添加一个namespace sudo ip netns add [name]
0 P& c* T! `5 `& N' |0 y: t% J+ t( G; G' V$ r. s) I: \* E0 z
2. 在namespace中启用一个设备 sudo ip netns exec [name] ip link set lo up 0 j3 [9 f/ ~7 s0 v0 ~ S
) d1 Y3 A5 |0 ~. d% U4 L9 J
3. 在namespace中新加一个设备 sudo ip link set [dev-name] netns [name] 启用: sudo ip netns exec [name] ip link set [dev-name] up
/ [9 _" U6 `* d6 G: ]6 @/ K( W
' J8 i3 \- I- c/ \5 \4 B3 z6 P( e4. 查看指定namespace中指定设备的参数信息 sudo ip netns exec [name] ip addr show [dev-name] permanent scope global ( {7 `! r1 H! i% M: L% E; @$ g3 g
' R, E0 ]2 b# e1 y, {
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 n; s! |) a* z' _& {* R4 T) ?! r! E* C+ ?+ W- f* N
6.查看所有network namespace ip netns list
0 J, ~& H' d' v* r5 P7 G% Z& L! t- E0 m3 `" S/ L
7.ping虚拟机实例 ip netns exec [name] ping 192.168.1.3
7 B( E' ^' y0 j- {5 H |