花了 100 塊大洋搞懂 IPv6 的用戶如何訪問 IPv4 服務器
大家好,今天藍胖子花了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記錄類型的域名配置成一樣。如下:
圖片
假設,我有個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請求進行轉發。
圖片
考察了市面上比較主流的網絡代理商后,我選擇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的地址。
圖片
但默認生成的ipv6還不支持訪問公網的能力,如下提示,還需要去交換機處開通公網帶寬。
圖片
開通后的效果如下:
圖片
接著再配置下實例的安全組,配置成運行任何ipv6的地址訪問,因為默認ipv6的包是進不來的。
圖片
這下才完成了服務器ECS的配置,我們目前的ECS實例已經擁有了一個公網ip了。
域名配置
接著,我們為ipv6公網ip配置一個域名lanpangzi.org,來作為應用程序的域名,用戶應該通過www.lanpangzi.org這個域名來訪問應用服務。
通過dynadot ,我買了一個域名lanpangzi.org。
圖片
接著,在cloudflare 上進行了賬號注冊,添加自己的域名。
圖片
cloudflare 提供了免費版本,這對于我來說,再好不過了。
圖片
然后在 cloudflare 界面配置對域名的解析, 需要在域名注冊商dynadot那里注冊NS記錄,來將lanpangzi.org的域名解析交由 cloudflare 。 NS記錄的節點是在 cloudflare 配置域名時告訴給開發的。
NS類型的DNS記錄,其作用是指明特定域名應該由哪臺服務器去解析,這里是將lanpangzi.org 的域名解析交給了 cloudflare 自己的服務器節點。
圖片
在dynadot 的DNS settings處配置NS記錄指向 cloudflare 的ns節點 。
圖片
接著,就是在 cloudflare 上對子域名www進行配置,注意www.lanpangzi.org 我只配置了AAAA記錄類型也就是 ipv6的地址。
圖片
如果僅僅是配置了這樣一條AAAA的記錄類型,不開啟 cloudflare 的代理功能,在ipv4用戶發出DNS請求去詢問www.lanpangzi.org的ip地址時會因為找不到 ipv4的地址而造成請求失敗。如下,我進行了測試。
在ECS上運行了一個go程序,監聽80端口,并且將其收到的http請求頭打印出來,在未開啟代理時,在我本地瀏覽器對該域名進行訪問(我本地的機器只支持ipv4),出現域名解析失敗的錯誤。
圖片
在開啟代理后,則http請求正常,且請求頭中有 cloudflare 加的一些自定義頭部。
圖片
圖片
綜上,通過 cloudflare 代理http請求,可以透明的實現用戶和服務器間ipv4和ipv6請求的轉換,這也是我推薦的方式。
最后,整個域名和服務器的購買,我花了100多塊,你們說這個錢,藍胖子花的值不值。