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