Linux 随机将数据包路由到错误的接口

Linux 随机将数据包路由到错误的接口

我拥有一台专用服务器,上面运行着一些 kvm vps 供我的客户使用。我的主要网络是 192.168.1.0/24。vps 在桥接接口 brv6 上有一个专用网络 192.168.2.0/24。ipv6 流量通过我的 isp 路由器,因为每个 vps 都有自己的 ipv6 地址。但为了我的安全,ipv4 流量通过 nordvpn wireguard vpn (10.5.0.1/24) 路由。以下是 vps 的路由表:

default dev wg0 scope link
192.168.1.0/24 dev br0 scope link

来自 brv6 的所有内容都使用此路由表。

ip rule add iif brv6 table vps

以下是一个例子:

192.168.2.0/24 <==> 10.5.0.1/24 <==> 互联网

VPS <==> NordVPN <==> 互联网

由于 nordvpn 服务器不知道网络 192.168.2.0/24,我在 192.168.2.0/24 和 10.5.0.1/24 之间放置了一个 NAT,以便每个数据包都使用我的 nordvpn 客户端 ip(10.5.0.2)进行 NAT。

iptables -t nat -o wg0 -j MASQUERADE

但有时(随机),一些客户端告诉我他们没有 ipv4 访问权限。经过检查,我发现一些数据包没有经过 wireguard,而是在物理接口(brv6 物理网卡)中。

tcpdump -nni enp3s0f1 ip

另外,conntrack -L显示源地址未经过 NAT 的连接(在 192.168.2.0/24 而不是 10.5.0.2)

我真的找不到办法让它工作。也许你们有什么主意?

服务器在 Linux 5.10 上运行 Debian 11

答案1

经过一番努力搜索,我发现了问题所在。brv6 网络内的虚拟机正在发送 ARP 广播以获取 brv6 网关 MAC 地址。brv6 和 br0 都在交换机上。但 br0 接口正在响应 ARP 数据包,即使它不是为它而响应。因此,虚拟机获得了 brv6 的 ARP 条目,其 MAC 为 br0(它们无法访问)。

为了解决这个问题,我设置了 arptables 规则来阻止目标为 192.168.2.1 (brv6) 的 ARP 到达 br0。反之亦然:阻止 brv6 接收发往 br0 的 ARP。

arptables -A INPUT -i br0 -d 192.168.2.1 -j DROP
arptables -A INPUT -i brv6 -d 192.168.1.138 -j DROP

我不知道这是 Linux 内核的一个特性还是一个错误。无论如何,我找到了解决方案,希望这能对大家有所帮助。

相关内容