Linux namespace之:network namespace

理解network namespace

network namespace用來隔離網絡環境,「在network namespace中,網絡設備、端口、套接字、網絡協議棧、路由表、防火墻規則等都是獨立的」

因network namespace中具有獨立的網絡協議棧,因此每個network namespace中都有一個lo接口,但lo接口默認未啟動,需要手動啟動起來。

#?-n或--net選項用于創建network?namespace
$?sudo?unshare?-n?/bin/bash#?默認未啟動lo
root@longshuai-vm:/home/longshuai#?ip?a
1:?lo:?<LOOPBACK>?mtu?65536?qdisc?noop?state?DOWN?group?default?qlen?1000link/loopback?00:00:00:00:00:00?brd?00:00:00:00:00:00#?將之啟動
root@longshuai-vm:/home/longshuai#?ip?link?set?lo?up
root@longshuai-vm:/home/longshuai#?ip?a
1:?lo:?<LOOPBACK,UP,LOWER_UP>?mtu?65536?qdisc?noqueue?state?UNKNOWN?group?default?qlen?1000link/loopback?00:00:00:00:00:00?brd?00:00:00:00:00:00inet?127.0.0.1/8?scope?host?lovalid_lft?forever?preferred_lft?foreverinet6?::1/128?scope?host?valid_lft?forever?preferred_lft?forever

讓某個network namespace和root network namespace或其他network namespace之間保持通信是一個非常常見的需求,這一般通過veth虛擬設備實現。veth類型的虛擬設備由一對虛擬的eth網卡設備組成,像管道一樣,一端寫入的數據總會從另一端流出,從一端讀取的數據一定來自另一端。

用戶可以將veth的其中一端放在某個network namespace中,另一端保留在root network namespace中。這樣就可以讓用戶創建的network namespace和宿主機通信。

例如:

#####?在第一個shell窗口
#?創建network?namespace?ns1
$?sudo?unshare?-n?/bin/bash#?查看該network?namespace的進程號
root@longshuai-vm:/home/longshuai#?echo?$$
53091#####?在第二個shell窗口
#?創建veth設備
$?sudo?ip?link?add?veth0?type?veth?peer?name?veth1#?創建之后,就有了一對虛擬的eth設備
$?ip?a?|?grep?veth
3:?veth1@veth0:?<BROADCAST,MULTICAST,M-DOWN>?mtu?1500?qdisc?noop?state?DOWN?group?default?qlen?1000
4:?veth0@veth1:?<BROADCAST,MULTICAST,M-DOWN>?mtu?1500?qdisc?noop?state?DOWN?group?default?qlen?1000#?veth0準備留在root?network?namespace中
#?為veth0設置IP地址并啟動
$?sudo?ip?a?add?dev?veth0?192.168.10.10/24
$?sudo?ip?link?set?veth0?up
$?ip?a?s?veth0
4:?veth0@veth1:?<NO-CARRIER,BROADCAST,MULTICAST,UP,M-DOWN>?mtu?1500?qdisc?noqueue?state?LOWERLAYERDOWN?group?default?qlen?1000link/ether?36:30:54:ba:d3:aa?brd?ff:ff:ff:ff:ff:ffinet?192.168.10.10/24?scope?global?veth0valid_lft?forever?preferred_lft?forever#?最后,將veth1移動到剛才新建的network?namespace?ns1中
#?ip?link?set?xxx?netns?[?PID|NETNS_NAME?]
$?sudo?ip?link?set?veth1?netns?53091#?注:
#?并不是所有的網絡設備都能在network?namespace之間移動,
#?ethtool?-k?<interface>輸出的結果中,netns-local為on的表示不能移動
$?ethtool?-k?lo?|?grep?netns
netns-local:?on?[fixed]
$?ethtool?-k?ens32?|?grep?netns??????
netns-local:?off?[fixed]
$?ethtool?-k?veth1?|?grep?netns?????????????????????????
netns-local:?off?[fixed]#####?在ns1中啟動veth1并設置IP地址
root@longshuai-vm:/home/longshuai#?ip?link?set?dev?veth1?uproot@longshuai-vm:/home/longshuai#?ip?a?add?dev?veth1?192.168.10.20/24root@longshuai-vm:/home/longshuai#?ip?a?s?veth1
3:?veth1@if4:?<BROADCAST,MULTICAST,UP,LOWER_UP>?mtu?1500?qdisc?noqueue?state?UP?group?default?qlen?1000link/ether?22:a8:4b:5b:55:4d?brd?ff:ff:ff:ff:ff:ff?link-netnsid?0inet?192.168.10.20/24?scope?global?veth1valid_lft?forever?preferred_lft?foreverinet6?fe80::20a8:4bff:fe5b:554d/64?scope?link?valid_lft?forever?preferred_lft?forever?#?互ping,測試兩端是否能通信,例如在ns1測試
root@longshuai-vm:/home/longshuai#?ping?192.168.10.10
PING?192.168.10.10?(192.168.10.10)?56(84)?bytes?of?data.
64?bytes?from?192.168.10.10:?icmp_seq=1?ttl=64?time=0.076?ms
64?bytes?from?192.168.10.10:?icmp_seq=2?ttl=64?time=0.189?ms

但現在ns1還不能和公網通信。解決這個問題也很簡單,在root network namespace中開啟轉發并設置SNAT,在ns1中添加默認路由即可。

#####?在root?network?namespace中執行
$?sudo?sysctl?-w?net.ipv4.ip_forward=1
$?sudo?iptables?-t?nat?-A?POSTROUTING?-o?ens32?-j?MASQUERADE#####?在network?namespace?ns1中執行
$?route?add?default?gw?192.168.10.10
$?ping?www.baidu.com
PING?www.baidu.com?(36.152.44.95)?56(84)?bytes?of?data.
64?bytes?from?36.152.44.95:?icmp_seq=1?ttl=127?time=53.4?ms
64?bytes?from?36.152.44.95:?icmp_seq=2?ttl=127?time=51.0?ms

持久化的network namespace

正常情況下,當namespace中的所有進程都退出后,namespace也會隨之銷毀。但有時候需要讓namespace即使沒有進程在其中運行也依然有效,即namespace的持久化。例如,創建了network namespace后,想要讓network namespace中的網絡配置一直生效。

實際上,無論是network namespace還是其他類型的namespace,「當通過mount bind為某個namespace的namespace文件(/proc/$$/ns/xxx)進行了bind掛載,這個namespace將成為持久化的namespace,即使namespace中的第一個進程或所有進程都退出了,namespace也不會立即銷毀,之后還可以通過nsenter重新進入該namespace」

其實方式很簡單,直接在unshare創建namespace時的對應長選項上指定一個已存在的文件即可(注:不允許在短選項上指定文件名)。

unshare:?-m,?--mount[=<file>]???unshare?mounts?namespace-u,?--uts[=<file>]?????unshare?UTS?namespace?(hostname?etc)-i,?--ipc[=<file>]?????unshare?System?V?IPC?namespace-n,?--net[=<file>]?????unshare?network?namespace-p,?--pid[=<file>]?????unshare?pid?namespace-U,?--user[=<file>]????unshare?user?namespace-C,?--cgroup[=<file>]??unshare?cgroup?namespace

例如,想要讓network namespace持久化:

#?對于network?namespace持久化,通常指定/var/run/netns/NAME作為持久化文件
$?sudo?mkdir?-p?/var/run/netns
$?sudo?touch?/var/run/netns/ns1#?也可以不在選項--net上指定文件,而是在network?namespace內部
#?將/var/run/netns/ns1通過mount?bind掛載到/proc/$$/ns/net上
$?sudo?unshare?--net=/var/run/netns/ns1?/bin/bash#?現在/var/run/netns/ns1和/proc/$$/ns/net是同一個network?namespace
root@longshuai-vm:/home/longshuai#?ls?-i?/var/run/netns/ns1?
4026532587?/var/run/netns/ns1root@longshuai-vm:/home/longshuai#?readlink?/proc/$$/ns/net
net:[4026532587]#?退出ns1
root@longshuai-vm:/home/longshuai#?exit
exit#?/var/run/netns/ns1仍然指向net?inode
$?ls?-i?/var/run/netns/ns1?
4026532587?/var/run/netns/ns1#?nsenter重新進入ns1
$?sudo?nsenter?--net=/var/run/netns/ns1?/bin/bash
root@longshuai-vm:/home/longshuai#?hostname?-I
192.168.10.20

ip netns

ip netns命令用于管理network namespace。

ip netns將network namespace與/var/run/netns/NAME相關聯,將/var/run/netns下的每一個NAME作為其所管理的每一個network namespace的名稱。

ip netns將/etc/netns/NAME/作為對應network namespace的全局網絡配置文件的目錄,查找它之后才會查找/etc/目錄。

例如,如果想要為netns名為ns1的network namespace單獨設置DNS,可創建/etc/netns/ns1/resolv.conf,并將DNS相關配置寫入該文件,當該文件不存在時才查找/etc/resolv.conf。

ip netns創建network namespace時,同時會創建mount namespace,以便將網絡相關配置文件/etc/netns/NAME/xxx掛載到對應的/etc/xxx。

  1. 「ip netns add NAME」
    創建名為NAME的network namespace,同時會關聯/var/run/netns/NAME文件,如果文件不存在,則會自動創建

    $?sudo?ip?netns?add?ns2
    $?ls?-i?/var/run/netns/ns2
    4026532759?/var/run/netns/ns2
    
  2. 「ip netns list」
    列出/var/run/netns下的所有network namespace

    #?帶有id的,表示正在運行(即有進程尚未退出)的network?namespace以及它的ID號
    #?ID會自動分配,從0開始,后面通過ip?netns命令也可以自己設置ID號
    $?ip?netns?list
    ns2
    ns1?(id:?0)
    
  3. 「ip netns attach NAME PID」
    將PID對應的network namespace關聯到/var/run/netns/NAME(不存在時會自動創建),使得該network namespace就像是被ip netns創建一樣,之后它將受ip netns管理

    #?在第一個窗口中執行
    #?使用unshare而非ip?netns創建一個network?namespace
    $?sudo?unshare?-n?/bin/bash
    root@longshuai-vm:/home/longshuai#?echo?$$
    5094#?在第二個窗口中執行
    #?現在這個network?namespace就像是由ip?netns創建一樣
    $?sudo?ip?netns?attach?ns3?5094
    
  4. 「ip [-all] netns delete [ NAME ]」
    刪除/vaer/run/netns/下指定的network namespace,如果指定了--all,則刪除/var/run/netns下所有的network namespace。注意,它同時會卸載mount bind的掛載點/var/run/netns/NAME并刪除該文件。

    $?ip?netns?list
    ns3
    ns2
    ns1?(id:?0)$?sudo?ip?netns?del?ns3
    $?ls?/var/run/netns
    ns1??ns2$?sudo?ip?--all?netns?del
    $?ls?/var/run/netns
    
  5. 「ip netns set NAME NETNSID」
    為/var/run/netns/NAME對應的network namespace設置ID號。

    $?sudo?ip?netns?add?ns1
    $?ip?netns?list
    ns1$?sudo?ip?netns?set?ns1?11
    $?ip?netns?list
    ns1?(id:?11)
    
  6. 「ip netns identify [PID]」
    根據PID,輸出該PID所在的network namespace的netns name。

    $?ip?netns?list
    ns1?(id:?11)
    $?sudo?nsenter?--net=/var/run/netns/ns1?/bin/bash
    root@longshuai-vm:/home/longshuai#?echo?$$
    5298#?在另一個窗口中查詢進程PID=5298在哪一個network?namespace中
    $?sudo?ip?netns?identify?5298
    ns1
    
  7. 「ip netns pids NAME」
    輸出networ namespace中當前正在運行的所有進程PID

    $?sudo?ip?netns?pids?ns1
    5298
    
  8. 「ip [-all] netns exec [ NAME ] cmd ...」
    在指定的network namespace中執行命令CMD。如果指定了--all選項,則CMD命令將在/var/run/netns/下的所有network namespace中都執行。

    $?sudo?ip?netns?exec?ns1?ip?link?set?lo?up
    $?sudo?ip?netns?exec?ns1?ping?www.baidu.com
    

注:如果/etc/netns/NAME下有配置文件,執行ip netns exec命令時會自動將其bind到/etc/下對應的配置文件上。此時還需注意,systemd管理的/etc/resolv.conf是一個軟鏈接,ip netns直接bind時會失敗,將其移除后再創建普通文件類型的/etc/resolv.conf才可bind成功。

$?sudo?mkdir?-p?/etc/netns/ns1
$?echo?'nameserver?8.8.8.8'?|?sudo?tee?/etc/netns/ns1/resolv.conf$?sudo?ip?netns?exec?ns1?ping?www.baidu.com
Bind?/etc/netns/ns1/resolv.conf?->?/etc/resolv.conf?failed:?No?such?file?or?directory
PING?www.baidu.com?(36.152.44.96)?56(84)?bytes?of?data.
64?bytes?from?36.152.44.96?(36.152.44.96):?icmp_seq=1?ttl=127?time=36.2?ms
64?bytes?from?36.152.44.96?(36.152.44.96):?icmp_seq=2?ttl=127?time=37.5?ms#?創建普通文件類型的/etc/resolv.conf
$?readlink?/etc/resolv.conf
../run/systemd/resolve/stub-resolv.conf
$?sudo?mv?/etc/resolv.conf{,.bak}
$?sudo?touch?/etc/resolv.conf
$?sudo?ip?netns?exec?ns1?dig?-t?A?www.baidu.com
......
;www.baidu.com.?????????????????IN??????A;;?ANSWER?SECTION:
www.baidu.com.??????????581?????IN??????CNAME???www.a.shifen.com.
www.a.shifen.com.???????51??????IN??????CNAME???www.wshifen.com.
www.wshifen.com.????????70??????IN??????A???????104.193.88.77
www.wshifen.com.????????70??????IN??????A???????104.193.88.123;;?Query?time:?215?msec
;;?SERVER:?8.8.8.8#53(8.8.8.8)??????#?已經成功使用8.8.8.8作為nameserver
;;?WHEN:?Sun?Oct?11?16:58:51?CST?2020
;;?MSG?SIZE??rcvd:?127m

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535443.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535443.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535443.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kubernetes 的原理

kubernetes 已經成為容器編排領域的王者&#xff0c;它是基于容器的集群編排引擎&#xff0c;具備擴展集群、滾動升級回滾、彈性伸縮、自動治愈、服務發現等多種特性能力。 本文將帶著大家快速了解 kubernetes &#xff0c;了解我們談論 kubernetes 都是在談論什么。 kuberne…

Zookeeper:實現“分布式鎖”的 Demo

Zookeeper 能保證數據的強一致性&#xff0c;用戶任何時候都可以相信集群中每個節點的數據都是相同的。一個用戶創建一個節點作為鎖&#xff0c;另一個用戶檢測該節點&#xff0c;如果存在&#xff0c;代表別的用戶已經鎖住&#xff0c;如果不存在&#xff0c;則可以創建一個節…

JavaIO流:案例

java.io 包下需要掌握的流有 16 個&#xff0c;本篇內容包括&#xff1a;java.io包下需要掌握的流、Java IO 案例。 文章目錄一、java.io包下需要掌握的流二、Java IO 案例1、Demo 1&#xff08;FileInputStream&#xff09;2、Demo 2&#xff08;FileInputStream&#xff09;3…

比對excel數據

#!/usr/bin/env pythonimport openpyxl from openpyxl.styles import PatternFill from openpyxl.styles import colors from openpyxl.styles import Font, Color aD:/測算單位設置/比對/吉林/tmp001.xlsx bD:/測算單位設置/比對/吉林/國網吉林電力.xlsx cD:/測算單位設置/比對…

CPU 是如何執行任務的

前言 你清楚下面這幾個問題嗎&#xff1f; 有了內存&#xff0c;為什么還需要 CPU Cache&#xff1f; CPU 是怎么讀寫數據的&#xff1f; 如何讓 CPU 能讀取數據更快一些&#xff1f; CPU 偽共享是如何發生的&#xff1f;又該如何避免&#xff1f; CPU 是如何調度任務的&a…

Ansible 的自動化運維

1、Ansible 特點 Ansible 自 2012 年發布以來&#xff0c;很快在全球流行&#xff0c;其特點如下&#xff1a; Ansible 基于 Python 開發&#xff0c;運維工程師對其二次開發相對比較容易&#xff1b; Ansible 豐富的內置模塊&#xff0c;幾乎可以滿足一切要求&#xff1b; …

Shell 信號發送與捕捉

1、Linux信號類型 信號&#xff08;Signal&#xff09;&#xff1a;信號是在軟件層次上對中斷機制的一種模擬&#xff0c;通過給一個進程發送信號&#xff0c;執行相應的處理函數。 進程可以通過三種方式來響應一個信號&#xff1a; 1&#xff09;忽略信號&#xff0c;即對信…

運維面試題總結

集群相關 簡述 ETCD 及其特點&#xff1f; etcd 是 CoreOS 團隊發起的開源項目&#xff0c;是一個管理配置信息和服務發現&#xff08;service discovery&#xff09;的項目&#xff0c;它的目標是構建一個高可用的分布式鍵值&#xff08;key-value&#xff09;數據庫&#x…

詳解設計模式:建造者模式

建造者模式&#xff08;Builder Pattern&#xff09;也叫做生成器模式&#xff0c;是 GoF 的 23 種設計模式的一種&#xff0c;它將一個復雜對象的構建與它的表示分離&#xff0c;使得同樣的構建過程可以創建不同的表示。 當我們需要實列化一個復雜的類&#xff0c;以得到不同結…

圖文并茂 VLAN 詳解,讓你看一遍就理解 VLAN

一、為什么需要VLAN 1.1、什么是VLAN? VLAN(Virtual LAN)&#xff0c;翻譯成中文是“虛擬局域網”。LAN可以是由少數幾臺家用計算機構成的網絡&#xff0c;也可以是數以百計的計算機構成的企業網絡。VLAN所指的LAN特指使用路由器分割的網絡——也就是廣播域。 在此讓我們先復習…

認識VLAN,并學會VLAN的劃分和網絡配置實例

VLAN的劃分和網絡的配置實例 1、VLAN基礎知識 VLAN&#xff08;Virtual Local Area Network&#xff09;的中文名為&#xff1a;“虛擬局域網”&#xff0c;注意和VPN&#xff08;虛擬專用網&#xff09;進行區分。 VLAN是一種將局域網設備從邏輯上劃分&#xff08;不是從物…

VLAN劃分及配置注意事項

VLAN&#xff08;Virtual Local Area Network&#xff09;即虛擬局域網&#xff0c;是將一個物理的LAN在邏輯上劃分成多個廣播域的通信技術。VLAN內的主機間可以直接通信&#xff0c;而VLAN間不能直接通信&#xff0c;從而將廣播報文限制在一個VLAN內。VLAN之間的通信是通過第3…

Docker原理剖析

一、簡介 1、了解Docker的前生LXC LXC為Linux Container的簡寫。可以提供輕量級的虛擬化&#xff0c;以便隔離進程和資源&#xff0c;而且不需要提供指令解釋機制以及全虛擬化的其他復雜性。相當于C中的NameSpace。容器有效地將由單個操作系統管理的資源劃分到孤立的組中&#…

獲取Linux內存、cpu、磁盤IO等信息

#!/bin/bash # 獲取要監控的本地服務器IP地址 IPifconfig | grep inet | grep -vE inet6|127.0.0.1 | awk {print $2} echo "IP地址&#xff1a;"$IP# 獲取cpu總核數 cpu_numgrep -c "model name" /proc/cpuinfo echo "cpu總核數&#xff1a;"$c…

Docker容器網絡解析

Docker 容器網絡的發展歷史 在 Dokcer 發布之初&#xff0c;Docker 是將網絡、管理、安全等集成在一起的&#xff0c;其中網絡模塊可以為容器提供橋接網絡、主機網絡等簡單的網絡功能。 從 1.7 版本開始&#xff0c;Docker正是把網絡和存儲這兩部分的功能都以插件化形式剝離出來…

將指定excel的一列數據提取到另一個excel的指定列

#!/usr/bin/env python import openpyxl bjD:/地市縣公司/西藏臺賬數據分析-設備臺帳分析.xlsx wb openpyxl.load_workbook (bj) get_sheets wb.sheetnames #print(get_sheets) TA01TA01 TA02TA02 TA03TA03 TE01TE01 YG201YG201 YG202YG202 YG203YG203 YG204YG204 YG205YG205…

Docker 數據管理介紹

默認容器的數據是保存在容器的可讀寫層&#xff0c;當容器被刪除時其上的數據也會丟失&#xff0c;所以為了實現數據的持久性則需要選擇一種數據持久技術來保存數據。官方提供了三種存儲方式&#xff1a;Volumes、Bind mounts和tmpfs。前面還介紹了&#xff1a;Docker 服務終端…

Docker 數據持久化的三種方案

容器中的數據可以存儲在容器層。但是將數據存放在容器層存在以下問題&#xff1a; 數據不是持久化。意思是如果容器刪除了&#xff0c;這些數據也就沒了 主機上的其它進程不方便訪問這些數據 對這些數據的I/O會經過存儲驅動&#xff0c;然后到達主機&#xff0c;引入了一層間…

Git 存儲原理及相關實現

Git 是目前最流行的版本控制系統&#xff0c;從本地開發到生產部署&#xff0c;我們每天都在使用 Git 進行我們的版本控制&#xff0c;除了日常使用的命令之外&#xff0c;如果想要對 Git 有更深一步的了解&#xff0c;那么研究下 Git 的底層存儲原理將會對理解 Git 及其使用非…

Git內部原理

Git有什么特點&#xff1f; fast&#xff0c;scalable&#xff0c;distributed revision control system&#xff08;快速&#xff0c;可擴展的分布式版本控制系統&#xff09; 幾乎所有操作都是本地執行 每一個clone都是整個生命周期的完整副本 the stupid content tracker&a…