终于找到给 wsl2 分配固定 ip 的方法 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
BeautifulSoap
V2EX    分享发现

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

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

    泪流满面,每次重启电脑就会给 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     Solana     2411 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 15:41 PVG 23:41 LAX 07:41 JFK 10:41
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86