![从本地网络访问 lxd 容器](https://linux22.com/image/1054831/%E4%BB%8E%E6%9C%AC%E5%9C%B0%E7%BD%91%E7%BB%9C%E8%AE%BF%E9%97%AE%20lxd%20%E5%AE%B9%E5%99%A8.png)
操作系统:Ubuntu 15.10
LXD:2.0.0.rc5
我想知道如何从同一本地网络上的另一台计算机访问容器。
我的电脑(LXD 主机)的地址:192.168.1.112 (enp3s0)
Xenial 容器:10.0.3.181 (eth0), 10.0.4.1 (lxcbr0)
其他电脑(Fedora 23):192.168.2.118 (wlp3s0)
我可以从另一台 PC ping 到 LXD 主机等等。
答案1
有几种不同的方法可以实现您的目标。
- 将所需端口从主机转发到客户机
- 航线网络
- 桥接设备
选项 1 和 2 需要在主机上启用 ip-forwarding:
# run time:
sudo sysctl -w net.ipv4.ip_forward=1
# permanent:
echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/30-virt-network
如果您想要在客户机上访问特定服务(例如 http(端口 80)(您使用主机 ip 地址 + 端口访问客户机端口 80),但不能在同一端口上运行主机服务,最简单的方法是 1。
# on lxd host: (-i HOSTDEVICE to lan, usually enp3s0 or eth0)
sudo iptables -t nat -A PREROUTING -i enp3s0 -p tcp -m tcp --dport 80 -j DNAT --to 10.0.3.181:80
# making this permanent is left to the reader (because that depends on your choice of fw setup)
选项 2 更加棘手,取决于您可以修改网络的程度。
检查 ( sudo iptables -L -n
) 是否显示链 FORWARD(策略 ACCEPT)或sudo iptables -I FORWARD -s 192.168.2.118 -j ACCEPT
明确允许它。现在,在网络防火墙上将 10.0.3.0/24 路由到您的 192.168.1.112 主机,或者使用 192.168.2.118 上的路由进行测试。
sudo ip route add 10.0.3.181 via 192.168.1.112 dev wlp3s0
第三个选项是将您的 lxd 客户端作为局域网的一部分带入您的局域网。请参阅将 eth0(本例中为 enp3s0)转换为网桥的指令如何做。简而言之:
- 在主机上创建桥接设备
- 添加
eth0
或enp3s0
到该桥 - 将主机地址设置为桥接(不是
enp3s0
) 将 lxd 客户设备绑定到该桥接器
stop network-manager brctl addbr br0 brctl addif br0 enp3s0 ifconfig enp3s0 up ifconfig br0 up dhclient br0 lxc profile edit default - change lxcbr0 to br0
答案2
您需要告诉另一台计算机如何到达容器,因为另一台计算机与容器位于不同的子网中。也就是说,您需要设置“路由”。下面是您可以在另一台计算机上创建的示例路由。它说,“要到达容器 (.181),首先使用与主机 (eth0) 位于同一网络的设备通过主机 (.112)。如果另一台计算机使用不同的设备,则进行相应更改。请注意,此路由不是永久的;它将不是重启后仍可继续使用。Google 查找如何设置永久路由。
sudo ip route add 10.0.3.181 via 192.168.1.112 dev eth0
答案3
另一种方法是安装rinetd
并在里面/etc/rinetd.conf
指定转发:
192.168.1.112 80 10.0.3.181 80
然后重新启动rinetd
。
我认为它更方便,因为您可以随时检查您正在转发哪些端口,并根据需要向文件添加注释。docker
如果您绑定到,您也可以以相同的方式使用它127.0.0.1
(例如:docker ... -p 127.0.0.1:80:80 ...
UFW 将按预期工作。