将 WSL 内的本地 api 暴露给物理设备和模拟器

问题描述 投票:0回答:3

我正在 Windows 10 计算机上开发 React Native 应用程序。我安装了 WSL,在其上设置了我的后端需求,我可以看到我的 api 从 Windows 在本地主机上响应,这方面没有问题。

现在我想从我的移动应用程序中调用它 - 既可以从使用 Android Studio 的 Android 模拟器中调用,也可以从通过 wifi 连接到同一本地网络的物理 Android 设备(使用 Expo)中调用。

使用 Ngrok 它可以工作,将我的本地主机暴露给公共 URL,但这不是我想要的。如果可能的话,我希望一切都保留在本地。我的电脑的本地 ipv4 是

10.0.0.8
,但该地址上没有显示任何内容(不是来自移动应用程序,也不是来自我的桌面浏览器,这在使用
localhost
时有效)。

WSL 中我的 Ubuntu 说:

~$ cat /etc/hosts

# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateHosts = false
127.0.0.1       localhost
127.0.1.1       JB-PC.localdomain       JB-PC

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

我的

ipconfig

Carte Ethernet Ethernet :

   Suffixe DNS propre à la connexion. . . : Home
   Adresse IPv6 de liaison locale. . . . .: fe80::f04e:ae2b:40b9:3d82%6
   Adresse IPv4. . . . . . . . . . . . . .: 10.0.0.8
   Masque de sous-réseau. . . . . . . . . : 255.255.255.0
   Passerelle par défaut. . . . . . . . . : 10.0.0.138

Carte Ethernet vEthernet (WSL) :

   Suffixe DNS propre à la connexion. . . :
   Adresse IPv6 de liaison locale. . . . .: fe80::68c3:25c9:588a:a957%17
   Adresse IPv4. . . . . . . . . . . . . .: 172.20.32.1
   Masque de sous-réseau. . . . . . . . . : 255.255.240.0
   Passerelle par défaut. . . . . . . . . :

本地主机 ping ::1 :

C:\WINDOWS\system32>ping localhost

Envoi d’une requête 'ping' sur JB-PC [::1] avec 32 octets de données :
Réponse de ::1 : temps<1ms
Réponse de ::1 : temps<1ms
Réponse de ::1 : temps<1ms
Réponse de ::1 : temps<1ms

Statistiques Ping pour ::1:
    Paquets : envoyés = 4, reçus = 4, perdus = 0 (perte 0%),
Durée approximative des boucles en millisecondes :
    Minimum = 0ms, Maximum = 0ms, Moyenne = 0ms

和 127.0.0.1 ping 以及使用

-4
选项 ping localhost 会给出相同的输出:

C:\WINDOWS\system32>ping 127.0.0.1

Envoi d’une requête 'Ping'  127.0.0.1 avec 32 octets de données :
Réponse de 127.0.0.1 : octets=32 temps<1ms TTL=128
Réponse de 127.0.0.1 : octets=32 temps<1ms TTL=128
Réponse de 127.0.0.1 : octets=32 temps<1ms TTL=128
Réponse de 127.0.0.1 : octets=32 temps<1ms TTL=128

Statistiques Ping pour 127.0.0.1:
    Paquets : envoyés = 4, reçus = 4, perdus = 0 (perte 0%),
Durée approximative des boucles en millisecondes :
    Minimum = 0ms, Maximum = 0ms, Moyenne = 0ms

我应该做什么才能使这项工作成功?

windows networking windows-subsystem-for-linux local
3个回答
1
投票

所以我找到了一个解决方案,感谢https://superuser.com/a/1618446/757755我成功地使用了选项2并使用了端口转发,并在here找到了脚本。请记住,您的 PowerShell 脚本必须以管理员身份运行。


0
投票

enter image description here

这是快速而肮脏的方法:只需运行

npx expose-wsl@latest
before 启动 expo 开发服务器。

免责声明:我是该包的作者;-)
有关更多信息,请参阅 expose-wsl github 存储库


0
投票

添加我的解决方案,因为每当向我分配移动应用程序任务时,我总是会回到这个问题:

基本上我必须使用 Jeremy 在所选答案中使用的脚本,不受限制地运行执行策略,以 . wdwsl.ps1 并返回默认值。

这是我的脚本:

$remoteport = bash.exe -c "ifconfig eth0 | grep 'inet '"
$found = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';

if( $found ){
  $remoteport = $matches[0];
} else{
  echo "The Script Exited, the ip address of WSL 2 cannot be found";
  exit;
}

#[Ports]

#All the ports you want to forward separated by coma
$ports=@(80,443,10000,3000,5000,8000);


#[Static ip]
#You can change the addr to your ip config to listen to a specific address
$addr='127.0.0.1';
$ports_a = $ports -join ",";


#Remove Firewall Exception Rules
iex "Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' ";

#adding Exception Rules for inbound and outbound Rules
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP";

for( $i = 0; $i -lt $ports.length; $i++ ){
  $port = $ports[$i];
  iex "netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr";
  iex "netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport";
}
© www.soinside.com 2019 - 2024. All rights reserved.