Linux ping 网络命名空间

Linux ping 网络命名空间

我将命名空间添加到我的主机并使用以下命令使其可用:

ip netns add h1
ip link add veth01 type veth peer name veth1
ip link set dev veth1 netns h1
ifconfig veth01 10.0.0.1/24 up
ip net e h1 ifconfig veth1 10.0.0.2/24 up
route add -net 10.0.0.0/24 gw 10.0.0.1 dev veth01
ip net e h1 ip r a default via 10.0.0.1

现在我可以从我的主机 ping 10.0.0.2 并向后 ping(ip net e h1 ping 10.0.0.1)。

然后我对第二个命名空间执行了同样的事情:

ip netns add h2
ip link add veth02 type veth peer name veth2
ip link set dev veth2 netns h2
ifconfig veth02 20.0.0.1/24 up
ip net e h2 ifconfig veth2 20.0.0.2/24 up
route add -net 20.0.0.0/24 gw 20.0.0.1 dev veth02
ip net e h2 ip r a default via 20.0.0.1

现在例如我可以从 h1 (10.0.0.2) ping 10.0.0.1 (和 20.0.0.1);可以从主机 ping 20.0.0.2,但我无法从 h1 ping 20.0.0.2。我做错了什么?

提前致谢

答案1

我究竟做错了什么?

添加路由——这是错误的,因为您已经为每个接口对分配了这个网络。

ifconfig veth01 10.0.0.1/24向上
路由添加-net 10.0.0.0/24 gw 1​​0.0.01 dev veth01

人们经常会忘记的另一个可能的罪魁祸首是启用转发本身(sysctl net.ipv4.ip_forward=1)。

答案2

答案是网络命名空间是完全独立的。您需要链接两个命名空间,以便转发来自外部的流量。有几种方法可以做到这一点。最简单的方法是在两个veth设备之间创建桥梁。

目前,您看到的是,host-machine您可以从 ping 两个本地地址(10.0.0.1 和 20.0.0.2),但只有 10.0.0.2 知道 10.0.0.1 的存在。要让 20.0.0.1 做出响应,您需要确保您的 ping 来自同一网络(20.0.0.0/24,尽管这不是最终解决方案),或者命名空间和默认路由表之间存在某种连接。

答案3

  1. 默认情况下,创建的网络命名空间的环回接口处于关闭状态。应使用命令将其激活ip ns exec <NSNAME> ip link set up dev lo

  2. 检查路由(sysctl net.ipv4.ip_forward)。它应该已启用。使用检查实际路线ip route get 20.0.0.2 from 10.0.0.2 iif veth01,反之亦然。它应该返回有效路线。

  3. 使用 检查防火墙规则iptables-save -c。允许链veth中的接口之间传输数据包filter/FORWARD

完整配置

  • 创建h1命名空间
ip netns add h1
  • h1为命名空间创建 veth 接口对
ip link add veth_h1 type veth peer name veth_main
  • veth_main接口移入h1命名空间
ip link set dev veth_main netns h1
  • 配置veth_h1接口
ip link set dev veth_h1 up
ip address add 10.0.0.1/24 dev veth_h1
  • h1在命名空间内配置网络
ip netns exec h1 ip link set dev lo up
ip netns exec h1 ip link set dev veth_main up
ip netns exec h1 ip address add 10.0.0.2/24 dev veth_main
ip netns exec h1 ip route add 0/0 via 10.0.0.1 dev veth_main
  • 对于命名空间h2中的命名空间,步骤类似main
ip netns add h2
ip link add veth_h2 type veth peer name veth_main
ip link set dev veth_main netns h2
ip link set dev veth_h2 up
ip address add 10.20.0.1/24 dev veth_h2
  • h2在命名空间内部
ip netns exec h2 ip link set dev lo up
ip netns exec h2 ip link set dev veth_main up
ip netns exec h2 ip address add 10.20.0.2/24 dev veth_main
ip netns exec h2 ip route add 0/0 via 10.20.0.1 dev veth_main
  • 检查路由
~$ ip r g 10.20.0.2 from 10.0.0.2 iif veth_h1
10.20.0.2 from 10.0.0.2 dev veth_h2 
    cache iif veth_h1 

~$ ip r g 10.0.0.2 from 10.20.0.2 iif veth_h2
10.0.0.2 from 10.20.0.2 dev veth_h1 
    cache iif veth_h2 

笔记

  • 要删除 veth 接口对,只需删除主接口:
ip link del dev veth_h1
  • 要将接口从某个命名空间移回主命名空间:
ip netns exec h2 ip link set dev veth_main netns 1

附言忘记ifconfig,因为它已被弃用。

相关内容