我试图在父母的笔记本电脑上设置 VNC 服务器,以便提供远程协助。我登录(通过 Chrome 远程桌面),安装 TightVNC 并在路由器上设置端口转发,但无法连接到它。经过一番谷歌搜索后,我发现问题是 ISP 没有为他们分配静态 IP(路由器的 WAN IP 地址是 172.17.xx.xx)。
有什么我可以自行托管的东西可以让我远程访问他们的机器吗?(也就是说,我想在我自己的机器上安装某种服务器,它有一个静态 IP,然后在他们的笔记本电脑上安装一个客户端,让我可以远程登录,类似于 logmein/teamviewer/etc,但是是自行托管的)
答案1
你需要一个VNC 中继器类似这个。以下是摘录自这本出色的指南詹姆斯·B:
有两种方法可以运行 VNC 代理:
第一个是使用所谓的 VNC 中继器。
该技术最初由 UltraVNC 开发,但现在已非常流行并可用于许多 VNC 衍生产品。 这里是对其工作原理的权威解释。您需要使用模式 2,因为该模式允许服务器和客户端都位于 NAT 后面。
您可以从 UltraVNC 网站本身下载中继器软件;但除非您打算在中继器操作系统上使用 Windows,否则我建议您从其他地方获取它们,因为它们的更新频率更高。
中继器软件有以下几种形式:您需要自行编译和构建的 C 源代码(最好在代理计算机上;或者至少在与代理计算机运行相同操作系统的计算机上);以及您可以直接运行的 Perl 脚本。两者都要求您在代理计算机上将它们作为守护进程(即服务器进程)运行;持续监听来自服务器和客户端的连接。
无论如何,请注意,要实现此功能,您需要 VNC 客户端和服务器都支持 UltraVNC 中继器扩展。标准服务器和客户端将无法工作。与这些中继器配合使用的 VNC 客户端示例如下:安全软件控制中心。
Perl 脚本版本可用这里. 查找名为 ultravnc_repeater.pl 的文件(或者你可以直接从此链接)。我已经测试过这个脚本,它运行良好。
C 源代码版本可用这里。它是原始 UltraVNC 中继器版本(仅适用于 Windows)的端口,因此它或多或少是“官方”版本。
还有其他非官方版本:
http://code.google.com/p/uvncrepeater
https://code.google.com/p/vncrepeater
我没有测试过任何 C 版本,因此无法评论它们的可用性。最后一个链接特别有趣,因为它声称可以与标准 VNC 客户端(而不是 UltraVNC 扩展客户端)配合使用。
一旦设置了代理服务器,就可以在服务器端启动与代理的连接:
x11vnc -connect repeater=ID:1234+host:port
其中“1234”是向中继器标识该服务器的唯一 ID。
在客户端:
ssvncviewer -repeater ID:1234 host:port
客户端使用相同的ID,以便中继器可以将其连接到正确的服务器。
服务器和客户端上的 host:port 指的是代理服务器。端口不同;通常服务器端口为 5500,客户端端口为 5900。本例中使用了 x11vnc 和 ssvnc,但您可以轻松使用其他兼容 UltraVNC 的服务器和客户端。
另一个选择是运行 VNC Transferer
VNC 连接器是比中继器相对较新的发明。它使标准服务器和客户端能够相互连接。从使用角度来看,它的工作原理与中继器类似,但内部工作原理不同。
该软件以 CGI Perl 脚本的形式提供,由 Karl Runge(ssvnc 和 ultra_repeater Perl 脚本的作者)提供,网址为:传输。
要使用此功能,您需要在代理服务器上运行 Web 服务器,并将其配置为以 CGI 形式运行 vncxfer 脚本。连接后,脚本将创建一个服务器进程,用于处理服务器和客户端连接。服务器进程将创建动态分配的临时端口对;一个用于服务器,一个用于客户端。
通过使用 Web 浏览器访问 CGI URL 来启动连接。您看到的网页将要求输入“会话 ID”;一旦输入该 ID,它将为服务器和客户端启动一个具有随机端口的会话。您必须在给定时间内(默认为 300 秒)启动客户端和服务器连接,否则会话将被取消。
启动 VNC 服务器,像往常一样使用 -connect 连接代理(不需要 ID):
x11vnc -connect host:port
并照常启动客户端(不需要 -repeater 字符串)
vncviewer host:port
服务器和客户端上的 host:port 指的是代理服务器。端口不一样;网页会告诉您哪个端口用于服务器,哪个端口用于客户端。此示例中使用的是 x11vnc,但您可以轻松使用其他服务器和客户端。
一旦连接结束,vncxfer 将终止临时会话。
注意:您无法在普通的网站托管帐户上运行此功能。您需要 VPS 帐户,因为:
- 普通虚拟主机账户通常会禁止长时间运行的进程来响应 CGI 调用(vncxfer 服务器进程实际上就是这样的)
- 普通网络托管账户通常不允许访问除 HTTP 和 HTTPS(或 SMTP)之外的任意端口。