我有一台运行 W10 的非常远的物理 PC,它位于具有公共 IP 的 4G 路由器(teltonika Rut955)后面。rut955 有一个正在运行并配置好的 OpenVPN 服务器,我使用它通过 VPN 使用 TightVNC 访问 PC。
原始 LAN 配置为:
Rut955: 192.168.2.1 255.255.255.0
PC: 192.168.2.3 255.255.255.0
OpenVPN 服务器正在运行,推送路由选项设置为 192.168.2.0 255.255.255.0。因此我可以通过 VPN 连接到 PC。
由于 thightVNC 是访问该 PC 的唯一方式,因此我尝试设置另一个方式,即 SSH。由于我的 Windows 管理员技能很低,因此我尝试设置 WSL2 并在其中放置 SSH 服务器,以便我管理 PC 内的文件。
在 WSL2 上安装 Debian 后,我注意到 WSL 实例没有互联网连接,也无法直接访问,相反,W10 作为 WSL 的路由器/nat 运行。为了让 WSL 直接可访问,我遵循了这:
问题就出在这里。我没有点击物理适配器并将其与 vEthernet (WSL) 共享,而是反过来做的。我点击了 vEthernet (WSL) 适配器,然后在“家庭网络连接”中输入了我的物理以太网连接。我很紧张,没有仔细阅读,所以我不是 100% 确定,但我想是的。
之后,弹出窗口提示地址将更改为 192.168.137.1。由于我在 vEthernet (WSL) 适配器上进行更改,而不是在物理适配器上进行更改,因此我单击了“继续”,因为我以为它指的是 WSL 地址。但事实并非如此。我立即失去了连接。
之后我将 rut955 的 IP 改为 192.168.137.100/24,并将 OpenVPN 服务器上的推送选项改为 192.168.137.100/24。但是无法通过 VPN ping 通。我猜是因为 PC 没有配置网关。
如果我 ssh 进入 Rut955,我可以 ping 电脑。此外,如果我通过 Rut955 GUI 扫描网络,就会看到 W10 电脑。
192.168.137.1
XX:XX:XX:XX:XX:XX
DESKTOP-9V9NTVH
然后我继续将路由器 wan 上的所有端口转发到 PC,并尝试通过 vnc 连接到公共 rut955 IP。这也失败了。
我如何恢复与 W10 PC 的 vnc 连接?
编辑@user1686 的答案:
谢谢你的回答。我根本不是网络方面的专家,所以我在网上读了你的回答一段时间。
对于选项 A:我不知道我是否理解了您的答案,但 192.168.137.1 不是 Rut955 IP,而是当前 PC IP。我已经通过 Rut955 GUI 将 wan 端口 5900(vnc 端口,也尝试使用 0:65535)转发到 PC ip(192.168.137.1:5900)。
我对其进行了更深入的研究,发现路由器 GUI 似乎在 iptables 之上工作。我从未直接使用过 iptables,但做了一些研究iptables -t nat -L
后发现:
DNAT tcp -- anywhere anywhere tcp dpt:5900 /* emergency */ to:192.168.137.1:5900
DNAT udp -- anywhere anywhere udp dpt:5900 /* emergency */ to:192.168.137.1:5900
因此,路由器 GUI 似乎创建了 DNAT。我应该用 SNAT 替换它吗?另外,我完全不确定应该在哪些 IP 之间执行 SNAT...
对于选项 B:请原谅我的无知,但如果 PC 上没有 SSH 服务器,此解决方案是否有效?实际上,有一个适用于 Windows 的 openSSH,但唯一存在的 Windows 用户的密码为空...
答案1
不需要网关来访问机器自己子网上的地址,因此您需要找到一种方法让您的 VNC 连接看起来好像来自路由器的 LAN IP 地址而不是您自己的 VPN 地址:
a) SNAT
在路由器上添加 SNAT 规则(针对通过 LAN 接口输出的数据包 - 即与典型的 WAN SNAT/masq 规则相反),这样从 VPN 客户端到 LAN 的数据包看起来就像是来自网关自己的地址(即 PC 的“本地”地址)。
对于 iptables:
iptables -t nat -I POSTROUTING -d <pc_ip> -j MASQUERADE
或者:
iptables -t nat -I POSTROUTING -d <pc_ip> -j SNAT --to-source <router_ip>
请注意,“端口转发”不是 SNAT – 而是 DNAT(因为它重写目标地址而不是源地址)。住宅路由器通常使用 SNAT 来处理发往 WAN 接口的数据包,使用路由器的公共 IP 伪装数据包;在这种特定情况下,您需要将其应用于相反的流量方向(从路由器到 LAN)。
或者,
b)SSH 隧道
通过 SSH 连接到路由器并为 RDP 配置“本地”隧道(使用-L
ssh.exe 或 plink.exe 选项)。在远程端,看起来就像路由器本身正在建立 RDP 连接。
在本地,使用
ssh <router_ip> -L 3390:<pc_ip>:3389
(或与相同plink.exe
,或在PuTTY中配置等效的“本地隧道”)。ssh <router> -v -N -L 3390:192.168.147.5:3389
这将使 SSH 客户端在端口 :3390 上监听连接,然后从路由器的 SSH 服务器转发到 <pc_ip>:3389。(监听端口可以任意选择,只要它在本地机器上未被使用即可。)
在本地,通过 RDP 或 VNC 连接到
localhost:3390
。连接将代理到远程 PC,远程 PC 将把路由器(其地址为“本地”)视为连接客户端。
b.1)SSH 隧道到 IPv6 地址
即使机器不再具有(已知)IPv4 地址,通常它仍然具有至少“链路本地” fe80::*
IPv6 地址。(链路本地地址具有静态前缀,因此无论 LAN 是否具有任何形式的 IPv6 连接,它们都独立存在。)
ip -6 neighbor
尝试在( )中查找计算机的 IPv6 链路本地地址ip -6 n
,或通过使用 观察网络数据包tcpdump
。计算机可能会不时发出一些 ICMPv6 数据包;如果是 Windows,它还可能发送 mDNS 或 LLMNR 或 WS-Discovery 数据包。# ip -6 n fe80::6e3b:6bff:fec0:bf dev wlan0 lladdr 6c:3b:6b:c0:00:bf REACHABLE
# tcpdump -e -n -i eth0 "ip6 and not port 22" [wait for a familiar MAC address to show up...]
找到后,为该地址配置一个 SSH 隧道。
ssh <router> -v -N -L "3390:[fe80::abc:def%eth0]:3389"
请注意,地址周围的 [括号] 是必需的(以将其与端口号分隔开)。
还要注意,%eth0 – 本地链接地址必须使用“区域 ID”(即接口名称或数字索引)指定。由于实际连接将由路由器上的 sshd 发起,因此您需要从路由器的角度(而不是本地计算机的角度)指定此地址。在此示例中,路由器将通过其 eth0 接口连接到 fe80::abc:def。
像以前一样通过 RDP/VNC/等连接到 localhost:3390。