linux network namespace概念相似于网络中的 VRF (virtual routing and forwarding)。可是,你不知道VRF的概念也不要紧,下面咱们经过一个简单的介绍以及 几个实验来了解。linux
linux network namespace机制能够在一个linux系统中创建多个网络命名空间。各个命名空间互相独立,内部有本身的路由表和iptable,内部的设备名和其它linux network namespace中的设备名能够重名。网络
这部分简单介绍一下network namespace的命令, 能够跳过这部分先看实验,回头再看这里。
linux network namespace的基本命令是ip。事实上不少以前的网络命令正逐渐被废弃,而采用ip命令来实现。下面是一部分以前命令和新命令的对应关系oop
ifconfig --> ip addr or just ip a ifconfig <interface> up/down --> ip link set dev <interface> up/down ifconfig <interface> <ip> netmask <netmask> --> ip addr add <ip>/<masklen> dev <interface> netstat -rn --> ip route or just ip r route add -net <net> netmask <netmask> gw <gateway> --> ip r add <net>/<netmasklen> via <gateway>
建立一个network namepsace ns01测试
[root@ES02 ~]# ip netns add ns01
展现现有的 linux network namespacespa
[root@ES02 ~]# ip netns ns01
查看一下 ns01 中的接口及状态。 在network namepsace中执行命令用 ip netns exec
[root@ES02 ~]# ip netns exec ns01 ip link 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
把loop back端口启动起来(听说不启动会有奇怪的错误。不知道为何) (确实。。不启动loopback 的话,你没办法本身ping本身。后面有详细解释)server
[root@ES02 ~]# ip netns exec ns01 ip link set dev lo up [root@ES02 ~]# ip netns exec ns01 ip link 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
建立一个虚拟interface 分配给ns01. (咱们没办法把物理 interface 分配给 ns01)接口
[root@ES02 ~]# ip link add veth-a type veth peer name veth-b [root@ES02 ~]# ip link set veth-b netns ns01 [root@ES02 ~]# ip netns exec ns01 ip addr add 10.0.0.2/24 dev veth-b [root@ES02 ~]# ip netns exec ns01 ip link set dev veth-b up
上面的操做还为接口veth-b添加了 ip 。 这里咱们为另外一个veth 添加 ip。ip
[root@ES02 ~]# ip addr add 10.0.0.1/24 dev veth-a [root@ES02 ~]# ip link set dev veth-a up
如今经过veth-a 来访问veth-b 以及相反方向,均可以成功路由
[root@ES02 ~]# ip netns exec ns01 tracepath 10.0.0.1 1: 10.0.0.2 0.090ms pmtu 1500 1: 10.0.0.1 0.030ms reached 1: 10.0.0.1 0.016ms reached Resume: pmtu 1500 hops 1 back 64 [root@ES02 ~]# [root@ES02 ~]# [root@ES02 ~]# tracepath 10.0.0.2 1: 10.0.0.1 0.130ms pmtu 1500 1: 10.0.0.2 0.055ms reached 1: 10.0.0.2 0.045ms reached Resume: pmtu 1500 hops 1 back 64
咱们有 server , client 和gateway 三个namespace。 server是10.0.0.0/24 网段, client是192.168.1.0/24 网段。 但愿client 和 server 可以经过gateway互相访问。 作法以下:
建立三个network namepsace
[root@ES02 ~]# clear [root@ES02 ~]# ip netns add server [root@ES02 ~]# ip netns add gateway [root@ES02 ~]# ip netns add client [root@ES02 ~]# [root@ES02 ~]# ip netns list client gateway server
建立两对 veth 以下
[root@ES02 ~]# ip link add svr-veth type veth peer name svrgw-veth [root@ES02 ~]# ip link add cli-veth type veth peer name cligw-veth
咱们的计划是把 svr-veth 放在server中,cli-veth放在client中。 svrgw-veth 和 cligw-veth 都放在gateway中。 这样由于 svr 的两个veth 能够构成一个通道, cli 两个veth之间也是一个通道,如今只要gateway中的两个veth可以想通,既能够实现以前的client 和 server两个network namespace互相访问。
接下来,放置veth. svr-veth 在server中 svrgw-veth 在gateway中 cligw-veth在gateway中 cli-veth在 client中。
[root@ES02 ~]# ip link set svr-veth netns server [root@ES02 ~]# ip link set svrgw-veth netns gateway [root@ES02 ~]# ip link set cligw-veth netns gateway [root@ES02 ~]# ip link set cli-veth netns client
配置各自的ip 并启动。
[root@ES02 ~]# ip netns exec server ip addr add 10.0.0.1/24 dev svr-veth [root@ES02 ~]# ip netns exec gateway ip addr add 10.0.0.254/24 dev svrgw-veth [root@ES02 ~]# ip netns exec gateway ip addr add 192.168.1.254/24 dev cligw-veth [root@ES02 ~]# ip netns exec client ip addr add 192.168.1.1/24 dev cli-veth [root@ES02 ~]# ip netns exec server ip link set dev svr-veth up [root@ES02 ~]# ip netns exec client ip link set dev cli-veth up [root@ES02 ~]# ip netns exec gateway ip link set dev cligw-veth up [root@ES02 ~]# ip netns exec gateway ip link set dev svrgw-veth up
咱们但愿gateway能起到server 和 client两个网络的桥梁的做用,其实它就是一个路由器。链接两个网段。linux 模拟路由器 须要开启ip forward 功能
[root@ES02 ~]# ip netns exec gateway sysctl net.ipv4.ip_forward=1 [root@ES02 ~]# ip netns exec gateway ip route 10.0.0.0/24 dev svrgw-veth proto kernel scope link src 10.0.0.254 192.168.1.0/24 dev cligw-veth proto kernel scope link src 192.168.1.254
能够看到gateway中的路由表已经存在。 下面在server和client中设置路由
[root@ES02 ~]# ip netns exec server ip route add 192.168.1.0/24 via 10.0.0.254 [root@ES02 ~]# ip netns exec client ip route add 10.0.0.0/24 via 192.168.1.254
如今测试
client 到 server [root@ES02 ~]# ip netns exec client ping 10.0.0.1 -I 192.168.1.1 PING 10.0.0.1 (10.0.0.1) from 192.168.1.1 : 56(84) bytes of data. 64 bytes from 10.0.0.1: icmp_seq=1 ttl=63 time=0.055 ms 64 bytes from 10.0.0.1: icmp_seq=2 ttl=63 time=0.040 ms server 到 client [root@ES02 ~]# ip netns exec server ping 192.168.1.1 -I 10.0.0.1 PING 192.168.1.1 (192.168.1.1) from 10.0.0.1 : 56(84) bytes of data. 64 bytes from 192.168.1.1: icmp_seq=1 ttl=63 time=0.060 ms client 到 client [root@ES02 ~]# ip netns exec client ping 192.168.1.1 -I 192.168.1.1 server 到 server [root@ES02 ~]# ip netns exec server ping 10.0.0.1 -I 10.0.0.1 不通
很奇怪 本身ping本身不通,并且 tracepath 也不通
[root@ES02 ~]# ip netns exec client tracepath 10.0.0.1 1: send failed Resume: pmtu 65535 You have new mail in /var/spool/mail/root [root@ES02 ~]# [root@ES02 ~]# ip netns exec server tracepath 192.168.1.1 1: send failed Resume: pmtu 65535
记得以前说过 loopback 不启动会有奇怪问题,咱们启动一下
[root@ES02 ~]# ip netns exec client ip link set lo up [root@ES02 ~]# ip netns exec server ip link set lo up [root@ES02 ~]# ip netns exec gateway ip link set lo up
果真,都ok
[root@ES02 ~]# ip netns exec client tracepath 10.0.0.1 1: 192.168.1.1 0.125ms pmtu 1500 1: 192.168.1.254 0.055ms 1: 192.168.1.254 0.033ms 2: 10.0.0.1 0.047ms reached Resume: pmtu 1500 hops 2 back 63