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 / 问题 / 1041216
Accepted
D3181
D3181
Asked: 2020-11-04 21:25:52 +0800 CST2020-11-04 21:25:52 +0800 CST 2020-11-04 21:25:52 +0800 CST

Alpine linux veth 网络/网桥没有互联网

  • 772

我一直在尝试按照多个指南为 2 个可以在 alpine linux 上相互通信的命名空间设置 veth-pair。到目前为止,我在命名空间之间进行了通信,但两个命名空间都不能连接/ping 到任何外部 ip/url。

这是我完全使用的指南配置:

  ip netns add namespace1
  ip netns add namespace2
  ip netns exec namespace1 ip address show
  ip link add veth1 type veth peer name br-veth1
  ip link add veth2 type veth peer name br-veth2
  ip link set veth1 netns namespace1
  ip link set veth2 netns namespace2
  ip netns exec namespace1 ip address show
  ip netns exec namespace1 ip addr add 192.168.1.11/24 dev veth1
  ip netns exec namespace1 ip address show
  ip netns exec namespace2 ip addr add 192.168.1.12/24 dev veth2
  
  # Create the bridge device naming it `br1`
  # and set it up:
  ip link add name br1 type bridge
  ip link set br1 up
  ip link | grep br1
  
  # Set the bridge veths from the default
  # namespace up.
  ip link set br-veth1 up
  ip link set br-veth2 up
  ip netns exec namespace1 ip link set veth1 up
  ip netns exec namespace2 ip link set veth2 up
  
  # Add the br-veth* interfaces to the bridge
  # by setting the bridge device as their master.
  ip link set br-veth1 master br1
  ip link set br-veth2 master br1
  bridge link show br1
  ip addr add 192.168.1.10/24 brd + dev br1
  ip -all netns exec ip route add default via 192.168.1.10
  iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE

我还验证了 /etc/sysctl.conf 包含

net.ipv4.ip_forward = 1

我也运行了这个命令以防万一

sysctl -w net.ipv4.ip_forward=1

我的 resolv.conf 包含:

nameserver 8.8.8.8

当我跑步时

ip netns exec namespace1 ip route

我得到结果:

192.168.1.0/24 dev veth1 proto kernel scope link src 192.168.1.11

如果我运行一个常规的 ip 路由列表,我会得到:

192.168.56.0 eth0 proto kernel scope link src 192.168.56.217
192.168.1.0/24 dev br1 proto kernel scope link src 192.168.1.10

我不知道为什么上面的设置不起作用,因为大多数指南似乎建议主机和命名空间应该能够在执行 MASQUERADE 并设置命名空间的默认路由之后进行通信,但是网络不是我的核心研究领域,所以任何建议都会非常有用。如果缺少任何信息,请随时发表评论,如果我错过了什么,我会尽力提供。

ip iptables namespaces network-namespace
  • 1 1 个回答
  • 830 Views

1 个回答

  • Voted
  1. Best Answer
    A.B
    2020-11-05T01:10:55+08:002020-11-05T01:10:55+08:00

    我逐字应用了您的设置,它正在工作。

    您一定是在某处打错了字,或者没有完全按照您在问题中写的内容进行操作。

    两个备注:

    bridge link show br1
    

    是无效的语法。man bridge在最近的版本中进行了修改可能是因为这是一个常见的错误:

    bridge link show- 列出所有网桥的端口配置。此命令显示所有网桥的端口配置和标志。

    要显示特定网桥的端口配置和标志,请使用“ ip link show master <bridge_device>”命令。

    所以你应该改用:

    ip link show master br1
    

    或者你会在其他网桥上获得额外的接口。当然没关系。

    重要的是:

      ip -all netns exec ip route add default via 192.168.1.10
    

    应该在网络命名空间中设置默认路由(并且为我做了),但你稍后会写:

    当我跑步时

    ip netns exec namespace1 ip route
    

    我得到结果:

    192.168.1.0/24 dev veth1 proto kernel scope link src 192.168.1.11
    

    这里缺少默认路由。在我的系统上做同样的事情,我得到了,你应该有但没有:

    # ip netns exec namespace1 ip route
    default via 192.168.1.10 dev veth1 
    192.168.1.0/24 dev veth1 proto kernel scope link src 192.168.1.11 
    

    因此,找出缺少的内容。在不更改任何顺序的情况下,完全按照给定的方式手动重新测试您的命令,并验证您是否获得了默认路由。例如,如果接口关闭然后再次启动,则此路由将丢失(但在 OP 的脚本中未完成)。如果需要,不要使用-all但重复两次命令一次namespace1一次 for namespace2。


    更新:从评论中的进一步讨论看来,OP 也有iptables,其 FORWARD 策略设置为 DROP。

    如果打算启用命名空间间流量(是否应激活br_netfilter,请参阅最后)以及来自命名空间的任何传出流量,则可以简单地使用例如:

    iptables -I FORWARD -i br1 -j ACCEPT
    

    同样,如果需要,命名空间也可以到达主机:

    iptables -I INPUT -i br1 -j ACCEPT
    

    关于这一点的安全性确实值得深思,并将规则集成到现有的防火墙解决方案中。

    如果像 Docker 这样的其他工具正在运行,事情可能会变得更加复杂,因为它可能会启用br_netfilter,正如我对这个 Q/A 的回答中所见。

    • 1

相关问题

  • 共享服务器IP

  • Windows 中执行反向 DNS 查找的命令行实用程序是什么?

  • 如何找到 ubuntu 盒子的默认网关

  • 我怎样才能得到一个网站的IP地址?

  • 如何让我的计算机将自己称为 192.168.1.* 上的任何 ip?

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