WSL与主机的简单网络通信
WSL的网络配置
参考的官方文档:使用WSL访问网络应用程序
按下Win键搜索WSL Settings,可以发现其中的网络模式有:
- Nat: 默认的网络地址转换模式,WSL IP地址与Windows主机地址相互隔离
- Mirrored: 镜像模式。开启后WSL和Windows共享网络配置,包括IP地址、系统代理(梯子)
- VirtioProxy:
我的目标是使用移动设备(手机)通过IP+端口访问WSL上开启的网络服务。但是在Mirrored模式下没有成功。
-
如何开启镜像模式(Mirrored):资源管理器中搜
%UserProfile%,在该文件夹下创建.wslconfig,添加如下内容:1
2[wsl2]
networkingMode=mirrored
下面先考虑Windows与WSL在Mirrored模式下的通信。
镜像模式下Windows与WSL 进行http 通信
Windows作为服务端
-
在当前文件加下建立简单的网页:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<head>
<title>WSL 镜像模式测试</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<h1>🎉 成功从手机访问 WSL!</h1>
<p>这证明镜像模式工作正常</p>
<p>WSL IP: <span id="ip"></span></p>
<p>访问时间: <span id="time"></span></p>
<script>
document.getElementById('ip').textContent = location.hostname;
document.getElementById('time').textContent = new Date().toLocaleString();
</script>
</body>
</html> -
在当前目录下运行下面的python程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import http.server
import socketserver
PORT = 8080
class Handler(http.server.SimpleHTTPRequestHandler):
def log_message(self, format, *args):
print(f"{self.client_address[0]} - {format % args}")
with socketserver.TCPServer(("", PORT), Handler) as httpd:
print(f"🚀 服务器运行在端口 {PORT}")
print("🌐 尝试通过以下地址访问:")
print(" http://localhost:8080")
print(" http://127.0.0.1:8080")
print(" http://192.168.43.4:8080")
httpd.serve_forever()
其中192.168.43.4应替换为Windows的IP地址(可通过ipconfig /all查看),WSL 开启了镜像模式,则它也是WSL的IP地址,那么我们能否在WSL中通过访问该IP地址来访问Windows上开启的服务呢?
在WSL中尝试通过curl来依次访问python代码中列出的地址,发现最后一个访问失败,不能通过IP地址访问Windows上服务。
WSL做服务器
同样,让WSL运行上面python程序,在Windows上通过curl命令或浏览器访问上述地址,发现也是只有最后一个访问失败。
NAT模式下Windows与WSL进行通信
阅读官方的使用WSL访问网络应用程序教程可知,NAT模式下WSL地址与Windows主机地址隔离,可通过如下方式获取WSL的IP地址:
-
Windows:
wsl.exe --distribution <DistroName> hostname -i
但是我运行该命令得到的是127.0.1.1,WSL中运行cat /etc/hosts可得到解释,结果中有127.0.1.1 LAPTOP-EUO3BP5M.localdomain LAPTOP-EUO3BP5Mwsl hostname -I可以得到WSL的IP地址:172.20.84.77
-
WSL:
ip route show | grep -i default | awk '{ print $3}'ifconfig
Windows作为服务器
WSL可通过http://<Windows-IP>:port访问Windows上的服务
WSL作为服务端
Windows访问
Windows可通过http://localhost:8080和http://172.20.84.77:8080访问WSL上的服务
移动设备访问
在WSL的NAT模式下,如果手机想访问WSL上的网络服务,需要使用 Netsh 接口 portproxy 这个 Windows 命令添加一个端口代理:让手机访问Windows的端口,转发到WSL的服务
1 | netsh interface portproxy add v4tov4 listenport=<yourPortToForward> listenaddress=0.0.0.0 connectport=<yourPortToConnectToInWSL> connectaddress=(wsl hostname -I) |
在我的例子中就是:
1 | netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=8080 connectaddress=172.20.84.77 |
之后可能需要添加防火墙规则:Win+R输入control panel->系统和安全->防火墙->高级设置->入站规则->新建端口规则




