AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1083860
Accepted
jwbensley
jwbensley
Asked: 2021-11-18 13:15:07 +0800 CST2021-11-18 13:15:07 +0800 CST 2021-11-18 13:15:07 +0800 CST

不能将多个网络命名空间链接在一起

  • 772

问题陈述

使用以下配置,在默认/主网络命名空间和名为ns1.

该配置还创建了第二个 veth 对: veth2 在 netns 中ns1, veth3 在 netns 中ns2,这加入ns1了ns2创建链:default netns-veth0 <-> veth1-ns1-veth2 <-> veth3-ns2。

sudo ip link add veth0 type veth peer name veth1
sudo ip -6 addr add CCFF::0/127 peer CCFF::1/127 dev veth0
sudo ip link set up dev veth0

sudo ip netns add ns1
sudo ip link set veth1 netns ns1
sudo ip -n ns1 -6 addr add CCFF::1/127 peer CCFF::0/127 dev veth1
sudo ip -n ns1 link set up dev veth1
sudo ip -n ns1 -6 route add default via CCFF::0

sudo ip link add veth2 type veth peer name veth3
sudo ip link set veth2 netns ns1
sudo ip -n ns1 -6 addr add CCFF::2/127 peer CCFF::3/127 dev veth2
sudo ip -n ns1 link set up dev veth2
sudo ip -n ns1 -6 route add CCFF::/64 via CCFF::3

sudo ip netns add ns2
sudo ip link set veth3 netns ns2
sudo ip -n ns2 -6 addr add CCFF::3/127 peer CCFF::2/127 dev veth3
sudo ip -n ns2 link set up dev veth3
sudo ip -n ns2 -6 route add default via CCFF::2

sudo ip -6 r add CCFF::/64 via CCFF::1

从默认的 netns 我可以 ping 同一个 netns 中的 veth0。从默认的 netns 我可以 ping veth1 和 veth2,它们都在ns1. 从默认的 netns 中,我无法识别ns2.

如果我按如下方式扩展更改,通过添加 veth4 inns2和 veth5 inns3我有同样的问题。我可以从任何接口 ping 到 中ns1的任何接口ns2,但无法到达 中的任何接口ns3。

sudo ip link add veth4 type veth peer name veth5
sudo ip link set veth4 netns ns2
sudo ip netns exec ns2 ip -6 addr add CCFF::4/127 peer CCFF::5/127 dev veth4
sudo ip netns exec ns2 ip link set up dev veth4
sudo ip netns exec ns2 ip -6 route add CCFF::/64 via CCFF::5

sudo ip netns add ns3
sudo ip link set veth5 netns ns3
sudo ip netns exec ns3 ip -6 addr add CCFF::5/127 peer CCFF::4/127 dev veth5
sudo ip netns exec ns3 ip link set up dev veth5
sudo ip netns exec ns3 ip -6 route add default via CCFF::4

看来我只能在直接“相邻”/“连接”的网络中 ping 一个接口到我正在 ping 的那个。我无法通过一系列网络名称空间 ping 通。路由全部有效;默认 netns 可以 ping 任何接口,ns1但不能进一步,interfaces inns1可以 ping 默认 netns 中的任何接口,ns2但不能 ping 任何接口ns3,并且ns3可以 ping 任何东西,ns2但不能 pingns1默认 netns 之外的任何接口。

这是网络命名空间的限制吗?

故障排除

IPv6 转发已启用,ip6tables 只是设置为“全部允许”,我不确定还要检查什么。

$ip -6 r
ccff::1 dev veth0 proto kernel metric 256 pref medium
ccff::/127 dev veth0 proto kernel metric 256 pref medium
ccff::/64 via ccff::1 dev veth0 metric 1024 pref medium
fe80::/64 dev veth0 proto kernel metric 256 pref medium

$sudo ip -n ns1 -6 r
ccff:: dev veth1 proto kernel metric 256 pref medium
ccff::/127 dev veth1 proto kernel metric 256 pref medium
ccff::3 dev veth2 proto kernel metric 256 pref medium
ccff::2/127 dev veth2 proto kernel metric 256 pref medium
ccff::/64 via ccff::3 dev veth2 metric 1024 pref medium
fe80::/64 dev veth1 proto kernel metric 256 pref medium
fe80::/64 dev veth2 proto kernel metric 256 pref medium
default via ccff:: dev veth1 metric 1024 pref medium

$sudo ip -n ns2 -6 r
ccff::2 dev veth3 proto kernel metric 256 pref medium
ccff::2/127 dev veth3 proto kernel metric 256 pref medium
ccff::5 dev veth4 proto kernel metric 256 pref medium
ccff::4/127 dev veth4 proto kernel metric 256 pref medium
ccff::/64 via ccff::5 dev veth4 metric 1024 pref medium
fe80::/64 dev veth3 proto kernel metric 256 pref medium
fe80::/64 dev veth4 proto kernel metric 256 pref medium
default via ccff::2 dev veth3 metric 1024 pref medium

$sudo ip -n ns3 -6 r
ccff::4/127 dev veth5 proto kernel metric 256 linkdown pref medium
default via ccff::4 dev veth5 metric 1024 linkdown pref medium

$cat /proc/sys/net/ipv6/conf/all/forwarding 
1

$cat /proc/sys/net/ipv6/conf/default/forwarding 
1

$sudo ip6tables-save
# Generated by ip6tables-save v1.8.4 on Wed Nov 17 22:02:48 2021
*filter
:INPUT ACCEPT [76565:173401906]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [50440:6536664]
COMMIT
# Completed on Wed Nov 17 22:02:48 2021

$lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:    20.04
Codename:   focal

$uname -a
Linux l13-ubuntu 5.11.0-40-generic #44~20.04.2-Ubuntu SMP Tue Oct 26 18:07:44 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
linux ipv6 network-namespace ip-forwarding
  • 2 2 个回答
  • 249 Views

2 个回答

  • Voted
  1. Best Answer
    dirkt
    2021-11-23T23:08:52+08:002021-11-23T23:08:52+08:00

    IPv6 转发已启用

    可能不是:当我使用问题开头给出的命令在我的系统上尝试此操作时,我也无法达到veth3:

    $ ping -6 CCFF::3
    PING CCFF::3(ccff::3) 56 data bytes
    ^C
    --- CCFF::3 ping statistics ---
    13 packets transmitted, 0 received, 100% packet loss, time 12290ms
    

    但是,当我启用转发时ns1

    echo 1 | sudo ip netns exec ns1 tee /proc/sys/net/ipv6/conf/all/forwarding
    

    有用:

    $ ping -6 CCFF::3
    PING CCFF::3(ccff::3) 56 data bytes
    64 bytes from ccff::3: icmp_seq=1 ttl=63 time=0.112 ms
    64 bytes from ccff::3: icmp_seq=2 ttl=63 time=0.054 ms
    

    所以很可能你也没有在ns1. (记住转发是每个命名空间的;你是否在主命名空间中启用了它,但不是在ns1?)


    我通过tcpdump在每个接口上进行调试来调试它;ping 未到达veth2表示未启用转发。

    如果您想知道“但是veth2如果未启用转发,为什么我可以 ping”:Linux 将所有本地地址视为相同,因此您可以从任何接口访问任何本地地址。这与转发完全无关。

    顺便说一句,它可以帮助很多人xterm在每个命名空间中运行一个;这使得调试更容易。

    • 2
  2. Gerrit
    2021-11-24T10:37:00+08:002021-11-24T10:37:00+08:00

    我得出了与@dirkt 相同的完全有效的结论,每个命名空间本身就是一个网络主机,包括设置它是否像路由器一样(默认为关闭)。/proc/sys/net 设置对于每个命名空间都是独立的。解析是独立的,接口链接是独立的(但主机名不是,因为您必须创建 UTS 命名空间)。所以基本上这就是你的答案。

    无论如何不要减损,但为了将来参考,我会添加一些东西并稍微重新排列和简化。您实际上不需要默认命名空间中的路由设置,除非您希望将外部流量路由到这些命名空间,反之亦然。

    总结一下默认命名空间和 ns1 加上 ns2 的构造。

    # create namespaces
    ip netns add ns1
    ip netns add ns2
    
    # loopbacks, nice to have
    ip -n ns1 link set lo up
    ip -n ns2 link set lo up
    
    # make veth pairs for each new namespace
    ip link add veth0 type veth peer name veth1
    ip link add veth2 type veth peer name veth3
    
    # add interfaces to their namespaces
    ip link set veth1 netns ns1
    ip link set veth2 netns ns1
    ip link set veth3 netns ns2
    
    # assign addresses
    ip -6 addr add CCFF::0/127 dev veth0
    ip -n ns1 -6 addr add CCFF::1/127 dev veth1
    ip -n ns1 -6 addr add CCFF::2/127 dev veth2
    ip -n ns2 -6 addr add CCFF::3/127 dev veth3
    
    # set the new links to up
    ip link set up dev veth0
    ip -n ns1 link set up dev veth1
    ip -n ns1 link set up dev veth2
    ip -n ns2 link set up dev veth3
    
    # namespaces that should forward
    ip netns exec ns1 sysctl -w net.ipv6.conf.all.forwarding=1
    
    # route any ip6 outward towards host through namespace 1
    ip -n ns2 -6 route add default via CCFF::2
    
    # route any ccff ip6 inward from host
    # to a more inner space through namespace 1
    ip -6 r add CCFF::/64 via CCFF::1
    

    然后你可以做一些测试:

    ip netns list
    ip netns exec ns2 ping6 ccff::0
    ip netns exec ns2 ping6 ccff::1
    ip netns exec ns2 ping6 ccff::3
    
    # Or put your shell (e.g. bash) in the namespace ns2
    ip netns exec ns2 /bin/bash
    ping6 ccff::0
    exit
    

    您还可以进行一些解析和主机文件更改

    # Setup a resolver 
    # (replace with your own DNS, does not work with a loopback resolver)
    
    mkdir -p /etc/netns/ns2
    echo nameserver dns-ip > /etc/netns/ns2/resolv.conf
    
    # Maybe give it its own hosts file, to do edits
    cp /etc/hosts /etc/netns/ns2/hosts
    
    • 1

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve