我运行 Debian 10 的家庭服务器在通过 Wireguard 连接到 Mulvad VPN 时有时会丢失互联网连接。
我可以ping 8.8.8.8
,但是当我返回ping google.com -4
时我:ping google.com
PING google.com(fra16s42-in-x0e.1e100.net (2a00:1450:4001:809::200e)) 56 data bytes
ping: sendmsg: Operation not permitted
From dynamic-2a01-0c23-60be-c200-12c3-7bff-fe9e-4379.c23.pool.telefonica.de (2a01:c23:60be:c200:12c3:7bff:fe9e:4379): icmp_seq=1 Destination unreachable: Port unreachable
它以前从未默认为 IPv6,我认为这可能是一系列问题的根本原因。
dig google.com
返回 IPv4
;; ANSWER SECTION:
google.com. 222 IN A 172.217.18.110
通常我会假设 ping 使用 IPv6,因为 Mullvads DNS 服务器仅返回 IPv6,但 dig 应该显示这一点,对吧?为什么会发生这种情况?
答案1
默认情况下,dig
仅查询A
(IPv4 地址)记录。尝试将(IPv6 地址记录类型)添加AAAA
到命令中:
$ dig google.com AAAA
[...]
;; ANSWER SECTION:
google.com. 106 IN AAAA 2607:f8b0:400a:806::200e
[...]
或者使用host
,查询两者(以及MX
记录):
$ host google.com
google.com has address 142.251.33.110
google.com has IPv6 address 2607:f8b0:400a:80b::200e
google.com mail is handled by 20 alt1.aspmx.l.google.com.
google.com mail is handled by 40 alt3.aspmx.l.google.com.
google.com mail is handled by 10 aspmx.l.google.com.
google.com mail is handled by 30 alt2.aspmx.l.google.com.
google.com mail is handled by 50 alt4.aspmx.l.google.com.
至于为什么ping
更喜欢 IPv6 而不是 IPv4:来自ping 的 iputils 版本的源代码,看起来它只是选择getaddrinfo()
返回的第一个相关地址。根据手册页getaddrinfo()
:
链表可能有多个的原因有多种
addrinfo
结构,包括: 网络主机是多宿主的,可通过多种协议访问(例如, 和AF_INET
)AF_INET6
;或者可以从多种套接字类型(例如,一个SOCK_STREAM
地址和另一个地址)获得相同的服务。SOCK_DGRAM
通常,应用程序应尝试按照返回的顺序使用地址。其中使用的排序函数getaddrinfo()
在 RFC 3484 中定义;可以通过编辑来调整特定系统的顺序/etc/gai.conf
(自 glibc 2.5 起可用)。
RFC 3484已被替换为RFC 6724/etc/gai.conf
,但我对其中任何一个(或可用于覆盖该策略的文件)都不是很了解。
如果您的 IPv6 连接出现问题,可能是其他程序ping
也在遵循getaddrinfo()
命令,尝试使用 IPv6,这会造成麻烦。一些程序(尤其是浏览器)实现“快乐的眼球”方法(基本上,尝试两个版本并使用第一个成功的版本),但其他程序可能没有那么聪明。