什么是VPN?它与 SSH 有何不同?

网络工程 虚拟专用网 tcp ip ipsec 网络核心
2022-02-11 11:28:48

我阅读了维基百科页面;但它说我们可以公开扩展私人资源。并且用户可以使用公共网络向远程资源发送 - 接收数据,因为它是私人连接的。

那么,我们可以使用 ssh 来传输数据,和 ssh 有什么不同呢?基本上,我没有得到 VPN 背后的核心思想。

2个回答

传统上,ssh 用于安全地从一台主机连接到另一台主机。

vpn 将主机安全地连接到另一个网络。这使您的本地主机可以通过防火墙等访问可能仅限于其他网络的资源。例如打印机、私人数据库等。一个典型的用途是将您的工作笔记本电脑放在办公室网络上,即使您不在办公室。

有很多协议可以用来做这种隧道 - SOCKS 就是其中之一,实际上大多数 ssh 实现都可以为你建立一个 SOCKS 隧道,但这通常不是人们在询问 VPN 时所想的。

第 1 部分:背景

假设你有一个总部。你在办公室建立了一个网络,并通过防火墙将其连接到 Internet,很可能防火墙也在进行 NAT。在您的网络中,您部署了一些服务器。您还订阅了通过 IP 白名单识别您的网络的各种 Internet 服务。

但并非所有用户都在总部。有些人在家工作,有些人在小型分支机构工作,有些人在路上工作。他们仍然需要访问您公司的服务,他们是如何做到的?

您可以让他们直接通过 Internet 访问服务,但这有几个问题。

  • 流量在通过公共互联网时可能容易受到嗅探或篡改。
  • 要有效地进行防火墙,您需要知道合法客户端的地址。这对于移动中的客户来说是一个大问题(对于在家工作的客户来说也是一个较小程度的问题)。
  • 对于基于 IP 的订阅服务,您要么必须将大量单独的 IP 加入提供商的白名单,要么提供一些替代的身份验证方式。
  • 这可能意味着这些服务都需要一个供不应求的专用 IPv4 地址(如果全世界都转移到 IPv6 就好了,但我们还没有)

您可以从电信公司购买专用电路,但这同样有问题。

  • 它很昂贵,对于小带宽要求,专用电路的成本远远高于互联网连接。
  • 这对那些移动的人来说是不切实际的。

第 2 部分:VPN

VPN 通过在公共网络之上创建专用网络来解决这一难题。

VPN 端点通常将自己作为虚拟网络接口呈现给操作系统。当数据包被发送到这个接口时,它们被传递到 VPN 软件。通常,VPN 软件会加密数据包,添加它自己的标头,然后将数据包作为有效负载传递回网络堆栈,以发送到 VPN 的另一个端点。

然后数据包通过网络(通常是公共互联网)传递到 VPN 的另一端。

当数据包到达 VPN 的另一个端点时,过程相反。操作系统接收数据包并将其作为有效负载传递给 VPN 软件。VPN 软件通常会验证数据包是否合法,对其进行解密并删除额外的标头。然后它将通过虚拟网络接口将其传递回网络堆栈。

因此,我们实际上在 VPN 的两个端点之间有一个专用网络,但数据是通过公共网络在端点之间物理传输的。

除了简单的封装和解封装,VPN 软件还会经常提供其他功能。它通常会为客户端提供一种机制来向服务器进行身份验证并建立 VPN 会话。它可以提供某种级别的网桥或路由器功能,以允许服务器上的单个虚拟网络接口为多个客户端提供服务。它很可能具有将 IP 地址和路由配置推送到客户端的功能。

客户端上的路由可以配置为通过 VPN 发送几乎所有客户端流量,也可以配置为仅通过 VPN 发送特定流量。这两种方法各有利弊。

VPN 可以在“内部”和“外部”的各个网络层运行。在内部,VPN 可以携带 IP 数据包,也可以携带以太网帧。在外部,VPN 可以通过 TCP 或 UDP 等传输协议运行,也可以直接通过 IP 运行,

将所有这些放在一起,我们有一种方法可以将我们的远程站点和用户带到我们的专用网络上,而无需购买它们之间的专用网络连接。

第 3 部分:ssh 和 socks

socks 是一种与代理对话的协议。它可以实现与 VPN 相同的一些目标,但在更高级别上运行。您的客户端应用程序与 socks 代理建立 TCP 连接,然后要求它与服务器建立前向连接。一旦建立,socks 代理就会在两个 TCP 连接之间来回传递数据。如果 socks 代理可以访问客户端无法直接访问的网络资源,则客户端可以使用代理访问这些资源。

与 VPN 不同,客户端应用程序需要了解 socks(尽管对此有一些技巧)。Socks 确实提供了可选的身份验证,但据我所知,与大多数 VPN 工具不同,它不提供加密。

客户必须了解袜子这一事实可能有利也有弊,一方面它限制了适用性。另一方面,这意味着您只能将某些应用程序指向 socks 代理。在某些情况下,您甚至可以将应用程序配置为仅对某些连接使用 socks 代理(查找 firefox 扩展“foxyproxy”)。

ssh 最初是一个用于远程 shell 访问服务器的工具。它提供加密和身份验证,通常被认为足够安全,可以直接在公共互联网上使用。

虽然最初用于远程控制台访问 ssh 可以携带其他东西。它可以在客户端上运行的程序和服务器上运行的程序之间直接承载应用数据。

ssh 的一个特性是端口转发,共有三种不同的模式,都是 TCP 级别的转发连接。默认情况下,仅转发来自 localhost 的连接。

  • “本地”ssh 客户端侦听预定端口上的 TCP 连接。当它收到一个请求时,它会要求服务器连接到一个预定的 IP/端口。然后通过 ssh 连接在两个 TCP 连接之间转发数据。

  • “远程” ssh 服务器侦听预定端口上的连接。当它收到一个请求时,它会要求客户端连接到预定的 IP/端口。然后通过 ssh 连接在两个 TCP 连接之间转发数据。

  • “动态” ssh 客户端充当 socks 代理服务器。当 socks 客户端请求连接到特定 IP/端口时,ssh 客户端请求 ssh 服务器连接到该 IP/端口。再次通过 ssh 连接转发数据。这实质上为您提供了带有 ssh 加密和身份验证的 socks 的功能。

您还可以使用 ssh 来携带 ppp(或可能会滑倒)并制作实际的 VPN。