从同一主机上的 VirtualBox 客户机访问 LXC 容器

从同一主机上的 VirtualBox 客户机访问 LXC 容器

语境

  • 我在我的 Ubuntu 笔记本电脑(Ubuntu 13.04 64b)上开发网站。
  • 每个站点在网络 10.0.3.x 上的专用 LXC 容器¹ 内运行
  • 我有时需要从运行 Windows² 的 VirtualBox 客户机访问这些网站

它以前可以“开箱即用”,但几周前就停止了。我猜是在 Ubuntu 更新之后,但它是 LXC 还是 Virtualbox 甚至是“网络内容”更新?我无法判断,因为我不是每天都运行这些测试。

¹ 伪造各种复杂的平台并仅使用我真正需要的资源。

² 在Windows浏览器下进行测试。

问题:

我应该如何设置我的 Virtualbox/LXC/host 网络配置才能从 Virtualbox 客户机访问 LXC 容器上的网站?

我目前所做的

我当前的 VirtualBox 设置有 2 个网卡。

  • wlan0(接入互联网的)桥梁
  • LXC 虚拟卡上的桥lxcbr0(用于访问容器)

奇怪的是:我可以从 Windows VM ping LXC 容器,但无法通过 HTTP(浏览器或端口 80 上的 telnet)访问它们。

只有实际启动的容器才会响应 ping。

我尝试了许多其他设置,但我更多的是“猜测”,而不是了解发生了什么。

我目前的解决方法

我使用 iptables 在主机上设置了端口转发,就像我为了让容器在整个网络上可访问所做的那样(它实际上就是这么做的)。

当我这样做时,我可以从 Windows VM 访问转发的容器。

但这绝对不是一个干净的解决方案:

  • 我一次只能访问一个容器(或者我必须使用不同的端口)
  • 每次切换项目时我都需要重新配置 iptables
  • 我实际上向外界开放了对容器的访问权限
  • 我需要有活动的 LAN 或 WAN 连接
  • 我几乎不能再使用域名了(我在 Windows 中有一个与容器的 IP 匹配的主机文件)

答案1

按照 user228273 的建议,我找到了解决问题的配置:首先,我创建了一个名为 tap0 的 tap 接口,然后启动它:

ip tuntap add mode tap tap0
ip link set tap0 up

如果前面的命令之一失败,可能是因为您已经有一个tap0接口。使用命令

ip link show

评估情况,最终更改接口名称。现在您可以将tap0接口添加到 Ubuntu 下名为 的默认桥接器中lxcbr0

brctl addif lxcbr0 tap0

然后我将 VirtualBox 配置为在界面上使用“桥接适配器”,tap0如下所示:

VirtualBox 配置

然后 VirtualBox 实例和 LXC 就可以“看到”彼此。

2019 年更新:如果您使用 NetworkManager,则可以使用 nmcli 进行此添加:

nmcli connection add type tun ifname tap0 con-name tap0 mode tap master lxcbr0

答案2

遇到了完全相同的问题。几乎可以肯定是 VirtualBox 的“错误”,它似乎以自己的方式进行桥接网络,可能是为了在各个平台(Mac、Solaris 和其他平台)上保持一致。证据:

  • VBox 桥接网络接口不要出现在“brctl show”中(LXC veth 也如此)
  • 文档中写道:“VirtualBox 使用主机系统上的设备驱动程序来过滤来自物理网络适配器的数据”

真的很奇怪 ICMP 可以通过,而 TCP(以及其他协议)却不能……

但是,文档中还提到“您仍然可以使用 TAP 接口进行某些高级设置”,因此我研究了将新的 TAP 连接到我的网桥:

# ip tuntap add mode tap
# brctl addif brY tapX
# ip link set tapX up

然后调整 VBox 网络设置以使用 tapX 而不是 brY,一切正常(重新启动客户机后)。

尝试了两个客人共享同一个 tapX,不确定效果如何。可能最安全的做法是每个 VBox 客人使用一个 tap。

答案3

如果你可以 ping 目标但无法访问那里的应用程序,那么几乎可以肯定这是一个 iptables 问题。

我的猜测是在更新过程中您已将系统标志"net.bridge.bridge-nf-call-iptables = 1"选中为 ON /etc/systcl.conf

如果是这样,我不会放弃它,而是修改 iptables 设置。

相关内容