我有一台专用服务器(运行 Ubuntu 20.04),在 Virtualbox 中运行虚拟机。此虚拟机(也在 Ubuntu 20.04 上运行)有几个应用程序在由 LXD 管理的专用 LXC 容器中运行。虚拟机使用主机专用适配器在界面上vboxnet0容器使用 LXD 桥接器。因此,我有以下结构(IP 显然不是真实的):
- 专用服务器:公网 IP 66.66.66.66,主机专用适配器 IP 55.55.55.1
- VM:仅主机适配器 IP 55.55.55.2,LXD 桥接 IP 44.44.44.1
- 应用容器:LXD 桥接 IP 44.44.44.2
我想要做的是将流量重定向到公共 IP 和特定端口(假设为 80)到托管适配服务的容器,例如 66.66.66.66:80 -> 44.44.44.2:80。
我的想法是在我的专用服务器中创建一个特定的路由,以便使 LXD 子网可访问:
- ip 路由通过 55.55.55.2 dev vboxnet0 添加 44.44.44.0/24
然后设置 IPTABLES 重定向(使用此帖子中的信息:将 IP 上的所有流量引导至虚拟机)
- iptables -t nat -A PREROUTING -p tcp -d 66.66.66.66 --dport 80 -j DNAT --to-destination 44.44.44.2
- iptables -t nat -A POSTROUTING -p tcp -s 44.44.44.2 -j MASQUERADE
之后,我仍然无法使用公共 IP 访问我的容器。我做错了什么?欢迎任何帮助。
答案1
你需要的是 lxc 的代理设备。它们比自己尝试修改 iptables 要容易得多。请参阅https://blog.simos.info/how-to-use-the-lxd-proxy-device-to-map-ports-between-the-host-and-the-containers/
类似于 lxc config device add yourcontainer myport80 proxy listen=tcp:0.0.0.0:80 connect=tcp:127.0.0.1:80
或者如果你想要更具体地了解你监听的 ip,那么也许 lxc config device add yourcontainer myport80 proxy listen=tcp:66.66.66.66:80 connect=tcp:127.0.0.1:80
它的作用是监听主机网络(每个 ip,或者某个特定的 ip)——在本例中是 tcp 端口 80——然后将其代理到名为“yourcontainer”的容器,该容器位于容器的本地主机地址的 tcp 端口 80 上。本例中的“myoport80”是代理设备的名称——您可以随意称呼它。
上述 Simos 博客文章提供了更好的介绍,这里还有更多详细信息:https://linuxcontainers.org/lxd/docs/master/instances/#type-proxy