linux 命名空间,如何在网络命名空间中连接互联网?

vvi*_*ilp 6 linux networking namespace

我想测试 linux 网络命名空间。

当前的问题是我无法在命名空间中连接互联网

这是我的命令:

1 创建网络命名空间netns1,创建一对veths(A和B)将B设置为命名空间

ip netns add netns1
ip link add A type veth peer name B
ip link set B netns netns1
Run Code Online (Sandbox Code Playgroud)

2 创建一个桥来连接 veth A

brctl addbr bridge0
ip addr add 172.17.42.1/16 dev bridge0
ip link set dev bridge0 up
brctl addif bridge0 A
ip link set A up
Run Code Online (Sandbox Code Playgroud)

3 在命名空间中,设置网络

ip netns exec netns1 ip link set dev B name eth0
ip netns exec netns1 ip link set eth0 up
ip netns exec netns1 ip addr add 172.17.42.99/16 dev eth0
ip netns exec netns1 ip route add default via 172.17.42.1
Run Code Online (Sandbox Code Playgroud)

当我 ping 谷歌时,我得到了这个:

ping: unknown host www.google.com
Run Code Online (Sandbox Code Playgroud)

如何在此命名空间中连接到 Internet?

以下是其他一些细节:

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

谢谢

更新 1

我也尝试设置 NAT:

iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -d 0.0.0.0/0 -j 伪装

但还是未知主机

plu*_*ash 6

将网络命名空间视为另一台计算机。将 veth 对视为两个以太网卡,它们之间有一根交叉电缆。

将网络命名空间连接到 Internet 的主要方式有 3 种:NAT、传统 IP 路由、以太网桥接。

NAT 通常是最容易设置的,因为它适用于任何类型的上游互联网连接,并且不需要上游网络的配合。

为了使 NAT 发挥作用,需要做好几件事。

  1. 需要在辅助网络命名空间中设置默认网关(您似乎已经这样做了)
  2. 需要在主网络命名空间中启用 IP 转发(您尚未显示如何设置此设置)。
  3. 主网络命名空间中的 iptables 规则需要允许流量通过(在内核端,默认情况下这是可以的,但某些防火墙软件可能设置了阻止转发的规则)。
  4. 主网络命名空间中需要有适当的 SNAT 或伪装规则(您似乎已经这样做了)。

您还需要确保适当的 /etc/resolv.conf 可用于辅助网络命名空间中的程序。请记住,即使您在辅助网络命名空间中启动本地环回接口(您应该这样做),它仍然是每个网络命名空间的本地接口。

最初设置网络时,最好通过 IP 地址进行 ping/traceroute,以将名称解析问题与一般连接问题分开。


Ste*_*n D 2

我假设您会ping: unknown host www.google.com因为以下提到的网络连接问题而导致名称解析失败。但是,您可能需要通过 ping IP 地址来仔细检查这不仅仅是 DNS 问题。

从您提供的信息来看,您似乎尚未向网桥添加物理接口。如果网桥上没有物理接口,该网桥上的流量就无法到达网络的其余部分。

将物理接口添加到网桥的另一种方法是打开 IP 转发并使用 .net 设置 NAT 规则iptables