Linux 使用错误的网络接口

Linux 使用错误的网络接口

我使用搭载 Debian 11 和内核 6.1 的 Odroid 设备作为我的 NAS。我尝试了较旧的内核版本(5.10 等),但没有任何区别。

我最近连接了第二个网络接口,所以现在我得到:

  • eth0(内置1Gb/s以太网端口),IP:192.168.1.155。
  • eth1(USB 3.0 1Gb/s 以太网卡),IP:192.168.1.156。

在 netplan 中,设备配置为使用单个 IP 地址 eth0:

addresses:
  - 192.168.1.155/32

eth1:

addresses:
  - 192.168.1.156/32

ifconfig:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 192.168.1.155  netmask 255.255.255.255  broadcast 0.0.0.0
    inet6 X  prefixlen 64  scopeid 0x20<link>
    ether X  txqueuelen 1000  (Ethernet)
    RX packets 23767007  bytes 1991691527 (1.8 GiB)
    RX errors 0  dropped 4484  overruns 0  frame 0
    TX packets 39239638  bytes 58168353216 (54.1 GiB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    device interrupt 24
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 192.168.1.156  netmask 255.255.255.255  broadcast 0.0.0.0
    inet6 X  prefixlen 64  scopeid 0x20<link>
    ether X  txqueuelen 1000  (Ethernet)
    RX packets 2532258  bytes 202799128 (193.4 MiB)
    RX errors 1  dropped 2821  overruns 0  frame 0
    TX packets 1164474  bytes 16121299674 (15.0 GiB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

IP路由:

default via 192.168.1.1 dev eth0 proto dhcp src 192.168.1.155 metric 100
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.156
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.155
192.168.1.1 dev eth0 proto dhcp scope link src 192.168.1.155 metric 100

似乎我的 USB3.0 eth1 接口速度较慢(最大传出速度约为 830Mb/s),而 eth0 速度较慢(约为 980Mb/s)。

我总是通过 访问我的 NAS 192.168.1.155(因此它应该转到 NAS 上的 eth0),但我注意到速度降低了。检查后ipconfig,我注意到TX packets错误的接口上的速度增加了。

这似乎非常随机。通常,我可以通过关闭eth1:来解决所有速度降低的问题sudo ip link set eth1 down

有时,当我通过 访问 NAS 时,192.168.1.156它也会链接到错误的接口。我得到的不是降低的速度,而是完整的速度eth0,而不是eth1

我正在使用 Windows SMB 和 Filezilla 的 SFTP 来测试这些速度。

所以我的问题是,我做错了什么?为什么 Linux 只选择一个接口(随机),并将其用于我在两个 IP 上的请求:*.155 和 *.156?

编辑:

我认为我解决了这个问题。我在这里找到了一些有用的信息:https://unix.stackexchange.com/questions/4420/reply-on-same-interface-as-incoming

步骤1:

sysctl -w net.ipv4.conf.default.arp_filter=1
sysctl -w net.ipv4.conf.all.arp_filter=1
sysctl -w net.ipv4.conf.default.arp_ignore=1
sysctl -w net.ipv4.conf.all.arp_ignore=1

第2步:

reboot

步骤3:

我根据原始/默认输出创建了一个 .sh 脚本ip route

#!/bin/bash
# crontab -e
# @reboot sleep 120; /home/mona/ip_route_rules_for_separate_eth0_eth1.sh

if grep -Fxq '252     ispa' "/etc/iproute2/rt_tables"; then
    echo ""
else
    echo '252     ispa' >> "/etc/iproute2/rt_tables"
fi
if grep -Fxq '251     ispb' "/etc/iproute2/rt_tables"; then
    echo ""
else
    echo '251     ispb' >> "/etc/iproute2/rt_tables"
fi

#Eth1:
ip rule add from 192.168.1.156 table ispa prio 1
ip route add 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.156 table ispa
ip route add 192.168.1.1 dev eth1 proto dhcp scope link src 192.168.1.156 metric 100 table ispa
ip route add default via 192.168.1.1 dev eth1 proto dhcp src 192.168.1.156 metric 100 table ispa

#Eth0:
ip rule add from 192.168.1.155 table ispb prio 1
ip route add 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.155 table ispb
ip route add 192.168.1.1 dev eth0 proto dhcp scope link src 192.168.1.155 metric 100 table ispb
ip route add default via 192.168.1.1 dev eth0 proto dhcp src 192.168.1.155 metric 100 table ispb

我在重启时使用了 croon 作业,但这可能是错误的,因为界面重启不会应用规则。

有谁知道我该如何重写这些命令以便由 netplan 执行?

答案1

arp_filter = 1除了需要您设置基于源的路由之外,还请考虑arp_ignore = 1

1 - 仅当目标 IP 地址是传入接口上配置的本地地址时才回复

參考文獻:https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt

相关内容