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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM