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

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

我在服务器端有两个网卡,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

服务器端

# 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!

客户

# 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!

服务器端

$ 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

答案1

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

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

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

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

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

答案2

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

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

答案3

经过大量搜索,我发现为什么 netcat 不使用与 IP 关联的正确接口?,这是同样的问题。正如@telcoM所说,传出流量将被发送到第一个接口,这就是问题所在,因此,解决此问题的最简单方法是:

ip route add default via 192.168.8.142 dev eth1 table 142
ip rule add from 192.168.8.142 table 142

该路由将ip route get 192.168.8.135 from 192.168.8.142返回 eth1 而不是 eth0。然后一切都会按预期进行。

相关内容