為什麼我的 Ping 預設使用 IPv6?
我的執行 Debian 10 的家庭伺服器在通過 Wireguard 連接到 Mullvad 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 應該顯示,對吧?為什麼會這樣?
預設情況下,
dig
僅查詢A
(IPv4 地址)記錄。嘗試將AAAA
(IPv6 地址記錄類型)添加到命令中:$ 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:從iputils 版本的 ping 的原始碼來看,它似乎只是選擇了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,這會造成麻煩。一些程序(尤其是瀏覽器)實現了“快樂眼球”方法(基本上,嘗試兩個版本並使用先成功的那個),但其他程序可能沒有那麼聰明。