我有一个在 KVM 上运行的 Windows VM,并通过 NAT 网络连接到我的客户机。
除了 NAT 网络,我无法使用任何其他网络,因为 Windows VM 有一个企业软件,只允许一个连接。
客户机 Windows VM 运行只能在 Windows 上运行的自定义 VPN。我的主机运行的是 Linux,我想通过 VM 和 VPN 重定向部分流量(例如 10.0.0.0/8)。
我正在尝试做的事情:
┌─────────────────────────────────────┐
│ Windows VM │
│ ┌────────────────────────┐ │
│ │ │ │ ┌───────────────────────┐
│ │ ┌───▼─────┤ │ │
│ │ 192.168.122.2 │ VPN │ ┌─────┐ │ Corporate network │
├──────┼────────────────────┴───┬─────┤ │ │ │ │
│ │ NAT network └─────┼────►│ WWW ├───►│ 10.0.0.0/8 │
│ │ │ │ │ │ │
├──────┼──────────────────────────────┤ └─────┘ │ │
│ │ 192.168.122.1 │ └───────────────────────┘
│ │
│ │
│ Linux guest │
└─────────────────────────────────────┘
我已尝试过:
- 在来宾虚拟机上启用 IP 转发
- 在主机上添加到客户机的路由(ip route add 10.0.0.0/8 via 192.168.122.2)
但是 traceroute 显示虚拟机没有转发请求。
是否可以使用 NAT 网络来实现这一点?您将如何实现这一点?
我已经看到了关于这个主题的其他问题(将一些流量路由到连接到 VPN 的虚拟机),但找不到实现正确路由的方法。
答案1
理论上可行,但实践中未必如此,因为即使所有设置都正确,企业 VPN 客户端也可能故意阻止转发来自外部的数据包。(例如,据我所知,思科的 AnyConnect 就是这样一个客户端。)
使用“NAT 网络”应该没有问题,因为通常“NAT”部分仅适用于完全离开主机的数据包,而在主机和客户机之间,它只是一个桥接的以太网子网。(如果两个主机之间没有网关,则也没有 NAT。)
但是,您实际上需要在不同的地方使用 NAT – 除了您添加的路由之外,您还需要 Windows 计算机伪装来自主机的所有数据包,然后再将它们转发到 VPN 接口。如果这里没有 SNAT,VPN 服务器(和您的公司网络)将看到来自您的 LAN IP 地址的数据包 – 它们可能会被 VPN 客户端过滤,可能会在 VPN 服务器上被拒绝,即使它们没有被拒绝,公司网络中的设备也不知道如何回复给他们。
因此,在您无法控制远程网络的情况下(即您没有设置适当的站点到站点 VPN),“VPN 客户端”机器需要对来自 192.168.122.x 的所有数据包进行 SNAT,就好像它们来自“VPN 客户端”本身(来自其 10.something 地址)。
我不知道如何在 Windows 10 中启用 SNAT/masquerade,但我确信该功能存在,因为 Hyper-V 在消费者版本的默认 vSwitch 上启用了它(所以您可能可以在 Windows VM 中安装 Hyper-V 并使“物理”以太网接口成为 vSwitch 的成员?)