所以我偶然发现了一个我无法解决的问题。我设置了两台主机,每台都有两个 LXD VM 容器。两台都通过 Snap 运行 LXD。一台主机运行 Ubuntu 22.04,带有两个 Ubuntu 22.04 容器。另一台主机运行 Debian 12,带有两个 Debian 12 容器。我在容器上设置了 netplan,并在两台主机上安装了 bridge-utils 等。然后我在两台主机上配置了网桥,并在这些主机上配置了容器以使用它们,所有这些都使用完全相同的配置。
主办方
ip link add dev lxdbr0 type bridge
ip addr add 172.16.0.254/16 broadcast 172.16.255.255 dev lxdbr0
ip link set lxdbr0 up
LXD 容器 1
LXD 配置
devices:
lxdbr0:
hwaddr: 00:16:3e:fb:7d:1c
nictype: bridged
parent: lxdbr0
type: nic
网络计划
network:
version: 2
ethernets:
enp0s0:
match:
macaddress: 00:16:3e:fb:7d:1c
set-name: enp0s0
dhcp4: false
addresses:
- 172.16.0.1/16
routes:
- to: 172.16.0.0/16
via: 172.16.0.254
LXD 容器 2
LXD 配置
devices:
lxdbr0:
hwaddr: 00:16:3e:fb:7d:8d
nictype: bridged
parent: lxdbr0
type: nic
网络计划
network:
version: 2
ethernets:
enp0s0:
match:
macaddress: 00:16:3e:fb:7d:8d
set-name: enp0s0
dhcp4: false
addresses:
- 172.16.0.2/16
routes:
- to: 172.16.0.0/16
via: 172.16.0.254
这在 Ubuntu 主机上运行良好,但在 Debian 主机上遇到了一些问题。普通 TCP 运行良好,但由于某种原因,它会在容器之间丢弃 ICMP。我可以从主机 ping 每个容器,但无法从另一个容器 ping 一个容器。起初我以为存在一般连接问题,但我尝试在其中一个容器上安装 nginx,而该容器可以通过curl
另一个容器完全访问。
就像我上面提到的那样。每个主机及其容器上的两种配置都相同。也许 Ubuntu 的 Cloud Init 是它只在 Ubuntu 上工作的原因?但为什么只有 ICMP?
没有进行任何 iptables 配置,也没有安装和配置 ufw 或其他防火墙。
我尝试了所有ip
我能想到的命令检查,所有命令都显示两个安装之间的配置相同。我尝试了 tcpdump 和我能找到的各种其他监控选项,但无法弄清楚这些数据包丢失的原因和位置。
答案1
似乎我的 Ubuntu 安装net.ipv4.conf.all.forwarding=1
在某个地方配置了。不确定在哪里,因为我查看了/etc/sysctl.conf
和/etc/sysctl.d/
。但默认情况下,所有内容都启用了转发,而 Debian 安装中并非如此。启用此功能确实可以解决问题,尽管我不确定为什么这只影响 ICMP 请求数据包。我并不是一个真正的网络专家,但是“curl”http 请求不是以 ARP 数据包开头的吗?发现curl
可以通过但ping
不能通过的奇怪现象。