我有一个应用程序,它通过给定端口(例如端口 4000)在网络上传输纯文本数据。此数据用于在我的 vps 上运行的另一个应用程序。我如何在我的家庭服务器和 vps 之间加密这些数据。我曾想过使用 ssh 隧道,但不知道该如何实现,因为数据将直接进入 vps 上的另一个应用程序。所以它不会像一个简单的“ssh -D 9000 user@ip”
答案1
我假设你的连接很清晰,从localhost
到$VPS:4000
。
要建立 SSH 隧道,您需要打开一个端口,localhost
将流量通过隧道传输到服务器上的端口 4000 $VPS
。
以下命令行可以实现该功能:
ssh -L9000:localhost:4000 user@$VPS
其中 9000 是我选择的本地端口。
然后,您必须将应用程序更改为不再连接到 ,$VPS:4000
而是连接到localhost:9000
。
其工作原理是连接到user@$VPS
,然后localhost:9000
在本地主机和localhost:4000
远程主机之间创建安全连接。
这样,加密对您来说就是透明的,您不必尝试实施任何加密算法。或者更糟的是 - 自己制作加密算法。
你做必须确保在需要时 SSH 连接始终可用。如果您不熟悉公钥身份验证,使用公钥身份验证可能会很有用 :)
答案2
这是一个可能有用的命令:
ssh -C -L80:127.0.0.1:80 -L443:127.0.0.1:443 $USER@$VPS
-L$LOCALPORT:$JUMPIP:$REMOTEPORT
$JUMPIP 不必与 VPS 是相同的地址。
如果您的 VPS 有完整的 VPN,则没有必要这样做。
如果您的应用程序正在使用临时端口,您可能会遇到一些麻烦;您事先无法知道将使用哪个端口。
答案3
由于您给我们的细节很少,这个问题的答案会有点复杂。
如果您与服务器有 VPN 连接,那么总的来说最好的解决方案就是使用它将您的应用程序路由到其远程对应方,因为所有工作(路由和加密/解密)都已设置好。
在某些情况下,这是无法做到的。例如,您有一个路由 VPN,并且您的应用程序希望使用不常见的网络协议(NetTalk、IPX、IPv6...),或者您需要与远程服务器位于同一个广播域中。或者您的应用程序需要使用 UDP,而您的 VPN 使用 TCP。这根本无法做到,同样的评论也适用于建议使用的其他答案远程控制。
解决这个问题的另一种方法是使用桥接,基于 UDPVPN。第一个规范允许您属于同一个广播域,并使用您想要的任何路由协议,第二个规范(基于 UDP)允许您使用 UDP 端口。
总的来说,最简单的解决方案是使用OpenVPN但它并不是唯一的解决方案。在姊妹网站 ServerFault 上,你可以找到这个答案解释如何为 GRE 隧道设置 IPSec。IPSec 提供加密,GRE 隧道提供点对点连接。再次建议您通过 UDP 而不是 TCP 运行 IPSec。
请注意,关于通过 UDP 的 VPN 不稳定的讨论是没有意义的:一旦 TCP 数据包通过 UDP(或 TCP)VPN 发送,无论 VPN 是通过 UDP 还是 TCP,它都会被重新传输(由监听应用程序提供)。换句话说,内容完整性是由封装协议提供的,而不是由载体协议提供的。这样一来,你就可以通过使用 UDP 协议的 VPN 通信进行转发。