如何在VPS上设置SSH隧道

来自菜鸟教程
跳转至:导航、​搜索

介绍

在本文中,您将学习如何在您的计算机和 VPS 之间创建一个安全、加密的隧道,以及如何绕过公司网络中的限制、如何绕过 NAT 等。

本文将介绍一些基本理论,如果您愿意,可以直接跳到后面的示例跳过。

Internet 中的通信、网络协议和通信端口

安装在您计算机中的每一个软件,想要通过 Internet 发送或接收数据,都必须使用来自 TCP/IP 堆栈的应用层协议。 这些协议定义了一种通信方式以及通过 Internet 等在主机之间发送的消息的格式。 例如:

  • HTTP - 用于从您的网络浏览器下载网站和文件
  • FTP - 用于在客户端和服务器之间发送文件
  • DNS - 用于将主机名更改为 IP 地址,反之亦然
  • POP3 和(或)IMAP - 用于下载/浏览您的电子邮件
  • SMTP - 用于发送电子邮件
  • telnet - 用于远程连接到服务器
  • SSH - 类似于 telnet,但在 secure 加密版本中,因此没有人可以看到我们发送到服务器的内容以及服务器发送给我们的内容。

接下来,必须将给定协议的消息打包到 TCP 段或 UDP 数据报中(在传输层中)。 这些协议用于通过 Internet 传输数据——它们在传输层工作。 TCP 协议是面向连接的,这意味着在发送数据之前,需要在远程机器之间建立连接。 TCP 总是以正确的顺序提供数据。 如果网络中有任何段丢失,如果没有及时收到确认,将重新发送。 TCP被认为是相当可靠的。

UDP 协议不是面向连接的。 它不为丢失的数据报提供重传。 如果数据包没有按正确的顺序接收,UDP 将按照接收顺序将它们提供给应用程序。 正因为如此,UDP主要用于传输实时多媒体数据——VoIP通话、视频会议、音频和视频。 UDP 有时被应用层中的其他协议使用 - 例如,在 DNS 的情况下。

在这种情况下,较高层的协议必须在给定时间内未收到答案后重新发送查询。 这里主要使用 UDP,因为它的开销低:在 1 个数据报中发送 1 个小查询并接收答案比建立 TCP 连接(在主机之间交换 3 个段)需要更少的时间和需要传输的数据:从一个客户端,从服务器发送确认,从服务器发送应答,然后从客户端发送确认并断开连接(4段)。

为了识别与同一 IP 地址的不同连接,我们使用端口号。 给定应用层协议的每个服务器都绑定到给定端口号并等待传入连接。 客户端连接到该端口(在 TCP 连接的情况下)或向该端口发送数据报(在 UDP 的情况下)。 对于最常用的知名协议,有保留的端口号。 例如,HTTP 服务器通常侦听 TCP 80 端口(或者,客户端必须通过在地址中指定端口号本身来连接它 - http://example.org:1234/),DNS 服务器通常侦听端口53 UDP(有时也是端口 53 TCP)。 客户端也需要在其一侧使用端口。 它们是“高端口”,如 52044,是随机生成的。

这里,你可以看到更多我们日常使用的预留端口。

然后在网络层将段和数据报打包成 IP 数据包。 在数据包中,源计算机和目标计算机由 IP 地址标识。 它们是全局的 - 一次只能有 1 个主机使用相同的地址(不包括在具有私有 IP 地址的家庭路由器中使用的 NAT 之类的魔法:192.168.xx、10.xxx、172.16-31.xx;x 是介于 1 之间的数字和 255)。 基于这些地址,路由器可以决定如何将数据包发送到目标计算机。

然后将数据包打包到数据链路层中的帧/信元中,然后通过电缆或以无线电波的形式在本地网络上传输。 在数据链路层,在帧中,计算机由它们的 MAC 地址来识别。 带有 MAC 地址的帧会从从中提取数据包的路由器中完全删除。 他们决定将数据包发送到哪个网络,将它们打包成新的帧并在途中发送。 如果两个路由器之间的网络使用 MAC 地址,则这些路由器的地址包含在帧中 - 源路由器和目标路由器。 仅使用 MAC 地址无法在不同网络中的两台计算机之间进行通信,即使它们没有重复 - 生产商仅将一个地址与一张卡相关联,因此任何制造的推车都可以具有与另一生产商制造的卡相同的 MAC 地址.

关于 SSH。 理论,第 1 部分

SSH 是应用层中的一种协议。 它是 telnet 的继承者,用于以文本模式远程连接到您的 VPS。 与 telnet 不同,SSH 是加密的。 它使用端口 22 TCP,但您可以轻松更改服务器配置中的端口。 SSH 允许用户以几种不同的方式对自己进行身份验证。

例如:

  • 使用用户名和密码
  • 使用一对密钥 - 首先,一个私有密钥(最高机密),第二个 - 一个公共密钥(在服务器上):用于连接 SSH 的程序必须使用私有密钥解决数学问题并将解决方案发送到服务器。 每次问题都不一样,因此很难使用该身份验证方法破解密钥。

现在我们使用版本 2 的 SSH。

最流行的 SSH 服务器实现是 OpenSSH。 最流行的客户端是 PuTTY(适用于 Windows)和 OpenSSH(适用于 Linux)。 PuTTY 和 OpenSHH 都允许用户创建隧道。

SSH 允许用户在服务器和客户端之间创建一条 TCP 隧道,并通过该隧道发送数据。 SSH 仅支持 TCP 隧道,但您可以解决这个问题,即 通过 SOCKS 代理。 在服务器上选定的 TCP 端口和选定的本地端口之间建立类似的隧道。 当然,它是未加密的,因此任何人都可以检查我们使用它的目的。

将使用的概念

Loopback interface - 安装在系统中的虚拟网卡,IP地址为127.0.0.1。 只有系统上安装的应用程序才能访问该地址。 无法进行远程访问。 您可以在该接口上启动 VPS,并且只能从同一系统或通过隧道进行远程访问。

SMTP - 一种让您发送电子邮件的应用层协议。 它用于邮件服务器之间的通信以及服务器和邮件客户端之间的通信。 SMTP 使用端口 25 TCP 进行未加密通信,使用端口 587 TCP 或 465 TCP(不推荐使用 - 不推荐)进行加密连接 (SSL)。

POP3 - 应用层中的协议,用于将新电子邮件从服务器下载到本地邮件客户端。 它现在很少使用,因为它已被 IMAP 取代。 对于未加密的连接,它使用端口 110 TCP,对于加密连接 - 端口 995 TCP。

IMAP - 一种类似于 POP3 的协议,但支持文件夹、标签、读取和管理服务器上的消息和文件夹,无需将所有内容下载到本地 PC 并从服务器中删除。 IMAP 使用端口 143 TCP 进行未加密连接,使用端口 993 TCP 进行加密连接。

示例 1:通往 IMAP 服务器的隧道

环回接口上的本地端口 143 - 127.0.0.1 - 和 IMAP 服务器之间的隧道,用于在同一台远程计算机上接收邮件(未加密连接)。

Unix 和 OpenSSH:

ssh abc@def -L 110:127.0.0.1:110
 
abc - username on server
def - server address
110: - local port that will be opened on loopback interface (127.0.0.1) on local machine
127.0.0.1 - IP address of computer that we creating a tunnel to via our SSH tunnel
:110 - port number of target machine we'll get to via tunnel

窗户和腻子:

[[how-to-log-into-your-droplet-with-putty-for-windows-users%0A|在这里]],您可以阅读如何使用 PuTTY 创建与您的 VPS 的连接。 该连接是创建隧道所必需的。

  • 选择您的连接,加载数据并转到 Connection->SSH->Tunnels 并将其设置如下:
  • 单击添加。 之后,每个协议应该如下所示:
  • 现在您可以保存会话并使用它进行连接。

现在您可以将您的邮件客户端配置为不直接连接到 VPS,而是使用环回接口的端口 110 - 127.0.0.1。 您可以使用不同的协议执行相同的操作 - SMTP (25)、IMAP (143) 等。

示例 2。 通往 Web 服务器的隧道

本地接口 (127.0.0.1) 上的本地端口 8080 和 WWW 服务器之间的隧道,绑定到远程计算机的端口 80。 这次我们将使用环回接口连接到它。

正如我之前所说,HTTP 协议用于将 WWW 网站下载到浏览器。

Unix 和 OpenSSH:

ssh abc@def -L 8080:11.22.33.44:80
 
    abc - username on server
    def - server address
    8080: - port on the local machine that will be opened on loopback interface (127.0.0.1)
    11.22.33.44 - IP address of the server that we'll create a tunnel to using SSH

窗户和腻子:

  • 选择连接并加载设置。
  • 转到连接->SSH->隧道
  • 像这样设置它:
  • 点击添加:
  • 现在您可以保存会话并连接。

从理论上讲,在您的浏览器中转到 127.0.0.1:8080 后,您应该会在我们 ' 连接的远程服务器上看到一个网站。

实际上,HTTP 1.1 为查询引入了 Host 参数。 此参数用于发送我们要连接的 VPS 的 DNS 域名。 如果它使用虚拟主机机制,您将获得的页面要么是错误页面,要么是服务器的主页,但不会通过隧道。

在这种情况下,我们还需要做一件事:在本地 PC 上的 hosts 文件中,添加 VPS 地址和您的环回接口:

127.0.0.1 website

website 是您要连接的站点的地址( 没有 开头的 http:// 和结尾的 / )。

Hosts 文件位于 /etc/hosts (Linux) 或 C:\Windows\system32\drivers\etc\hosts (Windows)。 要编辑此文件,您必须是管理员或具有管理权限。

重要的! 如果要在 Unix 系统上编号小于 1024 的本地端口上创建隧道,则必须具有 root 权限。

示例 3。 袜子代理

SOCKS 代理允许您通过隧道从任何协议发送流量。 从外部看,它就像一个 TCP 连接。

在此示例中,我们将在 SSH 服务器和客户端之间的环回接口上的 5555 端口上创建隧道。 接下来,我们将我们的浏览器设置为使用我们的 SOCKS 服务器作为每个传出连接的代理服务器。

此解决方案可能有助于绕过对公司网络的限制。 如果我们的 SSH 使用的端口被锁定,我们可以使用 OpenSSH 配置文件(/etc/ssh/sshd_config 或 /etc/openssh/sshd_config)中的 Listen 选项告诉服务器监听端口 443 .

Unix 和 OpenSSH:

ssh abc@def -D 5555
 
    abc - username
    def - server address
    5555 - local port number, where the tunnel will be created

窗户和腻子:

  • 选择连接并加载设置。
  • 转到连接->SSH->隧道
  • 像这样设置它:
  • 点击添加:
  • 保存会话并连接到它。

在您的浏览器设置中,设置一个在 127.0.0.1:5555 上运行的 SOCKS 代理,从现在开始直到您在 PuTTY 或 OpenSSH 中关闭连接。

例 4。 绕过 NAT

NAT(特别是 PAT,它是家庭路由器中使用的 NAT 形式)是一种允许许多人使用一个 Internet 连接的机制。 使用 NAT 的路由器有一个公共地址,并将从内部网络接收到的数据包中的所有私有地址修改为自己的公共地址,然后将它们发送到 Internet。 在收到返回的数据包时,它会做相反的事情——它会在一个特殊的 NAT 表中记住 IP 地址和端口号。

只有当我们在路由器上设置适当的端口转发时,才能从外部连接。 但是,我们可以绕过这个问题,在我们的计算机和服务器之间创建一条隧道,直接连接我们的计算机和服务器。

第1部分。

在第二部分中,我们将在本地端口 80(在我们的计算机上 - 本地 HTTP 服务器上)和远程服务器上的端口 8080 之间创建一个隧道。 但出于安全考虑,远程8080端口只会在VPS的loopback接口-127.0.0.1上开放。 因此,我们必须重新配置我们的服务器以在每个端口上打开连接。 我们现在就这样做。

  1. 在您喜欢的编辑器中,以 root 身份打开 /etc/ssh/sshd_config(或 /etc/openssh/sshd_config)文件。

    nano /etc/ssh/sshd_config
  2. 查找:

    #GatewayPorts no
  3. 将该行更改为:

    GatewayPorts yes
  4. 保存文件并关闭编辑器。
  5. 重启SSHD服务器:

    Debian/Ubuntu:
    service ssh restart
    CentOS:
    /etc/init.d/sshd restart

第2部分。

在本节中,我们将创建隧道。

Unix 和 OpenSSH:

ssh abc@def -R 8080:127.0.0.1:80
 
    abc - username
    def - server address
    8080 - port number that will be opened on remote server - our proxy server
    127.0.0.1 - IP address we open tunnel to
    80 - port number we open tunnel to

这一次,我们的隧道是本地的,但我们可以通过使用 NAT 与同一网络中的其他计算机建立隧道连接。

窗户和腻子:

  • 选择连接并加载设置。
  • 转到连接->SSH->隧道
  • 像这样设置它:
  • 点击添加:
  • 保存会话并连接。

登录后,我们可以通过具有公共 IP 地址的 OpenSSH 代理服务器从网络外部访问我们的本地 HTTP 服务器。 在浏览器中打开以下内容:

http://IP-address-or-domain-of-our-server-change-that-for-your-name:8080/

理论继续

如您所见,SSH 隧道分为三种类型:

  • 本地 - -L 选项 - 在我们的本地端口上打开一个隧道,并侦听首先重定向到我们保存的到 SSH 服务器的连接的连接,然后靠近目标主机。
  • 远程 - -R 选项 - 在 SSH 服务器上打开一个隧道。 收到服务器的连接后,所有传输都重定向到我们的本地隧道。
  • 动态 - -D 选项 - 在本地环回接口上打开隧道。 通过 SOCKS 协议进行传输。 您可以通过此隧道传输任何数据包 - TCP、UDP。 可以通过代理 SSH 服务器连接到 Internet 上的任何服务器。 要通过 SOCKS 代理重定向所有系统流量,您可以使用 proxifier 之类的程序。