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 客户端通信。