![来自 Linux 发行版的 ping = 20 秒,来自 Windows/Android 的 ping = 即时。为什么?](https://linux22.com/image/195750/%E6%9D%A5%E8%87%AA%20Linux%20%E5%8F%91%E8%A1%8C%E7%89%88%E7%9A%84%20ping%20%3D%2020%20%E7%A7%92%EF%BC%8C%E6%9D%A5%E8%87%AA%20Windows%2FAndroid%20%E7%9A%84%20ping%20%3D%20%E5%8D%B3%E6%97%B6%E3%80%82%E4%B8%BA%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我希望这对于 Linux 网络爱好者来说是一个有趣的问题。总之,我有一个新的宽带调制解调器/路由器连接到提供 40Mbit/s 带宽的 ISP。然而,在 Linux 发行版上使用浏览器首次连接到任何网站都需要 20 秒的时间,而在 Android 手机或 Windows 上,网站打开的速度与您预期的一样快。 ping 命令(带域名)也需要 20 秒才能显示任何输出(甚至是 IP 地址)。让我们重点关注 ping:
通过 ip 地址 ping 时没有问题。仅当通过域名 ping 时延迟 20 秒
即使我从实时 Linux USB 上尝试,也会出现 20 秒的 ping 延迟 -无论是 Manjaro 还是 Linux Mint
即使我在另一台实时启动 Linux 的计算机上尝试,也会看到延迟
从运行 Windows 的同一台笔记本电脑执行 ping 操作几乎可以立即返回结果 -即使是我以前从未访问过的域。
从运行 Android 的 Pixel 2XL 手机上的终端执行 ping 操作会立即返回结果
无论我通过 wifi 还是通过以太网线将笔记本电脑连接到路由器,问题都存在
同一台笔记本电脑上的同一个 Linux 发行版,当连接到我的移动热点时,不是有问题
Ping -4 强制 IPv4 没有帮助 - 延迟仍然是 20 秒
正如 Manjaro 论坛的一位高级成员所建议的,我尝试从 openresolv 迁移到 systemd-resolved,但这将延迟增加到超过 2 分钟,我不得不回滚更改。
描述完 ping 后,让我描述一下 Firefox 在 Linux 上的工作原理。首次访问任何网站都需要 20 秒,但此后即使我访问了以前从未访问过的网站它按预期打开 - 不到几秒钟,但是,如果我关闭 Firefox 并打开一个新实例,我再次必须等待 20 秒才能访问我访问的第一个网站 - 即使它是 Google。
正如您所意识到的那样,这不是一个“有趣”的问题,而是一个相当令人困惑的问题,对我来说几乎是一个令人震惊的问题。问题具体出在 Linux 和这个新路由器的组合上,我不知道在哪里寻找解决方案。当然,我在 Manjaro 论坛上进行了长时间的讨论,但我却陷入了死胡同。
非常感谢您的阅读!最佳 - 拉姆
网络信息
路由器内部 LANIPv4 地址:192.168.9.1
主DNS:125.22.47.125,辅助DNS 203.145.160.4
(也尝试过 8.8.8.8 作为主 DNS)
我的笔记本电脑:192.168.9.6
*示例和测试输出:
在我键入以下命令 20-30 秒后,会出现以“PING”开头的响应:
[ramkumarr@RR-W520 ~]$ ping www.google.com
PING www.google.com (142.250.192.132) 56(84) bytes of data.
64 bytes from bom12s18-in-f4.1e100.net (142.250.192.132): icmp_seq=1 ttl=118 time=25.1 ms.
[ramkumarr@RR-W520 ~]$ ping -n www.google.com
PING www.google.com (142.250.192.100) 56(84) bytes of data.
64 bytes from 142.250.192.100: icmp_seq=1 ttl=59 time=29.4 m
---> Again a 20s delay before any output appears.
在 Windows 上,响应几乎是瞬时的(不到半秒)
Pinging www.google.com [142.250.182.36] with 32 bytes of data:
Reply from 142.250.182.36: bytes=32 time=11ms TTL=118
在 Linux 上即时使用下面的 IP 地址,但不使用域名,例如www.google.com:
[ramkumarr@RR-W520 ~]$ ping -W 0.001 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
/etc/nsswitch.conf 的内容
# Name Service Switch configuration file.
# See nsswitch.conf(5) for details.
passwd: files mymachines systemd
group: files [SUCCESS=merge] mymachines systemd
shadow: files
publickey: files
hosts: files mymachines mdns4_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] dns mdns4 myhostname
networks: files
protocols: files
services: files
ethers: files
rpc: files
netgroup: files
nslookup 的输出www.google.com- 在 Linux 和 Windows 上均以超时结束。在 Linux 上,输出是瞬时的,直到“地址:142.250.192.132”行,然后是延迟,然后是超时消息。
[ramkumarr@RR-W520 ~]$ nslookup www.google.com
Server: 192.168.9.1
Address: 192.168.9.1#53
Non-authoritative answer:
Name: www.google.com
Address: 142.250.192.132
;; connection timed out; no servers could be reached
[ramkumarr@RR-W520 ~]$
...以及在 Windows 上
C:\Users\ramku>nslookup www.google.com
Server: TJ2100N.Home
Address: 192.168.9.1
DNS request timed out.
timeout was 2 seconds.
Non-authoritative answer:
DNS request timed out.
timeout was 2 seconds.
Name: www.google.com
Address: 142.250.195.100
/etc/resolv.conf 的内容
# Generated by NetworkManager
search Home
nameserver 192.168.9.1
在 Windows 上
C:\Users\ramku>ipconfig /all | find /i "dns servers"
DNS Servers . . . . . . . . . . . : 192.168.9.1
C:\Users\ramku>
在 Linux 上:
[ramkumarr@RR-W520 ~]$ sudo iptables -nvL
[sudo] password for ramkumarr:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
[ramkumarr@RR-W520 ~]$
[ramkumarr@RR-W520 ~]$ ip route get 192.168.9.1
192.168.9.1 dev wlp3s0 src 192.168.9.10 uid 1000
cache
[ramkumarr@RR-W520 ~]$
--> 192.168.9.10 is my laptop ip address
解决方法/解决方案?正如下面的答案之一所建议的,在 wifi 首选项选项卡中设置客户端的 DNS 会强制笔记本电脑访问 Google DNS,但如果没有该设置,笔记本电脑会报告 192.168.9.1 作为 DNS,如下所示:
在 WiFi 首选项中将 DNS 设置为“自动(仅限地址)”
[ramkumarr@RR-W520 ~]$ ( nmcli dev list || nmcli dev show ) 2>/dev/null | grep DNS
IP4.DNS[1]: 8.8.8.8
IP4.DNS[2]: 8.8.4.4
客户端处于“自动”且未指定 DNS
[ramkumarr@RR-W520 ~]$ ( nmcli dev list || nmcli dev show ) 2>/dev/null | grep DNS
IP4.DNS[1]: 192.168.9.1
答案1
对于普通的测试场景,我们将尝试强制您的 Linux Mint 使用谷歌公共 DNS:
- 主 DNS 解析器:
8.8.8.8
(IPv4) - 辅助 DNS 解析器:
8.8.4.4
(IPv4)
您可以相对简单地做到这一点,如下所示:
左键单击您的 Wifi/LAN 图标:
从菜单中单击网络连接:
双击对应的WiFi/LAN:
在连接设置中,转到IPv4 设置标签:
将方法更改为 DHCP仅地址,并填写提到的 DNS 服务器:
点击“保存”,然后关闭/打开您的 WiFi/LAN 链接。
最后,为了确认我们的小实验已成功完成,请将其复制粘贴到您的终端:
( nmcli dev list || nmcli dev show ) 2>/dev/null | grep DNS
显示您现在使用的 DNS:
IP4.DNS[1]: 8.8.8.8
IP4.DNS[2]: 8.8.4.4
现在尝试ping
一些域名。
免责声明
我在此直接推荐使用谷歌产品,我自己不使用,也不推荐给别人。
此答案仅用于测试目的。我不向我的同事推荐这些 DNS 解析器。如果需要为所有人举一个例子,我会推荐1.1.1.1Cloudflare DNS 服务地址:
IPv4
基本的:
1.1.1.1
次要:
1.0.0.1
IPv6
基本的:
2606:4700:4700::1111
次要:
2606:4700:4700::1001
Cloudflare DNS 解析器注重隐私,在某种意义上甚至更安全。更多信息请点击此处。
我进一步拒绝承认我与上述公司之间存在任何从属关系。
答案2
您的 DNS 服务器 192.168.9.1 不提供 DNS 请求。这可以从你的 Windows 和 Linux 系统中看到(我忽略了 Android 系统):
视窗:
nslookup www.google.com Server: TJ2100N.Home Address: 192.168.9.1 DNS request timed out. timeout was 2 seconds. Non-authoritative answer: DNS request timed out. timeout was 2 seconds. Name: www.google.com Address: 142.250.195.100
Linux:
nslookup www.google.com Server: 192.168.9.1 Address: 192.168.9.1#53 Non-authoritative answer: Name: www.google.com Address: 142.250.192.132 ;; connection timed out; no servers could be reached
在这两种情况下,您都可以看到非权威响应后出现超时。这将来自每个系统的本地 DNS 缓存,很可能来自已超过其有效期 (TTL) 的记录。
如果您尝试查找以前从未引用过的主机,我的预期是 Windows 和基于 Linux 的系统都无法将该名称解析为地址。
您需要调查 192.168.9.1 上的服务器并找出它不提供 DNS 请求的原因,因为这就是问题所在。
答案3
感谢从这里和 Manjaro 论坛上的非常有用的输入中学到的所有知识,我能够向 ISP 提出问题并更改我的路由器。该答案中的注释补充了其他答案的描述。
该问题似乎与 192.168.9.1 处的路由器固件如何处理向 192.168.9.1 发出的 DNS 请求有关。一旦 Windows 获得 DNS 地址,它似乎会将其缓存在 DNS 解析器缓存中(我相信),因此 Windows 显然没有问题。然而,Linux 似乎并没有按照此处所述进行操作系统级别的 DNS 缓存https://stackoverflow.com/questions/11020027/dns-caching-in-linux1,因此每个 ping 请求都会因为将 192.168.9.1 视为 DNS 服务器而导致路由器显示 20 秒挂起。路由器固件到底在哪里表现出恶意行为尚不清楚,但很明显,在客户端添加 Google DNS 服务器可以有效地绕过该恶意固件。更换路由器解决了问题。