Networking

為什麼我的 Ping 預設使用 IPv6?

  • February 5, 2022

我的執行 Debian 10 的家庭伺服器在通過 Wireguard 連接到 Mullvad VPN 時有時會失去網際網路連接。

我可以ping 8.8.8.8ping 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_INETAF_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,這會造成麻煩。一些程序(尤其是瀏覽器)實現了“快樂眼球”方法(基本上,嘗試兩個版本並使用先成功的那個),但其他程序可能沒有那麼聰明。

引用自:https://unix.stackexchange.com/questions/689334