如何将 WSL2 8080 转发到 Windows 主机的 8080?

如何将 WSL2 8080 转发到 Windows 主机的 8080?

我有:

  1. Spring Boot应用程序运行在 Windows 上在 8080
  2. A服务跑步在 WSL2 中的 Docker 容器中Ubuntu,以及

我想知道怎样将Windows主机的8080启用到此服务吗?

局限性该服务是开发设置的一部分,并使用 docker-compose 构建,因此该解决方案应该是 IP 独立的或完全(最大程度)自动化的。

该应用程序可以通过 访问curl $(hostname).local:8080,但当我尝试添加iptables规则(基于这些规则)时找到这里)重定向“wsl:8080->winhost:8080”

sudo iptables -A FORWARD -i lo -o eth0 -p tcp --syn --dport 8080 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -i lo -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o lo -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A PREROUTING -i lo -p tcp --dport 8080 -j DNAT --to-destination 172.28.80.1:8080
sudo iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 8080 -d 172.28.80.1 -j SNAT --to-source 127.0.0.1:8080

其中172.28.80.1- 是 Windows 主机 IP,然后curl开始挂起直至超时。

有什么建议么?

答案1

我已设法从 WSL2 下的 Docker 容器内部连接到 Windows 机器上打开的端口(ubuntu 上带有 xdebug 的 php 容器连接到 Windows 上的 phpstorm),如下所示:

  1. 在 docker-compose.yml 或 docker-compose.override.yml 中映射主机并重建容器
services:
  php:
    build:
      context: ./
      target: debug
    extra_hosts:
      - "host.docker.internal:host-gateway"
  1. 从容器执行 ping 操作host.docker.internal现在应该会显示 Docker 为其网络分配的 ip,或者您可以通过创建具有/etc/docker/daemon.json以下结构的文件来手动指定桥接 ip 和默认 docker 子网 IP 范围 - 更多详细信息请见此处:https://serverfault.com/a/942176/1029877
{
  "bip": "172.30.0.1/16",
  "default-address-pools":[
    {"base":"172.32.0.0/16","size":24},
    {"base":"172.33.0.0/16","size":24},
    {"base":"172.34.0.0/16","size":24}
  ]
}

在哪里

  • bip将是 docker 映射的值host.docker.internal
  • default-address-pools将用于为容器分配 IP 地址
  1. 然后定义一个新的 iptable 规则如下
iptables -t nat -A PREROUTING -j DNAT -d 172.30.0.1 -p tcp --dport 9003 --to 172.24.96.1

在哪里

  • 172.30.0.1是初始请求的目的地 - 尝试连接的位置
  • 172.24.96.1是分配给 WSL 网络的 IP 地址 - 我们需要将请求转发到该地址
  • 9003端口是 - 源和目标端口相同

更多灵感或我偶然发现的问题的资源:

现在,我希望实现这一自动化,并确保在更改网络连接或从睡眠/休眠状态唤醒后不会出现任何问题(因为它有时会通过 ssh 进行另一个端口转发 - 但这可能与我的设备上的某些驱动程序有关)。

相关内容