我在 Ubuntu 20.04 上使用 LXD 4.0.9,创建了一个网络、一个配置文件,并向无人机添加了存储,如下所示……
$ lxc network create drone_lan ipv4.address=none ipv6.address=none
$ lxc profile create p-drone
$ lxc profile device add p-drone root disk path=/ pool=default
$ lxc profile device add p-drone drone_lan nic name=enp5s0 network drone_lan
然后我创建几个实例,将它们连接到网络,然后进入第一个实例......
$ lxc launch ubuntu:20.04 drone1
$ lxc launch ubuntu:20.04 drone2
$ lxc network attach drone_lan drone1
$ lxc network attach drone_lan drone2
$ lxc exec drone1 -- bash
drone1
我想要从内部安装一个包,但是得到以下信息:
root@drone1:~# sudo apt install tree
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package tree
因为网络桥是管理的drone_lan
,所以我需要做的就是根据https://documentation.ubuntu.com/lxd/en/latest/howto/network_bridge_firewalld/
由于我使用的是 Ubunto 20.04,因此我执行以下操作但无济于事。
$ sudo ufw allow in on drone_lan
$ sudo ufw route allow in on drone_lan
$ sudo ufw route allow out on drone_lan
由于我也有 Docker 并且无法删除它,所以还做了以下操作:
取消注释/etc/sysctl.d/99-sysctl.conf
net.ipv4.conf.all.forwarding=1
然后重新启动sudo systemctl restart systemd-sysctl
然后重新启动drone1
实例并尝试执行 apt 安装。没有用。
我希望所有连接到的实例都drone_lan
能够访问互联网。
有人能提供建议吗?
答案1
以下是一种方法:
在主机上,使用 Netplan 创建网桥:
network:
version: 2
renderer: networkd
ethernets:
enp0s7:
dhcp4: false
dhcp6: false
bridges:
br0:
interfaces: [enp0s7]
dhcp4: true
dhcp6: true
注意:主机的 IP 地址(来自 DHCP)在应用时会发生变化!br0 MAC 地址与 enp0s7 MAC 地址不同。要连接到主机,请使用新的 br0 IP 地址。
添加到每个容器的配置文件(或添加到默认配置文件,或创建名为“网络”的配置文件):
devices:
eth0:
name: eth0
nictype: bridged
parent: br0
type: nic
此方法不需要处理防火墙或 VLAN。无需数据包转发。您可以看到每个网卡直接与主机桥通信。IP 地址由上游路由器分发,因此主机服务器和所有容器都位于同一个 LAN 上,并且路由器可以看到它们。
当然,这只是一个测试系统上非常简单的工作示例。您可以根据需要将其设计得尽可能复杂。