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

2023-05-16

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

win10 linux 子系统 wsl2实现ip自动转发 的相关文章

  • WSL关闭与windows的互交互(解决PATH等环境变量问题

    如果在windows和wsl中都安装了nodejs 那么由于wsl的互交互特性 npm的运行就会不太正常 以下是禁用互交互的步骤 在WSL的终端中输入 span class token keyword echo span span clas
  • 数据结构——树

    1 树的相关定义 xff08 1 xff09 树 xff1a 包含n xff08 n gt 0 xff09 个节点的有穷集合 xff0c 其中每个元素称为节点 xff08 node xff09 xff1b 有一个特定的节点被称为根节点或树根
  • Qt QImage图片透明设置(Thinkvd开发日志)

    开发Thinkvd中的player 设置透明度用的是sdl来实现的 xff0c 转换中的水印用的是png 如何设置水印的透明度 xff0c 实际上要求把图片转换成带alpha的32位即可 实现代码 xff1a 8 void ImageCom
  • 关于 win10 系统安装Geomagic Wrap 2017导致一直蓝屏重启解决方案

    学校进行专业实训 xff0c 开了一门3D打印的课程 老师要求下载Geomagic Wrap 2017 xff0c 但是凡是win10系统安装的人都出现了不同程度的蓝屏 xff0c 我的电脑更是一直蓝屏重启 xff0c 网上找了很多方法 x
  • 八数码问题完全版-是否可解判断及求解

    八数码问题 有一个3 3的棋盘 xff0c 其中有0 8 9个数字 xff0c 0表示空格 xff0c 其他的数字可以和0交换位置 求由初始状态 1 2 3 4 5 6 7 8 0 到达目标状态步数最少的解 其典型算法是广度优先搜索 xff
  • windows10-conda cmd使用时错误:‘conda‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

    在 windows10 上装完 conda 之后 xff0c 打开 cmd 想看看 conda 的版本 xff0c 结果找不到 xff0c 于是走上了解决之路 xff0c 并做个简单的记录 错误截图 问题原因 系统 path 环境没有进行设
  • Linux下安装Qt 6

    在Linux平台下 xff0c 安装Qt xff0c 与Windows基本一致 xff0c 都是Qt在线图形化安装界面 xff0c 但是有一点不同 xff0c 需要前期环境准备 安装必需环境 Linux 的 Qt 安装程序假定主机操作系统提
  • 51单片机的中断系统及编程(附案例)

    本文简单粗暴地阐述了中断的一些概念 中断源 中断寄存器各位的作用 xff0c 并写出了编写一个中断函数的流程 要点 不在意细节时 xff0c 可直接查看照搬 三 中断程序的编程 一 中断概念 中断定义 xff08 比喻 xff09 xff1
  • error C2143: 语法错误 : 缺少“;”(在“类型”的前面)

    在visual studio 中 xff0c 出现 xff1a error C2143 语法错误 缺少 在 类型 的前面 这是因为该编译器要求把变量定义在函数空间或者局部空间前面 xff0c 不能随便定义 如 xff1a int n sca
  • SolidWorks 3D草图扫描

    SolidWorks 3D草图扫描需要注意的是 xff1a 如果路径是3d草图画的 xff0c 则轮廓也需要用3d草图功能画 xff0c 且路径和轮廓要分别画在两个草图中
  • 字典排序法

    原理见 点击打开链接 http wenku baidu com link url 61 NrIeFmVNamnb5jXvYAxfJ3cAW0gwXcO0YkFx mBqoDwvvQyVAPNlzogg0FHs3GXPzBC3g2jg4Wzx
  • 树莓派3(raspberry pi 3B)gpsd不能工作问题

    1 问题描述在这里面有 xff1a https www raspberrypi org forums viewtopic php f 61 28 amp t 61 138711 2 在这个帖子里面 xff0c 作者给出了解决方案 xff1a
  • (转) 深度学习在目标跟踪中的应用

    深度学习在目标跟踪中的应用 原创 2016 09 05 徐霞清 深度学习大讲堂 点击上方 深度学习大讲堂 可订阅哦 xff01 深度学习大讲堂是高质量原创内容的平台 xff0c 邀请学术界 工业界一线专家撰稿 xff0c 致力于推送人工智能
  • 树莓派3B+gpsd 3.16不能开机后自动启动问题

    自上一篇帖子通过编译gpsd3 16版本解决gpsd 3 11在树莓派上不能工作问题后 xff0c 想配置gpsd 3 16自动启动 但是经过不停的尝试 xff0c 发现还是不能成功自启 xff0c 在这过程中发现了一篇学习文档 xff1a
  • 关于CWinApp::OnIdle的解释

    CWinApp OnIdle virtual BOOL OnIdle LONG lCount 返回值 xff1a 如果要接收更多的空闲处理时间 xff0c 则返回非零值 xff1b 如果不需要更多的空闲时间则返回0 参数 xff1a lCo
  • vmware-ubuntu 基本操作

    最近学习了ubuntu虚拟机的使用 xff0c 开始安装就花费了很长时间 xff0c 安装好后自己对一个全新的系统很陌生 xff0c 于是在网上查资料找到了它的一些终端基本的命令 xff0c 先从基础开始 一 打开终端的几种方法 1 快捷键
  • Dockerfile创建详解

    Docker Dockerfile 什么是 Dockerfile xff1f Dockerfile 是一个用来构建镜像的文本文件 xff0c 文本内容包含了一条条构建镜像所需的指令和说明 使用 Dockerfile 定制镜像 这里仅讲解如何
  • char(50)与varchar(200),这是输入hello,字符所占长度是怎样的?

    char所占长度从定义时就决定了 所以长度为50 不足的用空格补充 varchar所占的长度就是字符串所占的长度
  • SpringBean创建的方式有哪些?

    一 通过构造函数进行创建 二 通过普通工厂的方法进行创建 三 通过静态工厂的静态的方法进行创建
  • JDK19虚拟线程

    JDK 19引入的虚拟线程 xff0c 是JDK 实现的轻量级线程 xff0c 他可以避免上下文切换带来的的额外耗费 他的实现原理其实是JDK不再是每一个线程都一对一的对应一个操作系统的线程了 xff0c 而是会将多个虚拟线程映射到少量操作

随机推荐

  • 如何实现下层函数要让上层函数感知异常

    可以通过future get 的方法获取下层的函数抛出的异常
  • 线程安全的体现

    原子性 xff1a 提供互斥访问 xff0c 同一时刻只能有一个线程对数据进行操作 xff0c xff08 atomic synchronized xff09 xff1b 可见性 xff1a 一个线程对主内存的修改可以及时地被其他线程看到
  • 程序访问中什么是临界区

    临界区是指并发进程中访问共享变量的程序段 临界区指的是一个访问共用资源的程序片段 xff0c 而这些共用资源又无法同时被多个线程访问的特性 每次只准许一个进程进入临界区 xff0c 进入后不允许其他进程进入
  • Latex Section 段落标题编号设置的问题

    Table of Contents 问题 xff1a 解决方法 xff1a 1 有数字 xff0c 不想要数字 2 没有数字 xff0c 想自动编排数字 3 references 没数字 问题 xff1a 在撰写论文时 xff0c 有些会议
  • 什么是数据存储过程

    存储过程 xff08 Stored Procedure xff09 是在大型数据库系统中 xff0c 一组为了完成特定功能的SQL语句集 xff0c 它存储在数据库中 xff0c 一次编译后永久有效 xff0c 用户通过指定存储过程的名字并
  • 为什么Springboot调用main()方法后程序会一直运行

    因为调用Main方法运行以后JVM不是立马结束退出 xff0c 取决于是否有进程一直在运行 常见的普通的Main方法里若有while xff08 true xff09 xff0c 也是不会退出的 springboot本质上也是这个原理 xf
  • JVM内存模型与JAVA内存模型

    区别 xff1a JVM内存模型则是指JVM的内存分区 xff0c Java代码是要运行在虚拟机上的 xff0c 而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域 xff0c 这些区域都有各自的用途 JVM内存结
  • 用Java实现两个有序数组合并成一个有序数组

    需求 有序数组a 和b xff0c 将它们合并成有序数组c 思路 xff1a 新建一个以两个集合长度之和为长度的新数组 xff0c 从两数组最左边开始比起 xff0c 把小的放入新集合 xff0c 并用变量标记后一位置 xff0c 每次比较
  • Spring Bean加载的8种方式

    一 在xml文件中通过标签 lt bean gt 实现 二 使用 64 Component以及其衍生的三种注解 64 Controller 64 Service 64 Repository 三 加载第三方bean 复制代码 64 Confi
  • 非对称加密分段处理加密大量数据

    基于RSA非对称加密 属于轻量型加密 加密数据的大小有严格限制 我们可以通过对分段加密方式 实现对大量数据的非对称加密 本文在参考非对称的加密的资料基础之上 实现了大数据的非对称加密 因此少量数据于大量数据都可以实现加密处理 如果仅想实现这
  • 如何理解反向代理

    通常的代理服务器 xff0c 只用于代理内部网络对Internet的连接请求 xff0c 客户机必须指定代理服务器 并将本来要直接发送到Web服务器上的http请求发送到代理服务器中 由于外部网络上的主机并不会配置并使用这个代理服务器 xf
  • ping: www.baidu.com: 未知的名称或服务

    如果如何怎么都连不上外网 可以照搬下面配置 一定可以连通 VMc16 centos7 NAT模式下 注意子网IP和子网掩码的设置 这个决定的IP的取值范围 文件配置如下
  • 权限精确到按钮级别

    在使用sa token轻量级框架下 如何将权限精确到按钮级别 权限精确到按钮级的意思就是指 xff1a 权限范围可以控制到页面上的每一个按钮是否显示 思路 xff1a 如此精确的范围控制只依赖后端已经难以完成 xff0c 此时需要前端进行一
  • 单点登录的发展与应用

    早期我们开发web应用都是所有的包放在一起打成一个war包放入tomcat容器来运行的 所有的功能 所有的业务 后台管理 门户界面 都是由这一个war来支持的 这样的单应用 也称之为单体应用 因为十分不好扩展和拆分 在单体应用下 用户的登录
  • The command could not be located because '/sbin' is not included in the PATH environment variable.

    问题来源 重启Ubuntu后习惯性的执行ifconfig 报错如下 Command span class hljs string 39 ifconfig 39 span span class hljs keyword is span ava
  • bean实例化的方式

    1 最常见 使用构造方法 2 早些年 使用静态工厂的方式 3 更早些年的 使用实例化工厂的方式 4 spring框架常用 实现FactoryBean接口的方式
  • @Autowired

    1 Autowired依赖注入底层是通过反射暴力获取对象并赋值给属性 2 setter与构造器注入是通过给IOC容器提供入口注入的
  • C语言 Hanoi(汉诺)塔问题,用递归解决

    问题 古代有一个梵塔 xff0c 塔内有3个座A xff0c B xff0c C 开始时A座上有64个盘子 xff0c 盘子大小不等 xff0c 大的在下 xff0c 小的在上 有一个老和尚想把64个盘子从A作移到C座 xff0c 但规定每
  • Ubuntu server 22.04 安装kvm

    本人有一台工控机 xff0c 5500u cpu xff0c 8g 内存 xff0c 本来是打算用来跑docker的 xff0c 但是因为要装 k8s 虚拟机会更加合适方便 xff0c 宿主机的系统是ubuntu server 22 04
  • win10 linux 子系统 wsl2实现ip自动转发

    win10 系统带linux子系统有两个版本 第一个是wsl xff0c 它与windows 系统公用同1个ip地址 xff0c 但是没有自己内核 xff0c 不支持docker 第二个版本是wsl2 xff0c 它可以使用docker x