Linux Namespace : Network

来源:https://www.cnblogs.com/jobbible/archive/2020/05/04/12828017.html
-Advertisement-
Play Games

Network namespace 在邏輯上是網路堆棧的一個副本,它有自己的路由、防火牆規則和網路設備。預設情況下,子進程繼承其父進程的 network namespace。也就是說,如果不顯式創建新的 network namespace,所有進程都從 init 進程繼承相同的預設 network ...


Network namespace 在邏輯上是網路堆棧的一個副本,它有自己的路由、防火牆規則和網路設備。預設情況下,子進程繼承其父進程的 network namespace。也就是說,如果不顯式創建新的 network namespace,所有進程都從 init 進程繼承相同的預設 network namespace。

每個新創建的 network namespace 預設有一個本地環回介面 lo,除此之外,所有的其他網路設備(物理/虛擬網路介面,網橋等)只能屬於一個 network namespace。每個 socket 也只能屬於一個 network namespace。

說明:本文的演示環境為 ubuntu 16.04。

ip netns 命令
ip netns 命令用來管理 network namespace。本文將使用 ip netns 命令來創建和操作 network namespace。有關 ip netns 命令的詳細介紹請參考筆者的博文《Linux ip netns 命令》。

創建 network namespace

我們先查一下看預設的 network namespace 的 ID:

$ readlink /proc/$$/ns/net

然後通過 ip netns add 命令創建名為 mynet 的 network namespace:

$ sudo ip netns add mynet

從上圖可以看出,在名為 mynet 的 network namespace 創建成功後,/var/run/netns 目錄下多了一個名為 mynet 文件。ip netns exec 子命令可以在對應的 network namespace 中執行命令,下麵我們就通過它在 mynet network namespace 中創建一個 bash 進程,並查看 network namespace 的 ID:

$ sudo ip netns exec mynet bash
# readlink /proc/$$/ns/net

這是一個完全不同的 network namespace ID,說明當前的 bash 進程運行在一個隔離的 network 環境中。接下來讓我們看看新的 network namespace 中都有什麼:

# ip addr

每個新創建的 network namespace 預設有一個本地環回介面 lo,並且這個介面是處於關閉狀態的。下麵我們就啟動這個介面:

# ip link set lo up

啟動 lo 介面後我們可以看到其 IP 地址,並且能夠正確的響應 ping 命令。

在兩個 network namespace 之間通信

network namespace 之間是相互隔離的,我們可以使用 veth 設備把兩個 network namespace 連接起來進行通信。veth 設備是虛擬的乙太網設備。它們可以充當 network namespace 之間的通道,也可以作為獨立的網路設備使用。veth 設備總是被成對的創建,並且這一對設備總是連接在一起的,所以一般把稱之為 veth pair。需要註意的是,veth pair 無法單獨存在,刪除其中一個,另一個也會自動消失。接下來的示例我們就演示如何使用 veth pair 在兩個 network namespace 直接通信。示例中我們使用 ip link 命令來創建和管理 veth pair。

第一步,先創建兩個 network namespace net0 和 net1

$ sudo ip netns add net0
$ sudo ip netns add net1

第二步,創建一對命名的 veth 設備
預設情況下會自動為 veth pair 生成名稱,這裡為了易於辨識,我們在創建時指定 veth pair 的名稱:

$ sudo ip link add vethmother type veth peer name vethfather

如圖所示,veth pair 在主機上表現為兩個網卡。

第三步,把這一對 veth pair 分別放到 network namespace net0 和 net1中

$ sudo ip link set vethmother netns net0
$ sudo ip link set vethfather netns net1
$ sudo ip netns exec net0 ip addr
$ sudo ip netns exec net1 ip addr

查看 net0 和 net1 中的網路資源,發現各自多了一個網卡,也就是 veth 設備的兩個端點。註意,當我們把 veth pair 分配到 network namespace 中後,在主機上就看不到它們了:

此時主機的網卡中已經看不到剛纔的 veth pair 身影了。

第四步,給這些 veth pair 分配 IP 並啟用它們

$ sudo ip netns exec net0 ip link set vethmother up
$ sudo ip netns exec net0 ip addr add 10.0.1.1/24 dev vethmother
$ sudo ip netns exec net0 ip route

$ sudo ip netns exec net1 ip link set vethfather up
$ sudo ip netns exec net1 ip addr add 10.0.1.2/24 dev vethfather
$ sudo ip netns exec net1 ip route

下麵通過 ping 命令來驗證兩個 network namespace 是否可以通信:

$ sudo ip netns exec net0 ping -c 3 10.0.1.2

至此,我們構建了一個如下結構的虛擬網路:

通過 bridge 連接 network namespace

雖然 veth pair 可以實現兩個 network namespace 之間的通信,但是當需要在多個 network namespace 之間通信的時候,光靠 veth pair 就不行了。我們可以使用 Linux 提供的虛擬交換機,來完成這樣的功能。下麵的示例演示如何通過虛擬交換機(這裡就是一個虛擬網橋)連接多個 network namespace。

第一步,先添加一個叫 mybridge0 的網橋

$ sudo ip link add mybridge0 type bridge
$ sudo ip link set dev mybridge0 up
$ sudo ip addr

對主機來說其實就是新添加了一個網路介面(network interface):

第二步,創建 network namespace 和 veth 設備
創建 network namespace net0:

$ sudo ip netns add net0

創建 veth 設備:

$ sudo ip link add veth0 type veth peer name veth0p 

把其中的一個 veth 放置到 net0 中,設置 IP 並啟動它:

$ sudo ip link set dev veth0p netns net0
$ sudo ip netns exec net0 ip link set dev veth0p name eth0
$ sudo ip netns exec net0 ip addr add 10.0.1.1/24 dev eth0
$ sudo ip netns exec net0 ip link set dev eth0 up
$ sudo ip netns exec net0 ip addr

上圖顯示 network namespace net0 中的 eth0 網卡已經啟動了。下麵把 veth 設備的另一端連接到網橋 mybridge0 上:

$ sudo ip link set dev veth0 master mybridge0
$ sudo ip link set dev veth0 up

第三步,重覆第二步創建 net1 和 net2,並連接到網橋
給 mybridge0 設置 IP:

$ sudo ip link set dev mybridge0 down
$ sudo ip addr add 10.0.1.0/24 dev mybridge0
$ sudo ip link set dev mybridge0 up
$ ip addr

通過 bridge link 命令查看網橋的信息如下:

這時就可以在不同的 network namespace 之間通信了:

$ sudo ip netns exec net0 ping -c 3 10.0.1.3

我們創建的網路拓撲結構如下所示:

總結

通過 network namespace 可以創建相互獨立的網路棧,從而實現網路的隔離。本文只是簡單的介紹了 network namespace 的創建以及如何在 network namespace 之間通信,其中 network namespace 之間通過 bridge 通信的方式已經與 docker 網路的 bridge 模式非常類似了。

參考:
Network namespace man page
Linux Namespace系列(06):network namespace (CLONE_NEWNET)
Network namespace 簡介


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、深拷貝 --> 克隆一份,修改拷貝後的內容不對原對象內容產生影響 拷貝後修改序列中元素內容,註意:被修改的元素不能為一個序列中的某個值 a = [["北京多測師","成都多測師"],"上海多測師","深圳多測師","廣州多測師"] b = a.copy() b[1] = "天津多測師" prin ...
  • 本篇博客接著講解機器視覺的有關技術和知識。包括寬度測量,缺陷檢測,醫學處理。 一:寬度測量 在傳統的自動化生產中,對於尺寸的測量,典型的方法就是千分尺、游標卡尺、塞尺等。而這些測量手段測量精度低、速度慢,無法滿足大規模的自動化生產需求。基於機器視覺的尺寸測量屬於非接觸式的測量,具有檢測精度高、速度快 ...
  • 25. K 個一組翻轉鏈表 題目來源: "https://leetcode cn.com/problems/reverse nodes in k group" 題目 給你一個鏈表,每 k 個節點一組進行翻轉,請你返回翻轉後的鏈表。 k 是一個正整數,它的值小於或等於鏈表的長度。 如果節點總數不是 k ...
  • 1、命令行的開始 首先介紹幾個常用到的命令 dotnet --info :查看電腦上環境。 dotnet new --list:查看腳手架模板列表 dotnet new console -n newHelloworld:創建一個名為newHelloworld的控制台程式 dotnet build:切 ...
  • 上一章分析了WPF元素的內部工作元素——允許每個元素插入到WPF佈局系統的MeasureOverride()和ArrangeOverride()方法中。本章將進一步深入分析和研究元素如何渲染自身。 大多數WPF元素通過組合方式創建可視化外觀。換句話說,典型的元素通過其他更基礎的元素進行構建。例如,使 ...
  • 這個例子來自書上。 記錄過程。 主要是數學上極坐標,WPF中的測量過程 簡單來說在一個具有固定軸的坐標系內,一個由原點射出的向量並與固定軸有一定角度且在向量上確定長度的這麼個東西。 可以參考: 知乎https://www.zhihu.com/question/318613418/answer/640 ...
  • 一、首先去https://www.docker.com/products/docker-desktop下載Windows版本的Docker Desktop並安裝(需要win10專業版以上操作系統,並啟用CPU虛擬化和安裝Hvper-V)。 二、新建一個.NetCore3.1的API項目,在創建的時候 ...
  • 1.目錄操作 基礎目錄操作 linux 沒有類似windows一樣的盤符之分,所有的目錄都是以“根‘ / ’”開始,linux 是多用戶登陸, 在 /home/ 的目錄下,存放著已添加用戶的用戶目錄。每個用戶一個文件夾,文件夾名為用戶名 // 下文中 $ 表示終端的提示符,不包含在命令當中 $ pw ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...