我想测试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 发挥作用,需要做好几件事。
- 需要在辅助网络命名空间中设置默认网关(您似乎已经这样做了)
- 需要在主网络命名空间中启用 IP 转发(您尚未显示如何设置此设置)。
- 主网络命名空间中的 iptables 规则需要允许流量通过(在内核端,默认情况下这是可以的,但某些防火墙软件可能设置了阻止转发的规则)。
- 主网络命名空间中需要有适当的 SNAT 或伪装规则(您似乎已经这样做了)。
您还需要确保适当的 /etc/resolv.conf 可用于辅助网络命名空间中的程序。请记住,即使您在辅助网络命名空间中启动本地环回接口(您应该这样做),它仍然是每个网络命名空间的本地接口。
最初设置网络时,最好通过 IP 地址进行 ping/traceroute,以将名称解析问题与一般连接问题分开。
答案2
如果您尝试诊断可能的网络问题,不尝试 ping FQDN。哎呀,根本不要使用 ping。
试试这个:traceroute -n 8.8.8.8
这将产生更多有用的信息,原因有两个:
它不需要正常运行的解析器(如果您无法访问互联网,则无法进行 DNS 查找,因此您会得到“未知主机”,但如果您的解析器无法正常工作,您将获得准确的主机名)即使您的连接良好,也会得到相同的答案)。
它将尝试沿着它认为应该是通往 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