为什么 Linux 网络流量只通过 eth0?

wen*_*ner 20 linux networking network-interface alpine-linux

我在服务器端有两个网卡, eth0 ?192.168.8.140 和 eth1 ?192.168.8.142。客户端向 192.168.8.142 发送数据,我希望iftop显示 eth1 的流量,但它没有。所有网络都经过eth0,那么如何测试两个网卡?

为什么所有的流量都通过 eth0 而不是 eth1?我预计每个接口可以获得 1 Gbit/s。我的设置或配置有什么问题?

服务器

如果配置

eth0    Link encap:Ethernet  HWaddr 00:00:00:19:26:B0
        inet addr:192.168.8.140  Bcast:0.0.0.0  Mask:255.255.252.0
        inet6 addr: 0000::0000:0000:fe19:26b0/64 Scope:Link
        UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
        RX packets:45287446 errors:0 dropped:123343 overruns:2989 frame:0
        TX packets:3907747 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:1000
        RX bytes:66881007720 (62.2 GiB)  TX bytes:261053436 (248.9 MiB)
        Memory:f7e00000-f7efffff

eth1    Link encap:Ethernet  HWaddr 00:00:00:19:26:B1
        inet addr:192.168.8.142  Bcast:0.0.0.0  Mask:255.255.255.255
        inet6 addr: 0000::0000:0000:fe19:26b1/64 Scope:Link
        UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
        RX packets:19358 errors:0 dropped:511 overruns:0 frame:0
        TX packets:14 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:1000
        RX bytes:1772275 (1.6 MiB)  TX bytes:1068 (1.0 KiB)
        Memory:f7c00000-f7cfffff
Run Code Online (Sandbox Code Playgroud)

服务器端

# Listen for incomming from 192.168.8.142
nc -v -v -n -k -l 192.168.8.142 8000 | pv > /dev/null
Listening on [192.168.8.142] (family 0, port 8000)
Connection from 192.168.8.135 58785 received!
Run Code Online (Sandbox Code Playgroud)

客户

# Send to 192.168.8.142
time yes | pv |nc -s 192.168.8.135 -4 -v -v -n 192.168.8.142 8000 >/dev/null
Connection to 192.168.8.142 8000 port [tcp/*] succeeded!
Run Code Online (Sandbox Code Playgroud)

服务器端

$ iftop -i eth0
interface: eth0
IP address is: 192.168.8.140

TX:             cumm:  6.34MB   peak: 2.31Mb   rates: 2.15Mb  2.18Mb  2.11Mb
RX:                    2.55GB          955Mb           874Mb   892Mb   872Mb
TOTAL:                 2.56GB          958Mb           877Mb   895Mb   874Mb

$ iftop -i eth1
interface: eth1
IP address is: 192.168.8.142

TX:             cumm:      0B   peak:     0b   rates:     0b      0b      0b
RX:                    4.51KB         3.49Kb          3.49Kb  2.93Kb  2.25Kb
TOTAL:                 4.51KB         3.49Kb          3.49Kb  2.93Kb  2.25Kb

$ ip link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:00:00:19:26:b0 brd ff:ff:ff:ff:ff:ff
$ ip link show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:00:00:19:26:b1 brd ff:ff:ff:ff:ff:ff
Run Code Online (Sandbox Code Playgroud)

tel*_*coM 33

TCP/IP 网络堆栈有两种可能的设计模型:强主机模型和弱主机模型。您期待与强宿主模型相匹配的行为。Linux 旨在使用弱主机模型。一般来说,弱主机模型更常见,因为它降低了路由代码的复杂性,从而可能提供更好的性能。否则,这两种主机模型只是不同的设计原则:两者都没有本质上优于另一个。

基本上,弱主机模型意味着传出流量将被发送到路由表中列出的与目标 IP 地址匹配的第一个接口(或所选网关,如果目标无法直接到达),而不考虑源 IP地址.

这基本上就是为什么如果您在同一网段上需要两个 IP 地址,通常不建议使用两个单独的物理接口。而是为一个接口分配两个 IP 地址(IP 别名:例如 eth1 = 192.168.8.142 和 eth1:0 = 192.168.8.140)。如果您需要的带宽超过单个接口所能提供的带宽,请将两个或多个接口绑定(或组,如果适用),然后在绑定/组上运行两个 IP。

通过调整许多 sysctl 设置并使用“高级路由”功能为每个 NIC 设置独立的路由表,可以使 Linux 表现得像一个强主机模型系统。但这是一个非常特殊的配置,我建议在实施之前三思而后行。

请参阅Linux 源路由、强端系统模型/强主机模型中的答案如果你真的需要它。


Mik*_*ike 11

需要考虑的另一点是 eth1 接口配置了子网掩码 255.255.255.255。

这意味着 eth1 接口被配置为在其网络接口上没有其他设备(主机)。这意味着它将无法与您的 192.168.8.142 客户端通信。