win10 linux 子系统 wsl2实现ip自动转发

本文介绍如何在Windows 10的WSL2环境中,通过bash和VBS脚本解决因系统更新导致的wsl子系统IP变化问题,实现自动的IP转发,确保服务在系统重启后仍能无缝连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

win10 系统带linux子系统有两个版本

第一个是wsl, 它与windows 系统公用同1个ip地址, 但是没有自己内核, 不支持docker
第二个版本是wsl2, 它可以使用docker,但是它的网卡每次启动都随机使用ip, 所以重启后每次都必须手动进行ip 转发。

例如:

netsh interface portproxy reset
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=22 connectaddress=192.168.44.155 connectport=22
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8091 connectaddress=192.168.44.155 connectport=8091
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=3351 connectaddress=192.168.44.155 connectport=3351
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=3352 connectaddress=192.168.44.155 connectport=3352
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=3353 connectaddress=192.168.44.155 connectport=3353
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=3354 connectaddress=192.168.44.155 connectport=3354
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=3355 connectaddress=192.168.44.155 connectport=3355
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=3356 connectaddress=192.168.44.155 connectport=3356
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8888 connectaddress=192.168.44.155 connectport=8888
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8080 connectaddress=192.168.44.155 connectport=8080
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8081 connectaddress=192.168.44.155 connectport=8081
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8761 connectaddress=192.168.44.155 connectport=8761
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8890 connectaddress=192.168.44.155 connectport=8890
netsh interface portproxy show all

但由于微软系统的不稳定性, 经常无故重启, 大部分都是更新引起的, 禁了更新一两周内仍会自己重启, 好智障。

一旦重启后,由于wsl的子系统ip地址变了, 所有的服务都连不上…

痛定思楚, 便有了下面的解决办法。



1. 编写bash 脚本获取子系统ip

由于安装了docker 的关系, 简单的hostname -l 会返回两个ip, 而我们只想要eth0 网卡那个。

gateman@DESKTOP-UIU9RFJ:~$ hostname -I
192.168.77.113 172.17.0.1 

但是在上一级语言去 call linux管道命令是很麻烦的, 所以编写了脚本getip 去获取ip

gateman@DESKTOP-UIU9RFJ:~$ cat /usr/bin/getip
ifconfig  eth0 | head -n2 | grep inet | awk '{print$2}'
gateman@DESKTOP-UIU9RFJ:~$ getip
192.168.77.113
gateman@DESKTOP-UIU9RFJ:~$ 

这个就是我们想要的.



2. 编写vbs脚本进行自动ip转发

在下面的目录创建1个posts.vbs文件
C:\Users\xxxxxxx\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

内容
只有3个地方有可能要修改
1是 第一行wsl2 name
2是 要转发的端口list
3是 存放ip地址的临时文件位置

wslname = "Ubuntu" 'the name of your wls system, could be checked by command wsl -l

Dim ports
'the ports which need to process ip forward
ports = Array(22,8080,8091,3351,3352,3353,3354,3355,3356,8888,8081,8761,8890)

'the file to store wls ip
ipTemp = "C:\Temp\wslip.txt"


If WScript.Arguments.Length = 0 Then
    'to get the admin right to run the ip forward commands
    CreateObject("Shell.Application").ShellExecute "wscript.exe" _
    , """" & WScript.ScriptFullName & """ RunAsAdministrator", , "runas", 1
    WScript.Quit
End If

Set fso = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")

'to get the eth0 ip address of the sub linux system, the script getip is in /usr/bin, and save the ipadress to C:\Temp\wslip.txt
writeip = objShell.Run("cmd /c ""wsl -d " + wslname + " -u root getip"">" + ipTemp,0,True)

'wscript.sleep(1000)'just incase some network problem

'get the ip from ip file
Set f = fso.OpenTextFile(ipTemp, 1)
wslip = f.ReadAll()
f.Close()

'execute the ip forward command for each port number from the list
For i = 0 To UBound(ports)
    port = ports(i)
    command = "cmd /c ""netsh interface portproxy add v4tov4 listenport=" & port & " listenaddress=0.0.0.0 connectport=" & port & " connectaddress=" + wslip
    forwarding = objShell.Run(command,0,True)
Next

重启后
用powershell执行下面命令就可以看到自动ip转发是否成功

PS C:\Users\gateman> netsh interface portproxy show all

侦听 ipv4:                 连接到 ipv4:

地址            端口        地址            端口
--------------- ----------  --------------- ----------
0.0.0.0         22          192.168.77.113  22
0.0.0.0         8091        192.168.77.113  8091
0.0.0.0         3351        192.168.77.113  3351
0.0.0.0         3352        192.168.77.113  3352
0.0.0.0         3353        192.168.77.113  3353
0.0.0.0         3354        192.168.77.113  3354
0.0.0.0         3355        192.168.77.113  3355
0.0.0.0         3356        192.168.77.113  3356
0.0.0.0         8888        192.168.77.113  8888
0.0.0.0         8080        192.168.77.113  8080
0.0.0.0         8081        192.168.77.113  8081
0.0.0.0         8761        192.168.77.113  8761
0.0.0.0         8890        192.168.77.113  8890

安装Windows 10上的Linux子系统是一种方便的方式,可以在Windows系统中运行Linux应用程序。然而,在安装过程中可能会遇到一些问题,下面是一些常见的坑和解决方法。 首先,确保计算机已更新到Windows 10的最新版本。然后,在控制面板中打开“启用或关闭Windows功能”,找到“适用于LinuxWindows子系统”选项并勾选上。这将需要重新启动计算机。 安装完成后,可以从Microsoft Store下载所需的Linux发行版,如Ubuntu或Debian。但有时会发生下载失败的情况。解决方法是尝试使用其他网络连接,或者从官方网站下载所需的发行版,并手动安装。 安装后,打开“命令提示符”或“PowerShell”,输入命令“wsl”,按回车键以启动Linux子系统。然而,有时会遇到“无法启动服务”或“系统错误 2”的错误。这可能是由于Windows子系统服务未启动造成的。解决方法是按下Win+R键,打开运行对话框,输入“services.msc”后按回车键,找到“LxssManager”服务,并确保它正在运行。 另一个常见的问题是无法访问网络。在安装过程中,Linux子系统会尝试自动配置网络设置,但有时会失败。解决方法是打开Linux子系统的终端,输入命令“sudo nano /etc/resolv.conf”来编辑DNS设置。将“nameserver”后面的IP地址更改为你的DNS服务器地址,并保存文件。然后,输入命令“sudo /etc/init.d/networking restart”以重启网络服务。 最后,一些应用程序在Linux子系统中可能无法正常运行,主要是由于缺少必要的库或驱动程序。解决方法是安装所需的软件包,并确保你的硬件驱动程序更新到最新版本。 总结一下,安装Windows 10上的Linux子系统可能会遇到几个常见的问题,如下载失败、无法启动服务、无法访问网络和应用程序不运行等。通过检查Windows版本、手动安装发行版、确保服务运行、编辑网络设置和安装软件包等方法,可以解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nvd11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值