语境
- 我在我的 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 实例和 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 设置。