1. 程式人生 > 其它 >Linux網路名稱空間

Linux網路名稱空間

名稱空間(Linux namespace)是linux核心針對實現虛擬化引入的一個特性。建立的每個程序都有自己的名稱空間,執行在其中的程序都像是在獨立的作業系統中執行一樣,名稱空間保證了程序之間互不影響。 名稱空間提供了一種不同的解決方案,只使用一個核心在一臺物理計算機上運作,所有全域性資源都通過名稱空間抽象起來。這使得可以將一組程序放置到一個名稱空間中,各個名稱空間彼此隔離。 Linux核心提供了6種名稱空間:
名稱空間 描述 作用
程序名稱空間 隔離程序ID inux通過名稱空間管理程序號,同一個程序,在不同的名稱空間程序號不同 程序名稱空間是一個父子結構,子空間對於父空間可見
網路名稱空間 隔離網路裝置、協議棧、埠等 通過網路名稱空間,實現網路隔離,將不同名稱空間的網路裝置連線到一起
IPC名稱空間 隔離程序間通訊 程序間互動方法 PID名稱空間和IPC名稱空間可以組合起來用,同一個IPC名字空間內的程序可以彼此看見,允許進行互動,不同空間程序無法互動
掛載名稱空間 隔離掛載點,隔離檔案目錄 程序執行時可以將掛載點與系統分離,使用這個功能時,我們可以達到 chroot 的功能,而在安全性方面比 chroot 更高
UTS名稱空間 隔離Hostname和NIS域名 擁有獨立的主機名和域名,目的是獨立出主機名和網路資訊服務(NIS)
使用者名稱空間 隔離使用者和group ID 每個名稱空間內上的使用者跟宿主主機上不在一個名稱空間 同進程 ID 一樣,使用者 ID 和組 ID 在名稱空間內外是不一樣的,並且在不同名稱空間內可以存在相同的 ID
下面主要介紹Linux網路名稱空間。

網路名稱空間

在 Linux 中,網路名字空間可以被認為是隔離的擁有單獨網路棧(網絡卡、路由轉發表、iptables)的環境。網路名字空間經常用來隔離網路裝置和服務,只有擁有同樣網路名字空間的裝置,才能看到彼此。
  • 從邏輯上說,網路名稱空間是網路棧的副本,有自己的網路裝置、路由選擇表、鄰接表、Netfilter表、網路套接字、網路procfs條目、網路sysfs條目和其他網路資源。
  • 從系統的角度來看,當通過clone()系統呼叫建立新程序時,傳遞標誌CLONE_NEWNET將在新程序中建立一個全新的網路名稱空間。
  • 從使用者的角度來看,我們只需使用工具ip(package is iproute2)來建立一個新的持久網路名稱空間。
檢視存在的網路名稱空間 檢視是否存在名稱空間,若報錯,需要更新系統核心,以及 ip 工具程式。
[root@localhost ~]# ip netns ls
新增網路名稱空間
[root@localhost ~]# ip netns add test1
列出網絡卡所有,其中ens18和ens19為物理網絡卡
[root@localhost ~]# ip link list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 6a:b4:3c:52:ac:44 brd ff:ff:ff:ff:ff:ff
3: ens19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 66:4a:9f:f6:51:16 brd ff:ff:ff:ff:ff:ff
建立新的虛擬網絡卡 同時建立veth0和veth1兩個虛擬網絡卡,這個時候這兩個網絡卡還都屬於“default”或“global”名稱空間,和物理網絡卡一樣。
[root@localhost ~]# ip link add veth0 type veth peer name veth1
[root@localhost ~]# ip link list 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 6a:b4:3c:52:ac:44 brd ff:ff:ff:ff:ff:ff
3: ens19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 66:4a:9f:f6:51:16 brd ff:ff:ff:ff:ff:ff
4: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether ba:f1:e3:75:a8:c4 brd ff:ff:ff:ff:ff:ff
5: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 52:83:c8:40:04:6f brd ff:ff:ff:ff:ff:ff
把其中一個網絡卡轉移到網路名稱空間中
ip link set veth1 netns test1
啟用網路名稱空間中的網絡卡及配置IP地址
[root@localhost ~]# ip link set veth1 netns test1
[root@localhost ~]# ip netns exec test1 ip link set lo up
[root@localhost ~]# ip netns exec test1 ip link set veth1 up
[root@localhost ~]# ip netns exec test1 ip addr add 1.1.1.1/24 dev veth1
[root@localhost ~]# ip netns exec test1 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
4: veth1@if5: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000
    link/ether ba:f1:e3:75:a8:c4 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 1.1.1.1/24 scope global veth1
       valid_lft forever preferred_lft forever
宿主機虛擬網絡卡配置IP地址並測試網路通訊
# 宿主機配置IP地址並測試網路
[root@localhost ~]# ip link set veth0 up
[root@localhost ~]# ip addr add 1.1.1.2/24 dev veth0
[root@localhost ~]# ping 1.1.1.1 -c 1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=64 time=0.100 ms

--- 1.1.1.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.100/0.100/0.100/0.000 ms
# 在網路名稱空間test1中ping宿主機上的IP地址
[root@localhost ~]# ip netns exec test1 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
4: veth1@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether ba:f1:e3:75:a8:c4 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 1.1.1.1/24 scope global veth1
       valid_lft forever preferred_lft forever
    inet6 fe80::b8f1:e3ff:fe75:a8c4/64 scope link 
       valid_lft forever preferred_lft forever
[root@localhost ~]# ip netns exec test1 ping -c 1 1.1.1.2
PING 1.1.1.2 (1.1.1.2) 56(84) bytes of data.
64 bytes from 1.1.1.2: icmp_seq=1 ttl=64 time=0.088 ms

--- 1.1.1.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.088/0.088/0.088/0.000 ms
跨主機訪問網路名稱空間中的網路 為了讓另一個主機可以訪問本主機上的某個網路名稱空間中定義的IP地址,可以將宿主機的物理網絡卡和虛擬網絡卡做橋接,這樣就可以和虛擬網絡卡通訊。
# 新增網路名稱空間
ip netns add test1
# 新增虛擬網絡卡
ip link set veth1 netns test1
# 將網絡卡新增到網路名稱空間中並激活網絡卡
ip link set veth1 netns test1
ip netns exec test1 ip link set lo up
ip netns exec test1 ip link set veth1 up
ip netns exec test1 ip addr add 1.1.1.1/24 dev veth1
# 在宿主機新增橋接網路並將宿主機物理網絡卡和虛擬網絡卡新增到橋接中
ip link add vmbr0 type bridge
ip link set vmbr0 up
ip link set ens19 master vmbr0
ip link set veth0 master vmbr0
# 另一個主機訪問網路名稱空間中的IP地址
ping 1.1.1.1