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

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

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

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

这是我的命令:

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

ip netns add netns1
ip link add A type veth peer name B
ip link set B netns netns1

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

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

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

ping: unknown host www.google.com

我如何在这个命名空间中连接到互联网?

以下是一些其他细节:

在此输入图像描述

在此输入图像描述

在此输入图像描述

在此输入图像描述

谢谢

更新1

我也尝试设置NAT:

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

但仍未知主人

答案1

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

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

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

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

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

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

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

答案2

如果您尝试诊断可能的网络问题,尝试 ping FQDN。哎呀,根本不要使用 ping。

试试这个:traceroute -n 8.8.8.8

这将产生更多有用的信息,原因有两个:

  1. 它不需要正常运行的解析器(如果您无法访问互联网,则无法进行 DNS 查找,因此您会得到“未知主机”,但如果您的解析器无法正常工作,您将获得准确的主机名)即使您的连接良好,也会得到相同的答案)。

  2. 它将尝试沿着它认为应该是通往 8.8.8.8 的路线从每个主机那里获得响应,这将向您显示在哪里连接出错而不是简单地无论确实如此。

答案3

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

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

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

答案4

您是否尝试设置 lo 接口?我发现当 lo 未启动时,网络无法在名称空间中工作,因此请尝试以下操作:

ip netns exec netns1 ip 链接设置 lo up

相关内容