linux network name space

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 命令 code

[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

實驗 2

咱們有 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
相關文章
相關標籤/搜索