V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
BeautifulSoap
V2EX  ›  分享发现

终于找到给 wsl2 分配固定 ip 的方法

  •  2
     
  •   BeautifulSoap · 2021-01-14 16:35:10 +08:00 · 18943 次点击
    这是一个创建于 1409 天前的主题,其中的信息可能已经有所发展或是发生改变。

    泪流满面,每次重启电脑就会给 wsl2 分配一个随机的 ip 段,这导致了非常多问题

    然后搜过之后,大部分方法全是清一色编辑 win10 的 hosts 文件自定义个域名(如 wsl.net 之类的),然后每次重启后更新这个域名的 ip 。但问题是我需要的固定 ip,而不是 DDNS,这类解决方法对于解决问题于事无补

    这几天重翻 wsl 的 issue,终于找到了梦寐以求的解决办法。cmd/powershell 管理员权限执行这两行命令( ip 和 wsl 发行版名称根据自己的实际情况做出更改):

    wsl -d Ubuntu -u root ip addr add 192.168.50.16/24 broadcast 192.168.50.255 dev eth0 label eth0:1
    
    netsh interface ip add address "vEthernet (WSL)" 192.168.50.88 255.255.255.0
    
    

    唯一不足是重启后会失效,所以把这两行命令保存为 bat 文件加入系统自启项,每次重启后让它自动设置就行了。这样你的 wsl2 终于有了个固定 ip 。泪流满面

    出处: https://github.com/microsoft/WSL/issues/4210#issuecomment-648570493

    第 1 条附言  ·  2021-04-16 15:17:04 +08:00
    补充一下:
    上面第一行命令中的 ip 192.168.50.16 是分配给 wsl2 的固定 ip

    第二行的 ip 192.168.50.88 是分配给宿主机的固定 ip,用来在 wsl2 中访问宿主机,这样不光 wsl2 有固定 ip,连从 wsl2 中访问宿主机也都用固定 ip 了

    如果没有 wsl2 访问宿主机的需要的话,第二行命令可以不用
    第 2 条附言  ·  2021-04-22 20:33:22 +08:00
    不好意思,搞错了一点,第二行命令也是必须的,没有第二行命令给宿主机分配一个 ip 的话,宿主机就无法在指定的 ip 段与 wsl2 交互
    27 条回复    2023-03-16 20:21:18 +08:00
    interim
        1
    interim  
       2021-01-14 16:43:44 +08:00
    我都不关机,没这个问题....
    这里有个项目关于 wsl2 自动更新 host 的项目 https://github.com/shayne/go-wsl2-host
    interim
        2
    interim  
       2021-01-14 16:46:29 +08:00
    我一直用 localhost 访问的 wsl2 下开放的端口,想了解使用固定 ip 的原因是什么?
    我很久以前只遇到过一次 idea 用 localhost 连接 wsl2 docker 下的 mysql 连接失败的问题,改成 wsl2 的 ip 就好了
    BeautifulSoap
        3
    BeautifulSoap  
    OP
       2021-01-14 16:55:31 +08:00
    @chnyuwen 就随便举个例子,我想把 wsl2 中的文件,通过 samba 共享给我的局域网,或者贡献给同一台电脑中另外的虚拟机,没有固定 ip 的话根本做不到
    baobao1270
        4
    baobao1270  
       2021-01-14 18:01:35 +08:00
    个人感觉这个方法十分 Dirty,因此放弃了 WSL2 转回了 WSL1+需要时用 VM……

    搞不懂为啥每次重启 vEthernet (WSL) 和 vEthernet (Default) 都会重置……
    BeautifulSoap
        5
    BeautifulSoap  
    OP
       2021-01-14 18:41:29 +08:00 via Android
    @baobao1270 可能微软不希望 wsl2 的 ip 过于固定,导致影响到同类业务的市场吧,只能这么想了。因为怎么想固定 ip 都不是个技术问题

    至于 dirty 不 dirty,wsl 无法运行 docker,想跑 wsl backend 的 docker 也只能用 wsl2 了
    Jisxu
        6
    Jisxu  
       2021-01-14 22:31:53 +08:00
    有一个比较曲折的方法:
    windows 端,用 nssm 将 frps 注册为服务并随开机启动
    wsl 端,安装并启动 frpc,注册到 frps 上,然后 frpc 开机启动,我用的 archwsl,支持 stystemd,直接 enable 即可
    这样一搞,无论 wsl 的 ip 怎么变,都和我无关,唯一需要固定是应该就是 windows 端网卡的 ip 了
    BeautifulSoap
        7
    BeautifulSoap  
    OP
       2021-01-15 00:40:21 +08:00 via Android
    @Jisxu 额,不知道你有没有用过 wsl2,你说的这功能 wsl2 早就已经自带了,而且还根本不用配置 frp

    win10 端想要访问 wsl2 的端口的话,直接通过 localhost:xxx 就能访问到 wsl2 中对应的 xxx 端口,会自动进行转发。
    局域网的话则可以通过 win10 局域网 ip:xxx 的方式访问到 wsl2 中的端口。


    你谈到的配置 frp 和 wsl2 自带的流量转发从功能上讲是一模一样的,对于需要固定 ip 的人来说依旧是没有解决根本问题
    forbxy
        8
    forbxy  
       2021-01-15 11:32:10 +08:00
    最近用虚拟机完全替代了 wsl 了,主要是 systemd 用习惯了,还有子系统想迁移到另外一台机器太麻烦了
    0 、虚拟机从路由器分配固定 ip
    1 、windows terminal 新增一个 tab,内容为 ssh.exe 远程登录虚拟机
    2 、虚拟机挂载所有磁盘到 /mnt/hgfs/{c,d,e,f}
    3 、RaiDrive 将虚拟机磁盘映射为 windows 网络磁盘 I
    4 、windows 上 pycharm 打开网络磁盘上的项目,设置虚拟机的 python 解释器。设置 deployment 文件映射,关闭自动上传

    丝滑体验
    BeautifulSoap
        9
    BeautifulSoap  
    OP
       2021-01-15 11:43:31 +08:00
    @forbxy wsl 不太清楚(似乎需要把整个系统打包成 tar ),但是 wsl2 迁移的话倒是真的简单,直接把 vhdx 文件复制到别的电脑里改下设置就行了(和虚拟机的迁移一样)

    以前我也是跑完整的 linux 虚拟机的,但是 wsl2 backend 的 docker 体验太好了,之后就直接全迁移到 wsl2 了
    baobao1270
        10
    baobao1270  
       2021-01-15 13:34:48 +08:00 via Android
    @BeautifulSoap 算半个技术问题,因为 Hyper-V 的交换机是在系统启动后才初始化的,为了防止 IP 冲突就得每次自动随机出一个 IP 来。但是手动创建的虚拟交换机不受影响
    BeautifulSoap
        11
    BeautifulSoap  
    OP
       2021-01-15 13:46:47 +08:00
    @baobao1270 这不是技术问题,wsl2 初始化的时候随机一个未使用 ip 段确保不出现冲突然后不变就行了。为了不出现 ip 冲突就每次重启都删了 wsl 的虚拟交换机然后重新创建实在太因噎废食了
    fengwn
        12
    fengwn  
       2021-01-24 17:55:03 +08:00
    都用了 192.168 私有网段,那还不如上虚拟机或者直接用 Docker for window(虽然挺操蛋的).一劳永逸的话,直接 Linux 平台走起.
    BeautifulSoap
        13
    BeautifulSoap  
    OP
       2021-01-24 19:38:43 +08:00
    @fengwn 都说了根据自己情况更改配置,不想用 192.168 那就用其他 ip 段,没人限制你用其他 ip 段

    我就是为了更好体验地使用 Docker for windows 才从虚拟机迁移到 wsl2 的,你竟然说干嘛不用回虚拟机或用 Docker for Windows

    至于直接用 Linux,明显就是一逸永劳
    petshop
        14
    petshop  
       2021-01-25 19:43:17 +08:00
    请问如何讲 bat 设置开机启动 我吧 bat 放到了 \Start Menu\Programs\Startup 文件夹下但好像不会自己运行 还有自动启动的脚本要如何设置管理员运行
    EdwinHui
        15
    EdwinHui  
       2021-02-26 23:54:58 +08:00
    @forbxy 请问你这样做的话,开发用的文件是放在宿主机上,虚拟机通过 /mnt 访问,还是直接放在虚拟机内部?
    xiecanmy
        16
    xiecanmy  
       2021-03-12 10:33:12 +08:00
    @petshop 计划任务, 记得设置为最高权限
    bearboss
        17
    bearboss  
       2021-04-16 14:58:26 +08:00
    里面的 ip 之类的得根据现有的 ip 替换吗 比如现有的是 172 开头的 子网段也不一样
    BeautifulSoap
        18
    BeautifulSoap  
    OP
       2021-04-16 15:12:12 +08:00
    @bearboss 有点没理解,如果是想固定 ip 的话,两行命令中的 ip 只要和现有 ip 段之类的冲突,是可以随意设置的
    bearboss
        19
    bearboss  
       2021-04-16 16:30:13 +08:00
    @BeautifulSoap 这样设置后局域网内其他电脑用这个 ip 能远程访问到 wsl 吗 如果不设置成同个网段的话 计网不好请见谅
    BeautifulSoap
        20
    BeautifulSoap  
    OP
       2021-04-16 19:27:37 +08:00   ❤️ 1
    @bearboss 只要这个 ip 的流量被转发到运行 wsl2 的宿主机就能访问到 wsl2

    这时候分两种情况:
    1. 同一台电脑上的多个局域网(比如不同虚拟机),一般不需要特别设置就能直接访问到(因为虚拟机一般都默认把宿主机设置为网络的网关,如果没有设置的话设置下网关就行了)

    2. 同一个物理局域网中的其他电脑的话,需要简单设置下路由表(因为你 wsl2 的独立 ip 其他电脑是不可能知道这 ip 是拿来干嘛的)把 wsl2 的 ip 路由到你运行 wsl2 的宿主机上。或者觉得麻烦,可以在路由器里设置下路由规则,这样所有接入局域网的设备都能访问到你的 wsl2 了
    smallthing
        21
    smallthing  
       2021-04-30 18:05:59 +08:00
    其实微软完全可以做一个 GUI,喜欢现有设定的选 default,希望固定 ip 的自己定一个.
    UN2758
        22
    UN2758  
       2021-12-07 04:16:36 +08:00
    @BeautifulSoap #20 大佬,在无法设置路由器路由表的情况下,怎么设置其他电脑的路由表啊?比如我有 mac 和 winpc 处于同一局域网,mac 想访问 winpc 上的 wsl2 ,winpc 和 wsl2 设置了新子网 192.168.120.100 和 199 ,mac 上应该如何设置呢
    BeautifulSoap
        23
    BeautifulSoap  
    OP
       2021-12-07 22:40:46 +08:00
    @UN2758 没法碰路由器的话那就只能给 mac 单独设路由表了,mac 具体怎么配置路由表我没 mac 所以不清楚,应该一搜一大把

    至于怎么个思路,就是设置 mac 路由表,让 mac 把 192.168.120.199 流量给路由到 winpc 的 192.168.120.100 上就行了,winpc 接收到流量后会自动处理

    这方法我在同一台电脑上不同虚拟机上试过没问题
    UN2758
        24
    UN2758  
       2021-12-07 22:59:10 +08:00
    @BeautifulSoap #23 忘了说了,mac 和 winpc 的局域网网址是 192.168.1.107 和 111 ,这算是属于另一个子网吧,这种情况下设置路由表也能路由到吗
    BeautifulSoap
        25
    BeautifulSoap  
    OP
       2021-12-07 23:43:26 +08:00
    @UN2758 啊,不好意思我理解错了。想了下和我之前同一台电脑不同虚拟机情况不太一样。这情况应该是没法通过指定路由表来转发流量的
    davelm
        26
    davelm  
       2022-11-25 09:59:18 +08:00
    不知道能不能固定 ipv6 ,这样就能直接公网访问了
    gkdgkd
        27
    gkdgkd  
       2023-03-16 20:21:18 +08:00
    @interim 这个好,学到了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2435 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 02:22 · PVG 10:22 · LAX 18:22 · JFK 21:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.