从同一主机上的虚拟机客户端访问LXC容器

上下文

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

它曾经是“开箱即用”的工作,但几个星期前,它刚刚停止。 我猜在Ubuntu更新之后,它是一个LXC还是一个Virtualbox,甚至是一个“networking内容”更新? 我不知道,因为我不是每天都在进行这些testing。

¹假冒各种复杂的平台,只使用我实际需要的资源。

²在Windows浏览器下testing它们。

问题是:

我应该如何设置我的Virtualbox / LXC /主机networkingconfiguration才能从Virtualbox guest虚拟机访问LXC容器上的网站?

我到目前为止所做的

我目前的virtualbox设置是有2个网卡。

  • wlan0上的一个网桥(上网)
  • LXC虚拟卡lxcbr0上的桥(访问容器)

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

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

我尝试了一些其他的设置,但我更“猜测”比了解正在发生的事情。

我目前的workarround

我用iptables在主机上设置了一个端口,就像我在整个networking上build立一个容器一样(实际上它是这么做的)。

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

但是,这绝对不是一个干净的解决scheme:

  • 我当时只能访问一个容器(或者我必须使用不同的端口)
  • 我需要重新configurationiptables任何时候我切换项目
  • 我实际上允许外部世界访问容器
  • 我需要有一个活跃的LAN或WAN连接
  • 我几乎不能使用域名了(我有一个在Windows中匹配容器的IP主机文件)

根据user228273的build议,我可以find解决这个问题的configuration:首先,我创build了一个名为tap0的tap界面,并且提出了:

 ip tuntap add mode tap tap0 ip link set tap0 up 

如果其中一个命令失败,可能是因为你已经有一个tap0接口。 使用该命令

 ip link show 

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

 brctl addif lxcbr0 tap0 

然后,我将VirtualBoxconfiguration为在tap0接口上使用“桥接适配器”,如下所示:

VirtualBox配置

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

注意所有以前的命令必须以pipe理员身份运行。

有完全一样的问题。 几乎可以肯定VirtualBox的“错误”,似乎是以自己的方式进行桥接networking,可能在各种平台(Mac,Solaris和其他平台)之间保持一致。 证据:

  • VBOX桥接networking接口不会出现在“brctl show”(LXC veth的)
  • 文档有:“VirtualBox使用主机系统上的设备驱动程序来过滤来自物理networking适配器的数据”

真的很奇怪,ICMP正在通过,但TCP(可能是其他人)不是…

但是,文档也有“你仍然可以使用TAP接口来进行某些高级设置”,所以我调查了一下新的TAP到我的网桥上:

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

然后调整VBox的networking设置,使用tapX而不是brY,这一切都很好(重新启动客人后)。

与两个共享同一tapX的客人进行实验,不知道它的工作如此之好。 为每个VBox客人使用一次水龙头可能是最安全的。

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

我的猜测是在更新过程中,系统标记"net.bridge.bridge-nf-call-iptables = 1"/etc/systcl.conf打开。

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