有线连接优先于无线连接

有线连接优先于无线连接

我将两台 Linux 机器连接在一起。一台机器通过无线方式连接到我的路由器,而另一台机器则没有。没有无线接入的机器 (PC1) 配置为具有唯一的静态 IP,而另一台机器 (PC2) 设置为其默认网关。PC2 也配置为具有唯一的 IP 并使用路由器作为默认网关。当我启用有线连接时,PC1 可以与 PC2 的 eth0 和 wlan0 接口通信,PC2 可以与 PC1 通信。不幸的是,当启用有线连接时,PC2 无法与路由器通信,因此 PC1 也无法通信。本质上,PC2 有线和无线连接不能同时运行。

PC2(注意:route-n无论有线是否启用都是相同的)

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.0.0.138      0.0.0.0         UG    0      0        0 wlan0
10.0.0.0        0.0.0.0         255.255.255.0   U     1      0        0 eth0
10.0.0.0        0.0.0.0         255.255.255.0   U     9      0        0 wlan0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0

docker0   Link encap:Ethernet  HWaddr 56:84:7a:fe:97:99  
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

eth0      Link encap:Ethernet  HWaddr 60:a4:4c:62:ee:86  
          inet addr:10.0.0.140  Bcast:10.0.0.255  Mask:255.255.255.0
          inet6 addr: fe80::62a4:4cff:fe62:ee86/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:155 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7744 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:12554 (12.5 KB)  TX bytes:1509568 (1.5 MB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:2179347 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2179347 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:217854881 (217.8 MB)  TX bytes:217854881 (217.8 MB)

wlan0     Link encap:Ethernet  HWaddr c0:4a:00:66:58:98  
          inet addr:10.0.0.103  Bcast:10.0.0.255  Mask:255.255.255.0
          inet6 addr: fe80::c24a:ff:fe66:5898/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1605422 errors:0 dropped:0 overruns:0 frame:0
          TX packets:669649 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1405768536 (1.4 GB)  TX bytes:83997471 (83.9 MB)

PC1(注意:我无法检索 PC1 的 ifconfig)

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.0.0.139      0.0.0.0         UG    0      0        0 eth0
10.0.0.0        0.0.0.0         255.255.255.0   U     1      0        0 eth0

答案1

PC2 路由表的当前设置是您的问题。我在此处重现了该设置,删除了不重要的列,并从网络掩码转换为 CIDR 表示法:

Destination     Gateway         Metric Iface
0.0.0.0/0       10.0.0.138      0      wlan0
10.0.0.0/24     0.0.0.0         1      eth0
10.0.0.0/24     0.0.0.0         9      wlan0

第一行用简单的英语来说就是“到所有其他站点的流量都通过 10.0.0.138 网关发送”。

第二行和第三行提供相同的目的地,因此较低的度量获胜。第 3 行甚至可能不存在。用简单的英语来说就是“要到达网关 10.0.0.138 和所有其他 10.0.0.* 对等点,请通过 eth0 发送”

总之,这会导致发往 Internet 的流量通过 eth0,从而导致缺乏连接。

出现此问题的原因是,您在同一网络中的两个不同桥接域中使用了同一个子网,这是不允许的。停止这种行为!

将 PC2 的 eth0 接口的网络掩码更改为 255.255.252.0,并为其指定一个距路由器较远的 IP 地址,这会将路由表更改为(例如,为 PC2 eth0 指定 10.0.0.21,为 PC1 eth0 指定 10.0.0.22)

Destination     Gateway         Metric Iface
0.0.0.0/0       10.0.0.138      0      wlan0
10.0.0.20/30    0.0.0.0         1      eth0
10.0.0.0/24     0.0.0.0         9      wlan0

现在到网关 10.0.0.138 的流量根本不会与第二行匹配,并且会正确使用第三行。

更好的方法是使用不重叠的范围进行有线连接,例如 10.0.1.x

为了让 PC1 也能访问互联网,您的路由器需要通过 PC2 发送发往 PC1 的流量。有两种方法可以设置:更改路由器的路由表,或配置 PC2 执行代理 ARP。

答案2

我认为有几件事可能会导致您出现问题:

  1. 您声明 PC1 使用 PC2 作为其默认网关,但 PC1 的路由表实际上显示10.0.0.139为默认网关,而不是 PC2 的 eth0 接口10.0.0.140
  2. 如果 PC2 负责路由来自 PC1 的流量,您是否已在 PC2 上启用 IP 转发?我不认为 Linux 默认启用此功能。使用 进行检查cat /proc/sys/net/ipv4/ip_forward。如果为 0,则 PC2 将丢弃 PC1 发送给它的所有可路由流量。如果需要打开它,请指导
  3. 如果 PC2 上确实启用了 IP 转发,iptables 是否已配置为接受到达其前向链的流量?iptables -nvL检查前向链的规则。

相关内容