花了100塊大洋搞懂 ipv6的使用者如何訪問ipv4 伺服器

蓝胖子的编程梦發表於2024-03-28

大家好,今天藍胖子花了100多塊搞懂了 ipv6的使用者如何訪問ipv4 伺服器,將收穫與大家分享下。

ipv4和ipv6的協議棧不同,這意味著,其對應的ip包的封裝和解析不同,那麼只支援ipv4的機器就無法直接與ipv6的伺服器進行通訊。但目前已經有越來越多人使用ipv6進行通訊,如果僅僅讓伺服器支援ipv4,這無疑會損失一大部分使用者,特別是針對於海外業務。

如何讓伺服器便捷支援ipv4和ipv6都能同時進行訪問,就成了我們需要思考的問題。這裡我給出幾個靠譜方案來解決此類問題。

首先要知道一個http網路請求的流程,我們獲取到網站域名後透過DNS協議向DNS服務商請求網站的ip地址,接著才開始向這個ip傳送真正的http請求。

在向DNS服務商發出請求過程中,如果使用者客戶端只支援ipv6,那麼它會去DNS伺服器查詢域名的AAAA記錄,如果使用者只支援ipv4,那麼會去DNS伺服器查詢A記錄

AAAA型別的DNS記錄裡配置的是域名對應的ipv6地址,A型別記錄裡則是配置域名的ipv4地址。

linux伺服器配置ipv6地址

目前,雲服務廠商建立的伺服器例項,預設是不分配ipv6的,我們可以透過配置,讓其擁有一個ipv6公網ip,接著配置一條AAAA型別的DNS記錄,指向這個ip,那麼ipv6的使用者就可以透過域名訪問到伺服器了。

我們可以將AAAA記錄的域名 和 A記錄型別的域名配置成一樣。如下,

Pasted image 20240328150910.png

假設,我有個lanpangzi.org 的域名,配置其子域名為www.lanpangzi.org ,並且這個子域名需要同時有ipv4和ipv6的地址,我們就可以對其分別配置A型別和AAAA型別的DNS記錄,其中content是對應的公網ip。

這樣無論使用者是用那種ip協議,都能找到www.lanpangzi.org的對應ip協議的ip地址。

只要得到了域名背後正確的ip地址,那麼使用者就能正常訪問到伺服器了。

📢📢📢 但讓linux開啟ipv6的支援,還是比較繁瑣,無論是在廠商側設定公網ipv6還是本地linux伺服器需要改動配置都比較複雜,所以我著重介紹下第二種方式

透過網路代理廠商透明進行協議轉換

其實,既然ipv6的使用者直接訪問ipv4的伺服器行不通,那麼我們可以加個中間層來轉發使用者ipv6請求,如下所示,代理商與使用者是透過ipv6協議,而與伺服器則是透過ipv4。

注意下,使用者的請求無論是DNS請求,還是http請求,都應該先透過代理商,DNS請求後代理商返回自己的伺服器節點ip,使用者再向伺服器節點ip發出http請求時,再由該節點對http請求進行轉發。

image.png

考察了市面上比較主流的網路代理商後,我選擇cloudflare ,接下來,我來演示下如何透過cloudflare 來實現請求代理。

因為我本地的計算還是隻支援ipv4,所以我將linux伺服器配置成ipv6,演示下ipv4的機器如何訪問只支援ipv6的伺服器。原理是一致的,都是靠網路代理商轉發請求。關於雲服務商的伺服器如何開啟ipv6,我以阿里云為例,其官方文件在下方👇🏻,

https://help.aliyun.com/zh/ecs/user-guide/step-1-create-a-vpc-that-supports-ipv6-addressing?spm=a2c4g.11186623.0.0.341a5048uktqgP#4fbf8a7026p05

ECS 開啟ipv6

因為主機預設會有個網路卡,我直接去網路卡處新增一個ipv6的地址。

Pasted image 20240328160255.png

但預設生成的ipv6還不支援訪問公網的能力,如下提示,還需要去交換機處開通公網頻寬。

Pasted image 20240328160707.png

開通後的效果如下,

Pasted image 20240328160857.png

接著再配置下例項的安全組,配置成執行任何ipv6的地址訪問,因為預設ipv6的包是進不來的。

Pasted image 20240328161417.png

這下才完成了伺服器ECS的配置,我們目前的ECS例項已經擁有了一個公網ip了。

域名配置

接著,我們為ipv6公網ip配置一個域名lanpangzi.org,來作為應用程式的域名,使用者應該透過www.lanpangzi.org這個域名來訪問應用服務

透過dynadot ,我買了一個域名lanpangzi.org

Pasted image 20240328152648.png

接著,在cloudflare 上進行了賬號註冊,新增自己的域名

Pasted image 20240328155241.png
cloudflare 提供了免費版本,這對於我來說,再好不過了。

Pasted image 20240328155143.png

然後在 cloudflare 介面配置對域名的解析, 需要在域名註冊商dynadot那裡註冊NS記錄,來將lanpangzi.org的域名解析交由 cloudflare 。 NS記錄的節點是在 cloudflare 配置域名時告訴給開發的。

NS型別的DNS記錄,其作用是指明特定域名應該由哪臺伺服器去解析,這裡是將lanpangzi.org 的域名解析交給了 cloudflare 自己的伺服器節點。

Pasted image 20240328155541.png

dynadot 的DNS settings處配置NS記錄指向 cloudflare 的ns節點 。

Pasted image 20240328154816.png

接著,就是在 cloudflare 上對子域名www進行配置,注意www.lanpangzi.org 我只配置了AAAA記錄型別也就是 ipv6的地址。

Pasted image 20240328164028.png

如果僅僅是配置了這樣一條AAAA的記錄型別,不開啟 cloudflare 的代理功能,在ipv4使用者發出DNS請求去詢問www.lanpangzi.org的ip地址時會因為找不到 ipv4的地址而造成請求失敗。如下,我進行了測試,

在ECS上執行了一個go程式,監聽80埠,並且將其收到的http請求頭列印出來,在未開啟代理時,在我本地瀏覽器對該域名進行訪問(我本地的機器只支援ipv4),出現域名解析失敗的錯誤。

Pasted image 20240328164547.png

在開啟代理後,則http請求正常,且請求頭中有 cloudflare 加的一些自定義頭部。

Pasted image 20240328164603.png

Pasted image 20240328164708.png
綜上,透過 cloudflare 代理http請求,可以透明的實現使用者和伺服器間ipv4和ipv6請求的轉換,這也是我推薦的方式。

最後,整個域名和伺服器的購買,我花了100多塊,你們說這個錢,藍胖子花的值不值。

相關文章