那個啥,不喜歡看一些背景 分析啥的 直接看紅字修改就好了。 其餘的都是冗餘部分,都是碼出來的,其餘的地方好像搜不到。經驗之談。避免你們採坑。 html
在國家網信辦推行IPv6的大前提下,進行IPv6改造工做,有在服務器上配置IPv4 和 IPv6雙棧的需求。可是調研發現配置IPv6後會出現如下幾個隱患:
linux
雙棧網絡下 IPv6優先級更高:域名解析的AAAA記錄優先級 以及網絡出口的優先級bash
首先說域名解析AAAA優先致使的問題:服務器
因爲雙棧狀況下AAAA記錄優先,域名解析會向localdns發起 AAAA 和A記錄查詢,剛纔說到有AAAA記錄優先網絡
這就埋下了隱患,也就是說域名解析的過程會等待AAAA記錄的返回(不管是否有解析記錄),若是無AAAA解析記錄會影響什麼?架構
理論上有A記錄 也就是IPv4兜底,確定有解析,可是 dns的解析過程當中,若是localdns無結果,會向上級域遞歸,直至根域查詢無果。app
這個過程會浪費掉必定的時間。這個時間也會算到dns解析過程當中,故在雙棧的狀況下 一些域名的解析可能會緩慢,進而影響到服務。curl
而後是 網絡出口IPv6優先致使的問題:ide
網絡架構的變動,通常的服務器都不配置公網IP,都是經過nat/snat出公網的,在進行改造後 直接經過IPv6出公網,不通過nat。對網絡架構是一種改造。測試
可能致使的問題:被調用端獲取到的IP已經變化,相關IP段的受權須要修改。
另外,經過IPv6訪問,可能出現質量不穩定:大網環境不穩定 IPv6正常測試推動過程當中,總體網絡環境 不如如今的穩定。還有 被調用方支持較弱,也就是覆蓋節點不全面 或者是灰度部分不重要的地域,服務質量沒辦法保證。
綜上,在當前狀況下 服務器上及時開啓雙棧支持IPv6也是面臨必定的問題。環境下又必須推動這件事情,那就使用折中方案。配置雙棧 可是 IPv4優先。
配置很簡單:
修改 /etc/gai.conf precedence ::ffff:0:0/96 100
關於爲啥修改這個能生效 往下看,其餘的blog好像沒有解釋的,擼了不少協議發現大概是這樣的,歡迎補充。
gai.conf說明 http://www.man7.org/linux/man-pages/man5/gai.conf.5.html
gai.conf - getaddrinfo(3) configuration file 系統調用getaddrinfo(3) 可能獲得多個地址,系統根據RFC3484選取最優地址。
RFC容許管理員修改/etc/gai.conf 實現動態更改地址排序規則。
RFC3484協議 https://tools.ietf.org/rfc/rfc3484.txt
RFC 網絡協議的聖經
10.3. Configuring Preference for IPv6 or IPv4
默認狀況下IPv6優先級高於IPv4,應用程序優先使用IPv6地址。能夠經過賦予 ::ffff:0:0/96 更高的優先級實現IPv4優先級高於IPv6。
注: ::ffff:0:0/96 IPv4/IPv6轉換地址 (IPv4-mapped IPv6 address)
/etc/gai.conf 默認是缺省的,無配置。
默認的配置爲:
label ::1/128 0 label ::/0 1 label 2002::/16 2 label ::/96 3 label ::ffff:0:0/96 4 precedence ::1/128 50 precedence ::/0 40 precedence 2002::/16 30 precedence ::/96 20 precedence ::ffff:0:0/96 10
precedence 的IP段說明:
Prefix Precedence Label
::1/128 50 0
::/0 40 1
2002::/16 30 2
::/96 20 3
::ffff:0:0/96 10 4
0:0:0:0:0:0:0:1/128 50 0 單播地址 環回地址 等同於IPV4的127.0.0.1
0:0:0:0:0:0:0:0/0 40 1 缺省路由 等同於IPV4 0.0.0.0
2002:0:0:0:0:0:0:0/16 30 2 可聚合全球地址
0:0:0:0:0:0:0:0/96 20 3 ipv4兼容地址
0:0:0:0:0:ffff:0:0/96 10 4 IPv4映射地址(這個地址網絡上信息較少,地址範圍::: ffff:0.0.0.0~:: ffff:255.255.255.255 地址數量2 128−96 = 2 32 = 4 294 967 296,用於軟件,目的是IPv4映射的地址。 )
來源於維基百科,國內的那貨死活搜不出來。
Prefix | Precedence | Label | Usage |
---|---|---|---|
::1/128 | 50 | 0 | Localhost |
::/0 | 40 | 1 | Default unicast |
::ffff:0:0/96 | 35 | 4 | IPv4-mapped IPv6 address |
2002::/16 | 30 | 2 | 6to4 |
2001::/32 | 5 | 5 | Teredo tunneling |
fc00::/7 | 3 | 13 | Unique local address |
::/96 | 1 | 3 | IPv4-compatible addresses (deprecated) |
fec0::/10 | 1 | 11 | Site-local address (deprecated) |
3ffe::/16 | 1 | 12 | 6bone (returned) |
選取服務器進行測試,並配置IPv6地址:
並設置/etc/gai.conf:precedence ::ffff:0:0/96 100
服務器具有雙棧
服務器的雙棧可以出公網
默認配置下 系統有優先使用ipv6(這裏使用wget測試,curl dig ping等其餘的測試都有IP版本之分,只要指定版本就不算系統優選了):
修改優先級:
屢次測試 可以穩定路由。
在修改優先級 ::ffff:0:0/96 >= 40 時 服務器優先使用IPv4地址。可按照文檔設定爲100。
測試的鏈接:
wget -SO /dev/null weixin.qq.com
wget -SO /dev/null https://k.sinaimg.cn/n/default/1_img/upload/3933d981/300/w1620h1080/20200105/f33b-imrkkfy0727359.jpg/w640slw.jpg
結論:
測試結果顯示 修改該優先級可以達到服務器在雙棧的狀況下,優先使用IPv4。
該配置 可能會致使後續 使用IPv6失敗的狀況,須要在之後的改造過程當中注意。
修改/etc/gai.conf ipv4的優先級的方式 是否正確 是否會引發其餘的問題。 協議裏面的內容比較多,包括不少目的地址選址方面的問題。須要關注下。
另外,根據RFC協議中的內容,我這進行了測試,若是有AAAA記錄 可是IPv6地址不通,仍使用IPv4地址,與存活探路有關。不過程序處理須要消耗時間,得不償失。建議直接規避吧。