我在 Raspberry Pi 上运行 Arch Linux。
突然:
- 我无法 ping 通网站。
- 我无法从浏览器访问网站。
我还有两台计算机(均运行 Arch Linux)连接到互联网,我可以 ping 并使用互联网。此外,/etc/resolv.conf
在其他计算机上也是相同的:
nameserver 10.230.252.252
nameserver 203.147.88.2
nameserver 8.8.8.8
search domain.name
我可以使用VNC。我也可以 ping 到 8.8.8.8。当尝试在 Chromium 上访问 DuckDuckGo 时,我得到:
This site can’t be reached
duckduckgo.com’s server IP address could not be found.
DNS_PROBE_FINISHED_NXDOMAIN
我有有效的互联网连接。怎么了?
答案1
虽然我的另一台运行 Arch Linux 的 x86_64 PC 从未遇到过问题,但迄今为止,在使用 Arch Linux ARM 运行 NetworkManager 时,这种情况经常发生。
问题就好像你连接了wifi,但无法ping通或使用互联网,但可以访问本地网络上的所有计算机,甚至可以使用远程桌面共享软件。
当您的 ping 或浏览器尝试解析主机时,很有可能出现问题。我能想到3种解决方案:
解决方案1
我相信这是数千个运行 Archlinux ARM 并使用 NetworkManger 的 Raspberry Pi 系统上的问题。
就我而言, /etc/resolv.conf 是一个损坏的符号链接../run/systemd/resolve/stub-resolv.conf
。
NetworkManager 无法填充符号链接,并且 /etc/resolv.conf 为空。我们必须:
- 删除损坏的符号链接:
# rm /etc/resolv.conf
- 创建一个
/etc/NetworkManager/conf.d/dns.conf
包含以下内容的文件:
[main]
dns=none
main.systemd-resolved=false
- 重新启动网络管理器:
sudo systemctl restart NetworkManager
如果没有遵循解决方案 2,这应该可以解决问题。
解决方案2
如果上述方法未能解决您的问题,您可以通过以下方式临时填充 /etc/resolv.conf:
sudo systemctl restart systemd-resolved && sudo systemctl stop systemd-resolved
这样做的原因是因为可能有什么东西弄乱了文件/etc/resolv.conf
。上面的命令应该覆盖内容,但同样,您应该查看导致问题的原因。
解决方案3
如果您无法恢复/etc/resolv.conf
,只需创建一个新的/etc/resolv.conf
(如果存在空的旧链接或符号链接,则删除)并粘贴代码:
search domain.name
nameserver 8.8.8.8
nameserver 1.1.1.1
nameserver 1.0.0.1
请注意,在第一行中,您还可以使用路由器的 IP 地址,例如(nameserver 192.168.43.1
在我的例子中),这将使同一网络上的其他系统可 ping 通。像这样生成解析并不是一个好主意,但我在 NetworkManager 自动生成的解析中遇到了麻烦。 Systemd-resolvd 也会生成错误的,即使在我的电脑上也是如此。
有点奇怪,这里我使用google的主dns和cloudflare的主dns,你可以使用8.8.8.8与8.8.4.4或1.1.1.1与1.0.0.1。
尽管该步骤有效,但您可能希望阻止 NetworkManager 在重新启动时覆盖该文件:
将此条目添加到/etc/NetworkManager/NetworkManager.conf
[main]
dns=none
systemd-resolved=false
他们适用于我在 Raspberry Pi 3 B 型上的安装。希望这也适合您。
答案2
我刚刚遇到了同样效果的问题。检查时间设置是否正确。 DNSSEC 似乎默认启用,并由于“过期”证书而阻止请求。
与此相关的一些其他问题可以通过 来诊断journalctl -u systemd-resolved -b -0
。
答案3
我在运行 Arch Linux 的 Raspberry Pi 4 上遇到了这个问题。
症状是没有 DNS,从而产生ping
错误消息。
我打电话发现date
时间严重不对劲,大约是两天前。
我确定时间同步正在进行,systemctl status systemd-timesyncd
但从输出中注意到timedatectl timesync-status
该服务没有 NTP 服务器的 IP 地址(它说Server: Null
)。
使用jaku255 的提示检查后journalctl -u systemd-resolved -b -0
,我发现时间同步不起作用,因为 DNS 失败:
对于问题 ntp.org IN DS 的 DNSSEC 验证失败:签名已过期
这有点僵局:DNS 不工作是因为时间错误,时间错误是因为 DNS 不工作。
尝试手动设置时间,我发出了
timedatectl set-time "2020-02-29 10:51:55"
但这产生了一个错误:
设置时间失败:自动时间同步已启用
为了解决这个问题,我暂时(呵呵^^)禁用了时间同步
timedatectl set-ntp 0
然后再次调用timedatectl set-time
,这次成功了。
之后,我重新激活了时间同步timedatectl set-ntp 1
并确保使用timedatectl timesync-status
该同步现在可以正常工作:
服务器:212.69.166.153(0.arch.pool.ntp.org)
另外,现在 DNS 成功,工作正常ping
。curl
答案4
此问题在 Arch Linux Arm 和 Raspberry Pi 4 上仍然继续发生。我使用 systemd-networkd 而不是 NetworkManager,因此上述解决方案之一不适用。我的 NTP 系统时间也正确同步。默认情况下禁用 DNSSEC。
就我而言,WAN 主机名已解析,但 LAN 主机名未解析,并且我遇到了相同的Name or service not known
错误。
我的解决方案是通过编辑使用经典 DNS 而不是 LLMNR /etc/systemd/resolved.conf
:
[Resolve]
...
LLMNR=no
...
ResolveUnicastSingleLabel=yes
重新启动服务以应用更改:
sudo systemctl restart systemd-networkd
sudo systemctl restart systemd-resolved