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


20

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

为什么所有流量都经过eth0而不是eth1?我希望每个接口可以得到1 Gbit / s。我的设置或配置出了什么问题?

服务器

ifconfig

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
听起来您真正在寻找的是接口绑定:wiki.linuxfoundation.org/networking/bonding
Flexo,

@flexo是完全正确的-根据您的最终目标,将两个网络接口绑定在一起可以为您提供更多的整体带宽,但是绑定选项有所不同。最好得到的是2个〜1 Gbit的流,而不是1个2 Gbit的流。另外,您还需要管理型以太网交换机的服务。同样,绑定4可以一次产生4x 1 Gbit流量。
克里基

Answers:


32

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

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

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

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

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


如果尝试使用iptables调整流量,则默认模式也是一个令人惊讶的惊喜:)
rackandboneman

是的,过去我实现了强大的宿主模型很有趣。该项目是必需的,但我不会为个人计算机而经历这种头痛。
Baldrickk

11

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

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


2

经过大量搜索,我发现为什么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。然后一切都会按预期进行。


3
如果您省略了我提到的问题中提到的ARP sysctl设置,并且正在处理企业级交换机和路由器,那么您的网络管理员会对您感到不满意,因为它会在路由器上引起不必要的“ IP地址漂移”消息,因为系统可能仍会回答两个接口上两个IP的ARP请求。或者,如果您在网络中具有IP劫持保护,则它可能会占用并禁用所有到系统的流量。
telcoM
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.