net namespace實驗

来源:https://www.cnblogs.com/yezhh/archive/2019/07/26/11248897.html
-Advertisement-
Play Games

Net namespace實驗 在 Linux 中,網路名字空間可以被認為是隔離的擁有單獨網路棧(網卡、路由轉發表、iptables)的環境。網路名字空間經常用來隔離網路設備和服務,只有擁有同樣網路名字空間的設備,才能看到彼此。 network namespace 是實現網路虛擬化的重要功能,它能創 ...


Net namespace實驗

在 Linux 中,網路名字空間可以被認為是隔離的擁有單獨網路棧(網卡、路由轉發表、iptables)的環境。網路名字空間經常用來隔離網路設備和服務,只有擁有同樣網路名字空間的設備,才能看到彼此。 network namespace 是實現網路虛擬化的重要功能,它能創建多個隔離的網路空間,它們有獨自的網路棧信息。不管是虛擬機還是容器,運行的時候仿佛自己就在獨立的網路中

常用命令

comm 命令
ip netns add net1 添加namespace net1
ip netns help 獲取幫助
ip netns del n1 刪除namespace n1
ip netns ls 列出當前已有namespace

與net namespace相關的指令是ip netns後面跟具體指令
使用ip netns exec name子命令後面可以加上任何命令,表示在相應的namespace中執行相關命令,如:

root@mininet-vm:/home/mininet# ip netns exec n2 ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

可以執行ip netns exec n2 bash,之後所有指令都在指定namespace中執行而不需要加上ip netns exec name

root@mininet-vm:/home/mininet# ip netns exec n2 ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
root@mininet-vm:/home/mininet# ip netns exec n2 bash
root@mininet-vm:/home/mininet# ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
root@mininet-vm:/home/mininet# exit
exit
root@mininet-vm:/home/mininet# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast 
.................

使用ip netns exec n2 bash --rcfile <(echo "PS1=\"namespace ns1>\"")可以修改命令行的首碼。

root@mininet-vm:/home/mininet# ip netns exec n2 bash --rcfile <(echo "PS1=\"namespace n2>\"")
namespace n2>

 namespace通信

使用 veth pair 進行通信

  1. 創建一對veth pair
    使用命令ip link add type veth創建一對veth pair,其預設名是veth0和veth1,使用ip link可查看鏈接
   root@mininet-vm:/home/mininet# ip link
.....
3: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN 
root@mininet-vm:/home/mininet # ip link add type veth
root@mininet-vm:/home/mininet # ip link
....
3: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN 
9: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 12:e8:a5:43:c0:43 brd ff:ff:ff:ff:ff:ff
10: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 9e:f8:c3:b9:af:ec brd ff:ff:ff:ff:ff:ff
  1. 將veth pair的兩端分別放到兩個namespace
    使用命令ip link set veth0 netns n1ip link set veth1 netns n2分別將veth0和veth1放到不同namespace
oot@mininet-vm:/home/mininet# ip link set veth0 netns n1
root@mininet-vm:/home/mininet# ip link set veth1 netns n2
root@mininet-vm:/home/mininet# ip netns exec n1 ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
9: veth0@if10: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 12:e8:a5:43:c0:43 brd ff:ff:ff:ff:ff:ff
root@mininet-vm:/home/mininet# ip netns exec n2 ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
10: veth1@if9: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 9e:f8:c3:b9:af:ec brd ff:ff:ff:ff:ff:ff
  1. 為veth pair的兩端分別配置ip
    使用命令ip link set vethX upip addr add 10.0.0.10/24 dev vethX為veth pair配置ip,結果如下
# namespace 1
namespace ns1> ip link set veth0 up
namespace ns1> ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
9: veth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 12:e8:a5:43:c0:43 brd ff:ff:ff:ff:ff:ff
namespace ns1> ip addr add 10.0.10.1/24 dev veth0
namespace ns1> ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
9: veth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 12:e8:a5:43:c0:43 brd ff:ff:ff:ff:ff:ff
    inet 10.0.10.x1/24 scope global veth0
       valid_lft forever preferred_lft forever

# namespace 2
namespace n2>ip link set veth1 up
namespace n2>ip addr add 10.0.10/24 dev veth1
namespace n2>ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
10: veth1@if9: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state LOWERLAYERDOWN group default qlen 1000
link/ether 9e:f8:c3:b9:af:ec brd ff:ff:ff:ff:ff:ff
    inet 10.0.10.0/24 scope global veth1
       valid_lft forever preferred_lft forever
  1. 測試兩個namespace之間的網路聯通狀態
    分別在n1和n2中嘗試ping
namespace ns1> ping 10.0.10.0 -c 1
PING 10.0.10.0 (10.0.10.0) 56(84) bytes of data.
64 bytes from 10.0.10.0: icmp_seq=1 ttl=64 time=0.035 ms
namespace n2>ping 10.0.10.1 -c 1
PING 10.0.10.1 (10.0.10.1) 56(84) bytes of data.
64 bytes from 10.0.10.1: icmp_seq=1 ttl=64 time=0.040 ms
  1. 其拓撲結構如下
    20190725185608.png
    veth pair可以用於兩個namespace之間的通信,但不適合用在多個namespace之間的通行

    利用bridge通信

  2. 在以上實驗基礎上,重新創建兩個namespace:n3、n4
root@mininet-vm:/home/mininet# ip netns add n3
root@mininet-vm:/home/mininet# ip netns add n4
root@mininet-vm:/home/mininet# ip netns ls
n4
n3
n1
n2
  1. 創建bridge
root@mininet-vm:/home/mininet# ip link add br0 type bridge
root@mininet-vm:/home/mininet# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:1e:27:79 brd ff:ff:ff:ff:ff:ff
    inet 192.168.117.128/24 brd 192.168.117.255 scope global eth0
       valid_lft forever preferred_lft forever
3: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether 72:f5:e5:5d:4d:ed brd ff:ff:ff:ff:ff:ff
11: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether 76:d8:06:1a:b9:84 brd ff:ff:ff:ff:ff:ff
  1. 利用veth pair將bridge與n3、n4、n1連通
    創建3對veth pair
root@mininet-vm:/home/mininet# ip link add type veth
root@mininet-vm:/home/mininet# ip link add type veth
root@mininet-vm:/home/mininet# ip link add type veth
root@mininet-vm:/home/mininet# ip a
...
11: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether 76:d8:06:1a:b9:84 brd ff:ff:ff:ff:ff:ff
12: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether ea:98:b6:3c:46:60 brd ff:ff:ff:ff:ff:ff
13: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether f2:f6:d8:6b:31:1f brd ff:ff:ff:ff:ff:ff
14: veth2@veth3: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 4a:7d:af:18:67:14 brd ff:ff:ff:ff:ff:ff
15: veth3@veth2: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether ca:b6:e4:eb:b7:15 brd ff:ff:ff:ff:ff:ff
16: veth4@veth5: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether f2:b3:5f:0e:3d:09 brd ff:ff:ff:ff:ff:ff
17: veth5@veth4: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 76:0c:87:b1:16:80 brd ff:ff:ff:ff:ff:ff

將br0和n1,n3,n4連接
這時候如果把veth0加入n1的話會報錯,因為n1裡面已經有了一個veth0,可以換成其他名稱的veth。
將veth pair放如br0的指令為ip link set dev veth3 master br0

  1. 測試n1-n4之間的連通狀態
    發現不同namespace之間無法ping通 。
    這個問題折騰了很久,後來多配置了幾次有可以了。應該是之前漏掉了幾個步驟,完整的步驟應該包括以下幾步:

    # 啟動網橋(網橋只需要啟動一次就行)
    ip link set br0 up
    # 創建vethpair
    ip link add br-1 type veth peer name 1-br
    #將vethpair分配給網橋和namespace
    ip link set br-1 master br0
    ip link set 1-br netns n1
    #啟動veth
    ip link set br-1 up
    ip netns exec n1 ip link set 1-br up
    # 為namespace中的veth設置ip
      ip netns exec n1 ip addr add 10.0.10.2/24 dev 1-br

    重新測試,發現三個namespace可以相互ping通。

上述網橋對應的veth的ip其實可以省略

  1. 其拓撲結構如下

    ### namespace內部與namespace外部通信
    預設情況下,namespace網路是隔離的,namespace內無法ping通namespace外的網路,可以通過veth pair打通網路狀態。
    當veth pair一端在namespace內部,一端在namespace外部時,namespace可以ping通位於外部的veth pair但無法ping同其他網路。

    參考資料

    https://cizixs.com/2017/02/10/network-virtualization-network-namespace/


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

-Advertisement-
Play Games
更多相關文章
  • 問題現象 mac蓋上蓋子喚醒或者里臨時拔出數據線,再重新連接之後,經常出現下麵問題: 1. 【系統偏好設置】 【顯示器】仍可以識別外接顯示器; 2. 外接顯示器會提示無信號輸入 解決方法 方法一 通過【系統偏好設置】 【顯示器】 【排列】,勾選【鏡像顯示器】,外接顯示器就可以恢復正常。如果是斷開數據 ...
  • 命令歷史 以:和/開頭的命令都有歷史紀錄,可以首先鍵入:或/然後按上下箭頭來選擇某個歷史命令。 啟動vim 在命令行視窗中輸入以下命令即可 vim 直接啟動vim(直接打開的話,在有內容的情況下,在退出的時候保存的時要有文件名) vim filename 打開vim並創建名為 filename 的文 ...
  • 簡介 本文講述的是調教 Helm 3 和 harbor 1.6+ 的經驗,從 helm2 更新到 helm 3 並且將 charts 推送到 harbor 中進行存儲,移除了原先的 helm serve,在講述怎麼操作之前先來看一下Helm 3 和 Harbor 1.6+ 的新特性。 Helm 3 ...
  • 總結起來,基本都是ctrl+w然後加上某一個按鍵字母,觸發一個功能。 (1)在shell里打開幾個文件並且分屏: vim -On file1 file2 ... vim -on file1 file2 ... 大O表示垂直分割(vertical),小o表示水平分割(預設horizontal),後... ...
  • Linux 登錄、註銷與關機 這裡主要學習的是命令行環境下的相關操作。 一、登錄 Linux 預設的情況下會提供六個終端來讓用戶登錄,切換的方式為使用:【Ctrl + Alt + F1 ~ F6】的組合鍵。系統會將 [F1] ~ [F6] 命名為 tty1 ~ tty6 的操作介面環境。 也就是說, ...
  • 打開多個文件: 1、vim還沒有啟動的時候: 在終端里輸入 vim file1 file2 ... filen 便可以打開所有想要打開的文件 ...
  • Kali Linux安裝好預設是不開啟ssh的,需要手工開啟 1.修改/etc/ssh/sshd_config 配置文件: root@mykali:~# vi /etc/ssh/sshd_config 2.找到#PasswordAuthentication yes 把“#”去掉 3.找到# Perm ...
  • 最近檢查發現一臺Linux伺服器,發現其日誌裡面有大量下麵信息,其中部分信息做了脫敏處理。其中一個地址A(192.168.AAA.AAA) 為DNS伺服器地址,地址B(192.168.BBB.BBB)為動態獲取的IP地址。 #脫敏後信息如下所示: Jul 24 15:14:18 xxxxxx dhc... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...