工作笔记 - WSL端口映射

概述

笔者在日常的开发工作中,遇到了这么一个问题。

基于代码兼容性的考虑,虽然笔者使用Windows平台工作,但编写的代码,是工作在Linux系统当中的。笔者使用的开发工具VSCode已经配置好了远程开发和调试,也就是说虽然表面上还是使用Windows系统和工具进行开发,但实际的项目代码和程序执行,已经在一个远程的Linux环境当中了。这个主题,笔者在另外一篇博文已经探讨过了。

现在遇到的问题是,如果这个远程Linux系统,不是一个正常完整的Linux,而是一个运行在Windows环境中的WSL,它可能没有正常的网络接口和配置,如何从外部也能够正常的访问这个运行在WSL中的Web应用呢?

以笔者的环境为例。在一个Windows 11系统中,运行了一个Linux子系统(WSL2,具体为Debian 13)。默认情况下,Windows会为这个系统创建一个NAT虚拟网卡(vEthnet, 172网段,下图),并与宿主机进行通信,这样,除了宿主机之外,对于其他主机而言,它其实就是一个独立的私有网络。在宿主机上的各种操作是没有问题的。但是,如果想要把在WSL中运行的Web应用,发布到外部(相对于宿主机),就会出现无法直接访问的问题。

笔者首先想到的是使用"桥接"的方式。因为以前笔者在使用VirtualBox等软件的时候,是知道有一个网络"桥接"的模式的,并且可以直接选择和配置,非常方便。但笔者好像没有在Windows11系统中,找到类似的配置或者相关工具。后来查询了解到,如果直接将整个WSL网络直接桥接,相关操作比较复杂,而且好像确实也不是很安全,所以也没有深入研究这个问题。

现在找到并且实施的比较简单易行的技术方案,就是NAT端口映射

原理也很简单,和家里路由器的NAT端口映射配置是类似的。将内部主机(此处就是WSL)的一个端口,映射到外部端口(Windows宿主机)上,这样对于这个外部端口的访问,都会转发到内部端口之上。如果这个端口由一个WEB应用提供,就相当于将应用发布到指定的端口之上了。

简单理解了场景和原理之后,下面来看看具体操作。

操作

相关的操作,其实就是网络端口的配置,在Windows下可以使用带有管理员权限的PowerShell命令来完成。

具体项目和步骤如下:

  • 准备场景和基本参数

Windows宿主机地址为: 192.168.10.137

WSL主机地址为: 172.20.185.14/20

映射端口: 7083(WSL) -> 7083(Host)

WSL的Web应用,本身是运行在7083端口的;在宿主端,端口映射是可以不同的,视需求和方便而定,这里设置成相同,方便记忆和管理。

  • 打开端口映射

Powershell中执行:

netsh interface portproxy add v4tov4 listenport=7083 listenaddress=0.0.0.0 connectaddress=172.20.185.14 connectport=7083

这个命令如果正常运行,不会有什么提示信息。

笔者理解,这个命令,就是使用netsh命令,在一个特殊的接口"portproxy"中,增加了一条v4tov4的条目,从而实现一个端口映射的代理规则。映射的参数分别就是侦听(listen, 宿主机)的地址和端口,和连接(connect,目标主机)的地址和端口。所以实质上,端口映射,在Windows上就是一个协议代理规则。

  • 打开宿主端防火墙

一般情况下,宿主机映射使用的都是非标端口,可能需要在Windows防火墙上进行配置

netsh advfirewall firewall add rule name="WSL2 7803" dir=in action=allow protocol=TCP localport=7083

这个命令会在Windows防火墙规则中创建一个入站端口为7083,协议是TCP的允许操作。其实就是打开宿主机的7083TCP端口。

  • 打开WSL防火墙

理论而言,如果在一个独立的Linux系统进行网络访问,还需要配置对应的防火墙规则。但笔者实际上没有在WSL中进行操作,就实现了端口的映射。可能是WSL比较特殊,无需额外配置,或者M$已经集成了WSL和Windows宿主机的防火墙规则吗?

如果是一个正常的Linux主机,可能的需要操作如下(使用ufw防火墙):

sudo ufw allow 7083/tcp

  • 测试映射关系

可以简单的对这个映射关系进行测试,就是用任何方式,访问这个外部端口就可以了:

shell 复制代码
// 从宿主机发起, 访问WSL
curl http://172.20.185.14:7083
NotFound

// 从宿主机发起,访问宿主机
curl http://192.168.10.137:7083
NotFound

作为WebAPI应用,这里的默认响应内容,就是NotFound,而且两者访问结果一致,说明从内外部的Web应用运行和访问都是正常的。在这种情况下,任何能够访问宿主机的其他主机,也可以使用同样的方式访问WSL的网络应用了。

至此配置和测试工作就都按照设想和预计完成了。

小结

本文从笔者日常工作中遇到的一个需要将运行在WSL中的Web应用发布出来的需求出发,讨论了WSL对网络应用访问的限制,即后续选择NAT映射的技术方案,包括其基本原理和操作过程。

相关推荐
爱编程的鱼1 小时前
ESLint 是什么?
开发语言·网络·人工智能·网络协议
小陈不好吃1 小时前
Spring Boot配置文件加载顺序详解(含Nacos配置中心机制)
java·开发语言·后端·spring
IT_陈寒2 小时前
Vite性能优化实战:5个被低估的配置让你的开发效率提升50%
前端·人工智能·后端
njnu@liyong2 小时前
HTTP-大文件传输处理
网络·网络协议·http
IT_陈寒2 小时前
Java性能调优的7个被低估的技巧:从代码到JVM全链路优化
前端·人工智能·后端
Bony-2 小时前
Go语言并发编程完全指南-进阶版
开发语言·后端·golang
无名之辈J2 小时前
库存预扣减之后,用户订单超时之后补偿库存的方案
后端
Mr_Xuhhh3 小时前
应用层协议HTTP(1)
网络·网络协议·http
..空空的人3 小时前
C++基于websocket的多用户网页五子棋 --- 认识依赖库
网络·websocket·网络协议