WSL2 網(wǎng)絡(luò)異常排查 [ping 不通、網(wǎng)絡(luò)地址異常、缺少默認(rèn)路由、被宿主機(jī)防火墻攔截]

最近在使用的 wsl2 的時(shí)候突然發(fā)現(xiàn) wsl2 無法正常聯(lián)網(wǎng),即 ping 不通外網(wǎng)以及宿主機(jī)的 wsl 網(wǎng)卡。但是將 wsl 版本設(shè)置為 1 就可以聯(lián)網(wǎng)了。

如果你是正常使用的時(shí)候,并且自己沒有手動(dòng)修改過 主機(jī) 和 WSL2 的網(wǎng)絡(luò)配置,然后就忽然發(fā)現(xiàn) WSL2 不能正常訪問網(wǎng)絡(luò)了,這個(gè)時(shí)候你重啟一下 WSL2 大概率就可以工作了。

# 重啟 WSL 指令 
$ wsl --shutdown 
# 之后就重新啟動(dòng)進(jìn)入即可 
$ wsl 

如果還不行就參考下面的過程一個(gè)個(gè)的排查吧。我會(huì)盡可能的把各種情況復(fù)現(xiàn)然后拿出來講。

小提示:
以下內(nèi)容對計(jì)算機(jī)網(wǎng)絡(luò)知識(shí)要有了解,需要你對網(wǎng)關(guān)(gateway)、子網(wǎng)、路由、防火墻等概念有了解并會(huì)進(jìn)行一些簡單的計(jì)算和配置。

WSL2 和 WSL1 的網(wǎng)絡(luò)的區(qū)別

在講解問題之前先來了解一下 WSL2 和 WSL1 在網(wǎng)絡(luò)上的不同,WSL1 是共享宿主機(jī)的網(wǎng)絡(luò)棧,即 WSL1 共享主機(jī) IP,并沒有自己獨(dú)立的邏輯網(wǎng)卡,也即沒有自己獨(dú)享的 IP 地址。類似于 Docker 網(wǎng)絡(luò)的 host 模式。

圖片

圖 1 wsl1 與 宿主機(jī)網(wǎng)絡(luò)關(guān)系

如上圖,兩者在與外部通信的均使用的是 192.168.1.10。下圖是一張 wsl1 和 宿主機(jī)的網(wǎng)絡(luò)接口狀態(tài)。

圖片

圖 2 wsl1 與 宿主機(jī)網(wǎng)絡(luò)地址對比

然 wsl2 則可以理解為宿主機(jī)完整虛擬出來的一個(gè)完整的 Linux 虛擬機(jī),擁有自己的邏輯上獨(dú)立的網(wǎng)卡,也即擁有屬于自己的獨(dú)立網(wǎng)絡(luò)棧。與 VMware 的 bridge 模式和 docker 的 macvlan 模式類似。

圖片

圖 3 wsl2 與 宿主機(jī)的網(wǎng)絡(luò)拓?fù)鋱D

上圖描述了兩者在邏輯上的關(guān)系,從上圖就可以看到 WSL2 要與外界進(jìn)行通信,就必須保證 WSL2 能正常訪問宿主機(jī)( 所以這里就存在宿主機(jī)的防火墻攔截問題 ),因?yàn)樗拗鳈C(jī)是其與外部進(jìn)行通信的橋梁。要保證 WSL2 與宿主機(jī)的通信正常就要確認(rèn)兩者的IP地址是否在同一個(gè)網(wǎng)段, 其次 WSL2 的默認(rèn)路由必須是宿主機(jī)在同一網(wǎng)段的地址(172.25.32.1/20) 。

圖片

關(guān)于 wsl1 和 wsl2 的詳細(xì)對比差異可以參考: Comparing WSL 1 and WSL 2

排查過程

經(jīng)過排查發(fā)現(xiàn),我主要是以下三方面的原因。

下面的圖均為為模擬還原截圖

圖片

1)宿主機(jī)的 WSL 網(wǎng)卡 和 wsl2 的外部通信的網(wǎng)卡 eth0 網(wǎng)絡(luò)配置信息不一致

查看 宿主機(jī) 和 wsl2 的網(wǎng)絡(luò)狀態(tài)

圖片

通過 IP 與子網(wǎng)掩碼的計(jì)算,可以知道知道兩者的明顯不在一個(gè)子網(wǎng)。所以第一步需要通過配置讓兩者在同一個(gè)子網(wǎng),這里選擇改動(dòng) WSL2。

有些沒學(xué)過計(jì)算機(jī)網(wǎng)絡(luò)的小伙伴可能不知道如何使用 ip 和 netmask 計(jì)算,這個(gè)也不復(fù)雜,不懂的自行搜索學(xué)習(xí)吧。(可以參考: 維基百科“子網(wǎng)”)

$ sudo ifconfig eth0 172.25.46.6 netmask 255.255.240.0 
圖片

可以看到 WSL2 不能訪問宿主機(jī),但是宿主機(jī)可以訪問 WSL2。所以很可能就是宿主機(jī)的防火墻攔截了 WSL2 對宿主機(jī)的訪問。還有一種情況就是防火墻規(guī)則里面默認(rèn)禁用了 ICMP 的應(yīng)答(ping 的實(shí)現(xiàn)就是基于 ICMP 協(xié)議)。

小提示:
禁用 ICMP 的應(yīng)答是一種最簡單也是最常見的隱藏網(wǎng)絡(luò)主機(jī)的方式。對于桌面版的 Windows 通常默認(rèn)是沒有禁用的,但是你如果安裝了“XX安全管家、XX安全衛(wèi)士”加固過電腦的話,大概率就會(huì)將 ICMP 的回顯給禁用掉。
對于操作系統(tǒng)的 防火墻 通常都會(huì)對入網(wǎng)方向進(jìn)行嚴(yán)格的限制,即禁止外部主機(jī)隨便的訪問我提供的服務(wù)。所以當(dāng)出現(xiàn)外部主機(jī)無法訪問本機(jī)提供的對外服務(wù)的時(shí)候就要考慮是不是主機(jī)的防火墻限制了訪問。

2)宿主機(jī)的網(wǎng)絡(luò)防火墻攔截了 wsl2 的數(shù)據(jù)流量

首先暴力關(guān)閉 window10 的防火墻,然后再次 ping 宿主機(jī)。

圖片

圖片

所以可以確定就是宿主機(jī)防火墻攔截了宿主機(jī)的 ICMP 的回顯,為了方便 WSL2 與宿主機(jī)進(jìn)行無障礙溝通,我們可以禁用防火墻,但是很顯然這樣宿主機(jī)就完全暴露在公網(wǎng)之上,安全性無疑就大大折扣,所以最佳的做法就是我們添加一條入站規(guī)則: 僅允許 WSL2 所在的網(wǎng)段主機(jī)對宿主機(jī)進(jìn)行無障礙訪問 。

圖片
圖片
圖片
圖片

上圖涉及到子網(wǎng)的計(jì)算,不會(huì)的小伙伴自己補(bǔ)課,或者使用一些在線的 “ 網(wǎng)絡(luò)和IP地址計(jì)算器

來計(jì)算。

圖片
圖片
圖片

到這里就創(chuàng)建好了,我們只需啟用規(guī)則然后就可以無障礙的訪問宿主機(jī)了。

圖片
圖片

可以看到此時(shí)宿主機(jī)已經(jīng)可以被 PING 通。此時(shí) 主機(jī)提供的 任何對外的網(wǎng)絡(luò)服務(wù) WSL2 均可以訪問。[ 因?yàn)槲覀冎皇菍W(wǎng)絡(luò)地址做了限制,并沒有限制協(xié)議、端口等 ]

上面只是列出了 WSL2 ping 不通 宿主機(jī),但是宿主機(jī) ping 的通 WSL2,反之則可能是 WSL2 開了防火墻,自己可以根據(jù)使用的具體 Linux 參考上面的配置思路自己解決。
當(dāng)然極端情況下 WSL2 和 宿主機(jī)都開啟了防火墻(并禁止了 ICMP 回顯),那么就會(huì)出現(xiàn)均無法ping通的情況。

3)WSL2 路由配置不正確

宿主機(jī) 與 WSL2 能夠互通并不代表 WSL2 可以正常的訪問互聯(lián)網(wǎng)、當(dāng) WSL2 的默認(rèn)路由缺失、或者不正確的時(shí)候,WSL2 也不能訪問互聯(lián)網(wǎng)。

圖片
圖片

額外話題(WSL2 DNS 的配置)

在使用 WSL2 進(jìn)行軟件更新的時(shí)候經(jīng)常超級慢(已更換了國內(nèi)源的前提下),經(jīng)過一番排查發(fā)現(xiàn)是 DNS 的問題,當(dāng)使用自定義的 DNS 時(shí),域名解析的速度明顯快了很多。

不過 WSL2 的默認(rèn)域名解析服務(wù)和普通的 Linux 略微有不同,下面解釋一下:

熟悉 Linux 的都知道 DNS 服務(wù)器的配置信息是在 /etc/resolv.conf 文件中,默認(rèn)情況下,微軟在每次啟動(dòng) WSL2 都會(huì)重新根據(jù)宿主機(jī) WSL 網(wǎng)卡的地址(例如:172.25.32.1)為 wsl2 實(shí)例生成這個(gè)文件,且指定 DNS 服務(wù)器的地址為宿主機(jī) WSL 網(wǎng)卡的地址(例如:172.25.32.1)。

圖片

所以要想使用自己指定的 DNS 服務(wù),來加快解析,就需要先禁用掉自動(dòng)生成策略,仔細(xì)讀上圖會(huì)發(fā)現(xiàn),官方已經(jīng)給出了禁用自動(dòng)生成方法。

即創(chuàng)建 /etc/wsl.conf,且內(nèi)容如下:

[network] 
generateResolvConf = false 

然后刪掉 /etc/resolv.conf(因?yàn)樽詣?dòng)生成的為一個(gè)軟連接),并重新建一個(gè) /etc/resolv.conf 文本文件,并將其 DNS 服務(wù)器地址指定為自己想用的,如下圖:


圖片

之后重啟 WSL ,然后可以通過 nslookup 測試域名解析,會(huì)發(fā)現(xiàn)明顯比默認(rèn)的 WSL 網(wǎng)關(guān)快得多。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容