我在服务器端有两个网卡 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
TCP/IP 网络堆栈有两种可能的设计模型:强主机模型和弱主机模型。您期望与强大的主机模型相匹配的行为。Linux 旨在使用弱主机模型。一般来说,弱主机模型更常见,因为它降低了路由代码的复杂性,因此可能提供更好的性能。否则,这两个主机模型只是不同的设计原则:没有一个天生就比另一个更好。
基本上,弱主机模型意味着传出流量将被发送到路由表中列出的第一个与目标 IP 地址匹配的接口(或选择的网关,如果目标不能直接到达),而不考虑源 IP地址。
这基本上就是为什么如果您在同一网段上需要两个 IP 地址,通常不建议使用两个单独的物理接口。而是为一个接口分配两个 IP 地址(IP 别名:例如 eth1 = 192.168.8.142 和 eth1:0 = 192.168.8.140)。如果您需要的带宽超过单个接口所能提供的带宽,请将两个或多个接口绑定(或组合,如果适用)在一起,然后在绑定/组合上运行两个 IP。
通过调整一些 sysctl 设置并使用“高级路由”功能为每个 NIC 设置独立的路由表,可以使 Linux 表现得像一个强主机模型系统。但这是一个非常特殊的配置,我建议在实施之前三思而后行。
请参阅Linux 源路由、强端系统模型/强主机模型中的答案?如果你真的需要它。
另外需要考虑的一点是 eth1 接口配置了子网掩码 255.255.255.255。
这意味着 eth1 接口被配置为在其网络接口上没有其他设备(主机)。这意味着它将无法与您的 192.168.8.142 客户端通信。
经过大量搜索,我发现为什么netcat没有使用与IP关联的正确接口?,这是同样的问题。正如@telcoM 所说,传出流量将发送到第一个接口,这就是问题所在,因此,解决此问题的最简单方法是:
此路由将
ip route get 192.168.8.135 from 192.168.8.142
返回 eth1 而不是 eth0。然后一切都按预期工作。