WSL:Windows Subsystem For Linux
前段时间听说WSL2很香,然后试了一下,确实很香……如果你不是一个WEB狗
WSL2的安装我就不具体写了,太简单了,直接看官网教程
0x00 与WSL的区别
WSL1大家应该都很熟悉,WSL2也问世挺久了,我就不详细嗦了,直接看看官网解释的区别:
摘自微软官网
整体上看……这俩完全就不是一个东西嘛:wsl
只是一个单纯的shell
,wsl2
简直就是一台虚拟机
WSL2
从OS
层实现了独立,不再与宿主机共享OS
,解决了许多二进制
狗的蜜汁BUG,但是这种独立性给WEB狗
创造了更多的烦恼
0x01 主要问题
IPV6
没有IPV6
,失去了免流的梦想……
微软,不愧是您
服务不通
最主要的问题还是网络层与宿主机不互通:
微软官方说明
ifconfig
一下你会惊奇的发现它没有192
网段地址:
ifconfig
再来看看 WSL2 “独一无二的IP地址的虚拟化以太网适配器”:
图源:https://blog.csdn.net/swordsm/article/details/107948497
果然很复杂。再看一眼昔日称霸一方的WSL1的网络拓扑:
图源:https://blog.csdn.net/swordsm/article/details/107948497
两图对比,发现WSL1使用的是宿主机的网络,可以直接理解为一台机器,在配置上过于简单,但正因为网络共享,很多应用不能在windows和Linux中同时运行(比如Windows的phpstudy和Linux的docker)
WSL2网络层使用了独立的虚拟网卡,与宿主机进行桥接,网络上实现了独立,但是也造成了麻烦,比如本地服务不互通:
比如内网请求被防火墙干掉:
wsl2 ping 宿主机被拦截
宿主机 ping wsl2 能 ping 通
可能是WD把这个网桥干掉了吧……
Docker
Docker Docker Docker!
也可能是我发行版的问题,在运行docker的时候一直报错,一直启动不了:
1 | Chain OUTPUT (policy ACCEPT) |
启动很失败(x)
0x02 解决方案
IPV6:无解
IPV6
的问题没法解决,干脆忘了它吧,等微软开发下一代产品
服务不通:手动设置+localhost
Linux请求被拦截的问题……关闭专用网络防火墙可以解决:(确实是WD把这个网桥干掉了)
关闭专用网络防火墙
然后终于ping通了
网络问题大致有两种解决方案:直接localhost或者手动配置端口转发
localhost大概是微软留下的最后的希望,在不能使用127.0.0.1
的情况下,localhost可以直接访问本地服务
这里直接跑了一个DVWA
端口转发可以直接参考官方文档,在宿主机的Powershell中配置:
1 | netsh interface portproxy show all |
Docker:强制初始化
主要错误原因:
1 | iptables v1.8.5 (nf_tables): CHAIN_ADD failed (No such file or directory): chain PREROUTING |
docker.io
用iptables
初始化NAT网络,而Debian buster
使用nftables
而不是iptables
,导致dockerd
不能正常完成NAT初始化,出错退出。
那么正确的解法应该就是强制使用iptables进行初始化:
1 | sudo update-alternatives --set iptables /usr/sbin/iptables-legacy |
然后就能跑了……
最后
其他的BUG可能忘记了,下次想起来再写
Refference
https://blog.csdn.net/dqwjack/article/details/107699985
https://docs.microsoft.com/zh-cn/windows/wsl/compare-versions
https://blog.csdn.net/swordsm/article/details/107948497
Reference