我在服务器端有两个网卡,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。然后一切都会按预期进行。