Dns

每個網路命名空間中的單獨 DNS 配置

  • June 8, 2021

我已經在我的 Linux 系統(核心版本 3.10)上設置了幾個網路命名空間,現在我想配置每個網路命名空間以擁有自己的 DNS 設置。

resolv.conf在每個/etc/netns/[namespace]目錄中創建了文件,現在我想讓我的系統按以下方式工作:

在 bash 命令行中,每當​​我nsenter --net=/run/netns/[namespace name]使用/etc/netns/[namespace name]/resolv.conf.

如果我像這樣執行我的命令:

"ip netns exec [namespace name] [command]"

然後應用命名空間的 DNS 設置。

但是,當執行沒有“ip netns exec”的命令時,DNS 設置取自/etc/resolv.conf,即使執行“netns get cur”表示上下文設置為所需的網路命名空間。

我嘗試mount --bind /etc/netns/[namespace name]/resolv.conf /etc/resolv.conf在適當的網路命名空間的上下文中執行此操作,但這會將掛載應用到整個系統中,而不是僅在該網路命名空間的上下文中。

我懷疑使用掛載命名空間可能會有所幫助,所以我嘗試閱讀掛載命名空間的手冊頁,但是在我致力於它的短時間內無法從中做出任何事情。

有沒有一種簡單而優雅的方式來實現這個目標?

任何有關解決方案的幫助/指導將不勝感激!

看看ip netns exec test ...你的情況在做什麼,使用strace.

摘抄:

# strace  -f ip netns exec test sleep 1 2>&1|egrep '/etc/|clone|mount|unshare'|egrep -vw '/etc/ld.so|access'
unshare(CLONE_NEWNS)                    = 0
mount("", "/", 0x55f2f4c2584f, MS_REC|MS_SLAVE, NULL) = 0
umount2("/sys", MNT_DETACH)             = 0
mount("test", "/sys", "sysfs", 0, NULL) = 0
open("/etc/netns/test", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 5
mount("/etc/netns/test/resolv.conf", "/etc/resolv.conf", 0x55f2f4c2584f, MS_BIND, NULL) = 0

所以要重現(部分,例如/sys這裡沒有處理)ip netns exec test ...正在做什麼:

~# ip netns id

~# head -1 /etc/resolv.conf 
# Generated by NetworkManager

~# **nsenter --net=/var/run/netns/test unshare --mount sh -c 'mount --bind /etc/netns/test/resolv.conf /etc/resolv.conf; exec bash'**

~# ip netns id
test
~# head -1 /etc/resolv.conf 
# For namespace test
~#

所以這是對的。nsenter單獨是不夠的。unshare必須使用,更改為新創建的掛載命名空間(基於前一個的副本)並更改它,而不僅僅是逐字使用現有的命名空間,因為還沒有適合的現有命名空間。這就是在做與 tell 同名的系統呼叫的原因strace

解決方案

您可以使用ip netns execwithbash而不是 using nsenter,即:

ip netns exec [namespace name] bash

這將允許您進入互動式 shell 會話,其中特定於命名空間的網路配置文件會自動綁定安裝到它們的預設(全域)位置(不影響其他會話)。

解釋

以下內容來自ip netns手冊頁

對於知道網路命名空間的應用程序,約定是首先在 /etc/netns/NAME/ 中查找全域網路配置文件,然後在/etc / 中查找。例如,如果您想要一個不同版本的**/etc/resolv.conf用於隔離您的 vpn 的網路命名空間,您可以將其命名為/etc/netns/myvpn/resolv.conf**。

ip netns exec通過創建掛載命名空間並將每個網路命名空間配置文件的所有掛載綁定到 /etc 中的傳統位置,自動處理此配置、網路命名空間未知應用程序的文件約定。

特別注意網路名稱空間感知應用程序和網路名稱空間感知應用程序之間的區別。

另一方面,手冊頁似乎沒有提到這種區別(特別是我搜尋了字元串“aware”、“resolv”、“.conf”和“/etc”,但沒有找到任何結果)nsenter這似乎表明該nsenter實用程序不會對不知道命名空間的應用程序執行相同類型的自動處理。

補充評論

除了Network Namespaces之外,您可能還想查看User NamespacesMount Namespaces。如果您想要在 DNS 之外進一步隔離,您可能還需要考慮容器化,例如LXC ContainersDocker,甚至是完整的 VM。

引用自:https://unix.stackexchange.com/questions/443898