lxc - 主机局域网上的 LXC 容器
问题描述
我的 LXC 容器通常与专用网络上的伪装网桥一起使用。
这次我想把容器放在主机的局域网上,但是我没有得到任何结果。我在 debian 上使用 LXC 2.0.7-2+deb9u2,我参考了这个文档:LXC/SimpleBridge。
cfrbr0 是主机上的网桥,它的 IP 是 192.168.0.12/24,它包含物理接口(没有 IP)和 lxc-net 服务已关闭。
[config]
lxc.network.type = veth
lxc.network.name = eth0
lxc.network.flags = up
lxc.network.ipv4.gateway = auto
lxc.network.link = cfrbr0
lxc.network.ipv4 = 192.168.0.13/24
[lxc-usernet]
test veth cfrbr0 100
$ sudo service lxc-net stop
$ lxc-start -n test-ct
$ lxc-attach -n test-ct -- sudo -i
# ip a
24: eth0@if25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 9e:82:4f:5a:6c:74 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.13/24 brd 192.168.0.255 scope global eth0
valid_lft forever preferred_lft forever
# ip r
default via 192.168.0.12 dev eth0
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.13
# ping 192.168.0.12
PING 192.168.0.12 (192.168.0.12) 56(84) bytes of data.
64 bytes from 192.168.0.12: icmp_seq=1 ttl=64 time=0.081 ms
但 :
# ping 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
From 192.168.0.12: icmp_seq=2 Redirect Host(New nexthop: 192.168.0.254)
主机 ping 1.1.1.1 并且 veth 被添加到网桥。主机上的 IP 转发设置为 1。仅供参考,主机是 macOS 上的虚拟机虚拟机(在 debian 拉伸虚拟机上也有同样的问题)。
我认为我错误地配置了主机共享网桥,因为我对伪装网桥和 LXC 专用网络没有问题。作为一种解决方法,是否有可能使用伪装的网桥将容器放入本地网络?
谢谢你的建议 !
解决方案
在 Mac 上(通过 WiFi?)使用 VirtualBox 时,由于 WiFi 桥接的工作方式(https://docs.oracle.com/en/virtualization/virtualbox/6.0/user/network_bridged.html),这需要不同的方法。
此设置中的关键是不要桥接eth0
并且不要使用lxc-net
. 在主机上, /etc/network/interfaces 是标准的:
auto eth0
iface eth0 inet static
address 192.168.0.8
netmask 255.255.255.0
gateway 192.168.0.1
不需要网桥(否lxc-net
),但将容器配置设置为创建虚拟接口:
lxc.net.0.type = veth
lxc.net.0.veth.pair = veth0
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx
lxc.net.0.ipv4.address = 192.168.0.64/32
lxc.net.0.ipv4.gateway = 192.168.0.8
lxc.net.0.script.up = /var/lib/lxc/netup.sh 192.168.0.64
lxc.net.0.script.down = /var/lib/lxc/netdown.sh 192.168.0.64
关于此配置的一些注意事项:(1)没有,lxc.net.0.link
因为我们不需要网桥,(2)lxc.net.0.ipv4.gateway
地址是主机的 IP 地址,(3)注意网络掩码是/32
,(4)脚本解释如下。
该netup.sh
脚本将传入的 IP 流量路由到容器并创建一个 ARP 条目,以便eth0
接受它的流量:
#!/bin/sh
ip route add ${1}/32 dev veth0
arp -i eth0 -Ds ${1} eth0 pub
该netdown.sh
脚本只是删除了 ARP 条目(IP 路由在veth0
被破坏时会自动消失)。
#!/bin/sh
arp -d -i eth0 ${1} pub
在客户机上,/etc/network/interfaces 可以为空,因为在这种情况下,设置是在容器配置文件中完成的。
主机上的最终结果:
# ip route
default via 192.168.0.1 dev eth0 metric 202
192.168.0.0/24 dev eth0 scope link src 192.168.0.8
192.168.0.64 dev veth0 scope link
# arp -a
...
? (192.168.0.64) at 00:16:3e:xx:xx:xx [ether] on veth0
? (192.168.0.64) at * PERM PUP on eth0
# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:xx:xx:xx
inet addr:192.168.0.8 Bcast:0.0.0.0 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:11476 errors:0 dropped:0 overruns:0 frame:0
TX packets:10425 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1253928 (1.1 MiB) TX bytes:1328460 (1.2 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:1 errors:0 dropped:0 overruns:0 frame:0
TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:112 (112.0 B) TX bytes:112 (112.0 B)
veth0 Link encap:Ethernet HWaddr FE:9D:3D:14:4B:87
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:20 errors:0 dropped:0 overruns:0 frame:0
TX packets:20 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1748 (1.7 KiB) TX bytes:1748 (1.7 KiB)
在容器中:
# ip route
default via 192.168.0.8 dev eth0
192.168.0.8 dev eth0 scope link
# ifconfig
eth0 Link encap:Ethernet HWaddr 00:16:3E:xx:xx:xx
inet addr:192.168.0.64 Bcast:255.255.255.255 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:247 errors:0 dropped:0 overruns:0 frame:0
TX packets:247 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:23322 (22.7 KiB) TX bytes:23322 (22.7 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
# ping -c 3 1.1.1.1
PING 1.1.1.1 (1.1.1.1): 56 data bytes
64 bytes from 1.1.1.1: seq=0 ttl=58 time=43.458 ms
64 bytes from 1.1.1.1: seq=1 ttl=58 time=41.121 ms
64 bytes from 1.1.1.1: seq=2 ttl=58 time=40.891 ms
--- 1.1.1.1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 40.891/41.823/43.458 ms
我知道问题中已经说明了这一点,但是对于从头开始的任何人,请确保启用转发,echo 1 > /proc/sys/net/ipv4/ip_forward ; echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
.
我的另一个答案适用于 KVM,可能对其他人有用,所以我不会对其进行编辑,但这个答案更特定于 VirtualBox 和 WiFi。
推荐阅读
- ruby-on-rails - Rails、Webpacker、Terser keep_fnames
- r - 如何在组中创建带有刻度颜色的 geom_hex 图?
- oracle - Oracle:如何有效地将表从一个模式复制到不同数据库和服务器上的另一个模式
- java - 在递归调用方法的情况下返回
- neural-network - 获取星期几的激活函数
- flutter-layout - 如何在 Flutter 中的圆环图孔中添加饼图,我尝试使用 Stack 小部件,但它仅适用于文本
- python - 在带有 if 条件的整个数据帧上的 pandas 中使用 applymap
- sql-server - 存储过程需要以自定义格式返回唯一值,但似乎返回重复项
- android - 当我使用proguard并启用minify和shrinkresources时,Retrofit body request是空白的
- javascript - 在 javascript 中为数组和对象使用 variable.length 时需要注意什么?