找回密码
 注册
查看: 3962|回复: 0

ip netns 常用的namespace的命令

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2019-6-21 15:02:12 | 显示全部楼层 |阅读模式

netns是在linux中提供网络虚拟化的一个项目,使用netns网络空间虚拟化可以在本地虚拟化出多个网络环境,目前netns在lxc容器中被用来为容器提供网络。

使用netns创建的网络空间独立于当前系统的网络空间,其中的网络设备以及iptables规则等都是独立的,就好像进入了另外一个网络一样。

netns虚拟网络空间的网络通信依赖于物理接口,光讲听上去很虚,我们来操练点实际的看看:

1.创建虚拟网络空间:

ip netns add ns1

这样我们就得到了一个名为ns1的网络空间,虚拟网络空间除了网络是虚的以外,文件系统完全和当前系统共享,也就是说所有本地可以使用的命令都可以在虚拟网络中使用,我们进入ns1看看情况:

ip netns exec ns1 bash

ifconfig -a

~# ifconfig -a8 Q7 a& Z7 s/ c' [" Y  o; C, ]
lo Link encap:Local Loopback0 Q9 P3 Q" h( }. t
LOOPBACK MTU:16436 Metric:1
% L" k+ I/ Y9 kRX packets:0 errors:0 dropped:0 overruns:0 frame:0
7 n, \9 H' [' N: xTX packets:0 errors:0 dropped:0 overruns:0 carrier:0
5 G  j3 ~2 O" k4 J4 I# n/ d6 v- Ycollisions:0 txqueuelen:0& P8 i+ R: U$ b
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 -a1 O+ z3 _0 i4 |9 j& b; ?, n9 o) w
lo Link encap:Local Loopback1 E" \) @- L4 B& X& Z
LOOPBACK MTU:16436 Metric:1
. h( x6 v) E5 N  K' E  t  U" v% eRX packets:0 errors:0 dropped:0 overruns:0 frame:0
! D: d0 \; A. QTX packets:0 errors:0 dropped:0 overruns:0 carrier:0
' e! ?4 {& c# C* L4 `# v, jcollisions:0 txqueuelen:0  `$ }' U9 K; E9 h% S9 B, h7 @' m
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

ns1-vnic Link encap:Ethernet HWaddr 92:69:39:f3:b3:be
6 A$ \: N# e. g1 uBROADCAST MULTICAST MTU:1500 Metric:1  _' M4 h- c) V* I+ E% I) n+ ?
RX packets:0 errors:0 dropped:0 overruns:0 frame:0, V# b2 g. v# Y+ ]" }
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
' x) Y% C6 {2 v) w" Qcollisions:0 txqueuelen:1000) e" U3 N  L9 _( R7 |- ~# v
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

可以看到多出来了一块网卡,虽然网卡名字有点丑,不过网卡名字可以随意修改的,我们改一改:

ip link set ns1-vnic name eth09 D3 D5 e& m$ O) ^
# ifconfig -a% f7 g$ F* ~1 o. W6 f# N
eth0 Link encap:Ethernet HWaddr 92:69:39:f3:b3:be
$ D! E: A# O* J6 b" R$ R7 J: mBROADCAST MULTICAST MTU:1500 Metric:1
6 e; `" v6 `- d$ d( {8 NRX packets:0 errors:0 dropped:0 overruns:0 frame:0# C4 \1 y0 F9 U# _2 R; O
TX packets:0 errors:0 dropped:0 overruns:0 carrier:05 C( m' m/ ?, l/ O9 f/ j' j7 H+ Q
collisions:0 txqueuelen:10001 T) _; t% B- j/ C
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

lo Link encap:Local Loopback( ~) b* i$ ^, i# X: y* M7 P
LOOPBACK MTU:16436 Metric:1
8 F' p  F5 f" W5 ^  [/ E8 N& ^RX packets:0 errors:0 dropped:0 overruns:0 frame:0
- ^- f; D. c# e7 L( U* ]0 W+ nTX packets:0 errors:0 dropped:0 overruns:0 carrier:0
+ t. U' P5 W4 G+ Ecollisions:0 txqueuelen:0( h, A0 w# }: }6 a
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
, Z" O- `3 d* B3 k) }, T% c  r# ifconfig
0 o1 G$ R. w# Q* }, C: ueth0 Link encap:Ethernet HWaddr 92:69:39:f3:b3:be
4 E! x0 O4 o4 V) ginet addr:10.0.0.100 Bcast:0.0.0.0 Mask:255.255.255.0
* t& F. `" I. X; Y9 t/ eUP BROADCAST MULTICAST MTU:1500 Metric:1
$ h% T7 h- G" v! FRX packets:0 errors:0 dropped:0 overruns:0 frame:0- u" {) n9 H9 s4 H- D
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0) ?9 {) Z4 t( O9 j5 A5 o( Q' |
collisions:0 txqueuelen:1000* T/ K8 H7 x6 a& z6 `3 A7 {  v
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

然后我们再把回环起起来,ping一下自己感受一下:

# ip link set lo up; g7 E! O7 |3 j6 p) R3 V7 @
root@ubuntu:~# ping 10.0.0.1002 i5 Z3 Z) |2 K; R& V. d9 v
PING 10.0.0.100 (10.0.0.100) 56(84) bytes of data.) u6 K$ k, s* Y6 e9 x5 J$ l% s9 N; k
64 bytes from 10.0.0.100: icmp_req=1 ttl=64 time=0.072 ms( Y2 _% \) S* F% i" |
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+ e( r) P  S$ D
testbr Link encap:Ethernet HWaddr 6a:d1:34:5b:3c:99
% p/ @2 ]: E/ O/ l& h+ q/ m, @; @inet addr:10.0.0.1 Bcast:0.0.0.0 Mask:255.255.255.0
: i6 Z' K4 t+ s' J* z/ X( F3 a* linet6 addr: fe80::68d1:34ff:fe5b:3c99/64 Scope:Link8 N3 C) r9 i  m: X  L3 r( P
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
& e  `1 G- C) u) ]( S) aRX packets:0 errors:0 dropped:0 overruns:0 frame:0
$ b! A1 t% A8 u4 U* JTX packets:6 errors:0 dropped:0 overruns:0 carrier:0( x3 Q# P7 e5 `! e
collisions:0 txqueuelen:0/ I% |0 J  ?9 i  V. ?6 \# k
RX bytes:0 (0.0 B) TX bytes:468 (468.0 B)


( i' A6 r7 v2 q/ [3 f! T1 H. p- U2 t

下面来ping一下ns1中的eth0网卡ip10.0.0.100感受一下:

~# ping 10.0.0.100( n, f3 ^' p$ A: W9 R* J
PING 10.0.0.100 (10.0.0.100) 56(84) bytes of data.9 G% @+ k$ i5 P8 e: @# c* A+ @8 X
64 bytes from 10.0.0.100: icmp_req=1 ttl=64 time=0.200 ms
9 s5 z% Y' A4 A2 T9 L5 n& v# `9 L2 e64 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* A+ D$ G0 T- B! o' ]; G3 B# F2 k. ?0 Z
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
7 W# s! h6 j" R+ R' T& D, m64 bytes from 10.0.0.1: icmp_req=1 ttl=64 time=0.057 ms
  G+ @1 U5 o, l% Z/ M+ t# k7 N  H64 bytes from 10.0.0.1: icmp_req=2 ttl=64 time=0.063 ms

嗷嗷!是通的!

但是现在ns1中的网络还访问不到外网,那么如何才能让ns1中的网络可以访问到外面的世界呢?

有点晚了,请听下回分解!感兴趣的同学可以这里评论留言给我,或者看博客左上方的微博地址给我at一下。:-)

- P0 O( q+ j) @; h0 c. F+ X" _1 {

常用的namespace的命令:

' M7 x0 S4 u% Y( A0 ^" }7 m

1. 添加一个namespace

sudo ip netns add [name]

  \% d* |; x; d+ n

1 V2 C9 e( a4 F7 Q

2. 在namespace中启用一个设备

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


) P: x0 O( F, ]; v
. g6 A1 [: b( J6 t* J+ M# [0 N

3. 在namespace中新加一个设备

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

启用:

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


6 ^  O: s/ t1 V7 o2 c; j8 ~# S. \& w8 l% b6 o8 C

4. 查看指定namespace中指定设备的参数信息

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


1 |9 U& o4 [  l2 j6 \
+ G6 h0 v* o* w4 t: m

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]  


7 s9 Y. _4 ^- P# y5 n( L! N" o0 J
$ z  s) Y' T! p/ V, R( U' l

6.查看所有network namespace

ip netns list

5 T4 C4 b1 M! M" u2 @' j

3 P  a8 d1 x4 f  p8 k9 m! o: T

7.ping虚拟机实例

ip netns exec [name] ping 192.168.1.3


/ [8 R+ S! H/ |1 A' n1 O; Q. z
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 01:24 , Processed in 0.019041 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表