介绍
在本文中,您将了解如何在计算机和VPS之间创建安全的加密隧道,以及如何绕过公司网络中的限制,如何绕过NAT等。
本文将涵盖一些基本理论,如果你想直接进入下面的例子,你可以跳过。
在互联网,网络协议和通信端口的通信
计算机中安装的每个软件都希望通过Internet发送或接收数据,必须使用来自TCP / IP的应用程序层协议。 这些协议定义了通信的方式和通过因特网等在主机之间发送的消息的格式。例如:
- HTTP - 用于从Web浏览器下载网站和文件
- FTP - 用于在客户端和服务器之间发送文件
- DNS - 用于将主机名更改为IP地址,反之亦然
- POP3和(或)IMAP - 用于下载/浏览您的电子邮件
- SMTP - 用于发送电子邮件
- telnet - 用于远程连接到服务器
- SSH -类似于远程登录,但在安全 ,加密的版本,所以没有人可以看到我们发送到服务器,哪些服务器发送给我们。
接下来,给定协议的消息必须被打包到TCP分段或UDP数据报(在传输层中)。 这些协议用于通过因特网传输数据 - 它们在传输层中工作。 TCP协议是面向连接的,这意味着在发送数据之前,需要在远程机器之间创建连接。 TCP总是以正确的顺序提供数据。 如果任何段在网络中丢失,如果它没有及时收到确认,它将被再次发送。 TCP被认为相当可靠。
UDP协议不是面向连接的。 它不提供丢失的数据报的重传。 如果没有按正确的顺序接收数据包,UDP将按照它们被接收的顺序将它们提供给应用程序。 因此,UDP主要用于传输实时多媒体数据 - VoIP会谈,视频会议,音频和视频。 UDP有时由应用层中的其他协议使用 - 例如,在DNS的情况下。
在这种情况下,较高层的协议在给定时间量内未接收到答案之后必须重新发送查询。 UDP主要在这里使用,因为它具有低开销:在1个数据报中发送1个小查询并且接收答复需要更少的时间,并且需要比进行TCP连接(在主机之间交换3段)发送更少的数据:发送来自客户端,从服务器发送确认,从服务器发送应答,然后从客户端发送确认并断开连接(4个段)。
要标识与同一IP地址的不同连接,我们使用端口号。 给定应用层协议的每个服务器绑定到给定端口号并等待传入连接。 客户端连接到此端口(在TCP连接的情况下)或发送数据报到该端口(在UDP的情况下)。 对于最常用的,公知的协议,有保留端口号。 例如,HTTP服务器通常侦听端口80 TCP(或者,客户端必须通过在地址中指定端口号来连接到它 - http://example.org:1234/),DNS服务器通常侦听端口53 UDP(有时也是端口53 TCP)。 客户端也需要在其端使用端口。 它们是“高端口”,如52044,是随机生成的。
在这里 ,你可以看到,我们的日常使用更多的保留端口。
然后,段和数据报在网络层中被打包成IP分组。 在数据包中,源计算机和目标计算机由IP地址标识。 它们是全局的 - 只有一个主机可以一次使用相同的地址(不包括魔术,例如NAT在家用路由器中使用私有IP地址: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的程序必须使用私钥解决数学问题,并将解决方案发送服务器。 每次的问题是不同的,所以很难使用该认证方法打破密钥。
现在我们使用SSH的版本2。
最流行的SSH服务器实现是OpenSSH。 最流行的客户端是PuTTY(适用于Windows)和OpenSSH(适用于Linux)。 PuTTY和OpenSHH都允许用户创建隧道。
SSH允许用户在服务器和客户端之间创建TCP隧道,并通过该隧道发送数据。 SSH只支持TCP隧道,但你可以解决,即通过SOCKS代理。 像这样的隧道建立在服务器上选择的TCP端口和选择的本地端口之间。 它是未加密的,当然,所以任何人都可以检查我们使用它。
将使用的概念
Loopback接口 -安装在IP地址为127.0.0.1系统中的虚拟网卡。 只有安装在系统上的应用程序才能访问该地址。 不能远程访问。 您可以在该接口上启动VPS,并且只能从同一系统或通过隧道进行远程访问。
SMTP -应用层协议,让您发送电子邮件。 它用于邮件服务器之间的通信以及服务器和邮件客户端之间的通信。 SMTP对于加密连接(SSL)使用端口25 TCP用于未加密通信,端口587 TCP或465 TCP(不建议使用 - 不推荐)。
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
Windows和PuTTY:
在这里,你可以阅读如何创建连接到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
Windows和PuTTY:
- 选择连接并加载设置。
- 转到Connection-> SSH-> Tunnels
设置如下:
点击添加:
- 现在您可以保存会话并连接。
从理论上讲,在浏览器中去127.0.0.1:8080后,您会看到位于我们连接到远程服务器上的网站。
实事求是地讲,HTTP 1.1引入了主机参数查询。 此参数用于发送我们要连接的VPS的DNS域名。 如果它使用虚拟主机机制,您将获得的页面将是错误页面或服务器的主页,但不通过隧道。
在这种情况下,我们要做的一件事:在hosts文件在本地PC上,添加VPS地址和回环接口:
127.0.0.1 website
网站是要连接到的地址的网站( 没有 http://在开头和结尾的/)。
Hosts文件位于/ etc / hosts文件(Linux)或C:\ WINDOWS \ SYSTEM32 \ DRIVERS \ ETC \主机(Windows)中。 要编辑此文件,您必须是管理员或具有管理权限。
重要! 如果要在Unix系统上在小于1024的本地端口上创建隧道,则必须具有root权限。
示例3. SOCKS代理
SOCKS代理允许您通过隧道从任何协议发送流量。 它看起来,从外面,像一个单一的TCP连接。
在此示例中,我们将在环回接口上的端口5555上在SSH服务器和客户端之间创建隧道。 接下来,我们将设置浏览器使用SOCKS服务器作为每个传出连接的代理服务器。
此解决方案可能有助于绕过对公司网络的限制。 如果我们的SSH使用的端口被锁定,我们可以告诉服务器侦听端口443上使用OpenSSH的配置文件中的收听选项(在/ etc / SSH / sshd_config文件或/ etc / openssh的/ sshd_config中)。
Unix和OpenSSH:
ssh abc@def -D 5555 abc - username def - server address 5555 - local port number, where the tunnel will be created
Windows和PuTTY:
- 选择连接并加载设置。
- 转到Connection-> SSH-> Tunnels
设置如下:
点击添加:
- 保存会话并连接到它。
在浏览器设置中,设置在127.0.0.1:5555上运行的SOCKS代理,从现在开始,直到您关闭PuTTY或OpenSSH中的连接。
示例4.绕过NAT
NAT(具体地,PAT,其是用于家庭路由器中的NAT形式)是允许许多人使用一个互联网连接的机制。 使用NAT的路由器具有一个公共地址,并将从内部网络接收到的数据包中的所有私有地址修改为其自己的公共地址,并将它们发送到Internet。 当接收到数据包,它做相反 - 它记住在一个特殊NAT表的IP地址和端口号。
只有当我们在路由器上设置适当的端口转发时,才可能从外部进行连接。 然而,我们可以绕过这个问题,并在我们的计算机和服务器之间创建一个隧道,直接连接我们的计算机和服务器。
第1部分。
在第二部分中,我们将在本地端口80(在我们的计算机上 - 本地HTTP服务器)和远程服务器上的端口8080之间创建一个隧道。 然而,由于安全原因,远程端口8080将只在VPS的loopback接口打开- 127.0.0.1。 因此,我们必须重新配置我们的服务器以打开每个端口上的连接。 我们现在就这样做。
- 在您喜欢的编辑器中,以root身份打开/ etc / ssh / sshd_config(或/ etc / openssh / sshd_config)文件。
nano /etc/ssh/sshd_config
- 找:
#GatewayPorts no
- 将该行更改为:
GatewayPorts yes
- 保存文件并关闭编辑器。
- 重新启动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与同一网络中的其他计算机建立隧道连接。
Windows和PuTTY:
- 选择连接并加载设置。
- 转到Connection-> SSH-> Tunnels
设置如下:
点击添加:
- 保存会话并连接。
登录后,我们可以通过具有公共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的程序。