SSH客户端连接到 安全外壳服务器,使您可以像坐在另一台计算机前一样运行终端命令。但是SSH客户端也允许您“tunnel”本地系统和远程SSH服务器之间的端口。

SSH隧道有三种不同类型,它们’全部用于不同目的。每一种都涉及使用SSH服务器将流量从一个网络端口重定向到另一个网络端口。流量通过加密的SSH连接发送,因此可以’在运输过程中不受监视或修改。

You can do this with the ssh command included on Linux, macOS, 和 other 类UNIX 操作系统。在Windows上,’如果包含内置的ssh命令,我们建议使用免费工具 油灰 to connect to SSH servers. It supports SSH 隧道ing, too.

本地 港口 Forwarding: Make 远程 Resources Accessible on Your 本地 System

“本地端口转发”允许您访问本地网络资源’暴露在互联网上。例如,让’s说您想在家中访问办公室中的数据库服务器。出于安全原因,该数据库服务器仅配置为接受来自本地办公室网络的连接。但是,如果您可以访问办公室的SSH服务器,并且该SSH服务器允许来自办公室网络外部的连接,那么您可以在家中连接到该SSH服务器并像访问办公室一样访问数据库服务器。通常是这样’保护单个SSH服务器免受攻击要比保护各种不同的网络资源更容易。

为此,您需要与SSH服务器建立SSH连接,并告诉客户端从本地PC的特定端口转发流量—例如,端口1234—到数据库的地址’的服务器及其在办公室网络上的端口。因此,当您尝试访问当前PC的端口1234上的数据库服务器时,“localhost”,该流量是自动的“tunneled”通过SSH连接并发送到数据库服务器。 SSH服务器位于中间,来回转发流量。您可以使用任何命令行或图形工具来访问数据库服务器,就像它在本地PC上运行一样。

To use local forwarding, connect to the SSH server normally, but also supply the -L argument. The syntax is:

ssh -L local_port:remote_address:remote_port username@server.com

例如,让’假设您办公室的数据库服务器位于办公室网络上的192.168.1.111。您可以使用办公室’s SSH server at ssh.youroffice.com , 和 your user account on the SSH server is 鲍勃 . In that case, your command would look like this:

ssh -L 8888:192.168.1.111:1234 鲍勃 @ssh.youroffice.com

运行该命令后,您将’d be able to access the database server at port 8888 at 本地主机. So, if the database server offered web access, you could plug http://localhost:8888 into your web browser to access it. If you had a command line tool that needs the network address of a database, you’d point it at 本地主机:8888. All traffic sent to port 8888 on your PC will be 挖洞的 to 192.168.1.111:1234 on your office network.

It’如果您想连接到在与SSH服务器本身相同的系统上运行的服务器应用程序,则会更加困惑。例如,让’例如,您在办公室计算机的端口22上运行了SSH服务器,但是在同一地址的同一系统上的数据库端口1234上也运行了数据库服务器。您想从家里访问数据库服务器,但是系统仅在端口22上接受SSH连接,而防火墙不’不允许任何其他外部连接。

在这种情况下,您可以运行以下命令:

ssh -L 8888:localhost:1234 鲍勃 @ssh.youroffice.com

当您尝试访问当前PC上端口8888上的数据库服务器时,流量将通过SSH连接发送。当它到达运行SSH服务器的系统时,SSH服务器会将其发送到以下端口:“localhost”,这是与运行SSH服务器本身相同的PC。所以“localhost”在上面的命令中意味着“localhost”从远程服务器的角度来看。

要在Windows的PuTTY应用程序中执行此操作,请选择“连接”> SSH >隧道。选择“Local” option. For “Source 港口”,输入本地端口。对于“Destination”,以remote_address:remote_port的形式输入目标地址和端口。

例如,如果您要设置与上述相同的SSH隧道,则可以’d enter 8888 as the source port 和 本地主机:1234 as the destination. Click “Add”之后,然后单击“Open”打开SSH连接。您还需要在主服务器上输入SSH服务器本身的地址和端口“Session”屏幕,然后再连接。

远程 港口 Forwarding: Make 本地 Resources Accessible on a 远程 System

“远程端口转发”与本地转发相反,并且不是’经常使用。它允许您在SSH服务器上的本地PC上提供资源。例如,让’s say you’在您本地计算机上运行Web服务器’重新坐在前面。但是您的PC位于防火墙后面’•允许传入流量到服务器软件。

假设您可以访问远程SSH服务器,则可以连接到该SSH服务器并使用远程端口转发。您的SSH客户端将告诉服务器转发特定端口—say, port 1234—SSH服务器上的特定地址和当前PC或本地网络上的端口。当有人访问SSH服务器上的端口1234时,该流量将自动被“tunneled”通过SSH连接。有权访问SSH服务器的任何人都可以访问您PC上运行的Web服务器。这实际上是穿越防火墙的一种方式。

To use remote forwarding, use the ssh command with the -R argument. The syntax is largely the same as with local forwarding:

ssh -R remote_port:local_address:local_port username@server.com

让’s表示您想使服务器应用程序在本地PC上的1234端口上侦听,而该应用程序在远程SSH服务器上的8888端口上可用。 SSH服务器’s address is ssh.youroffice.com 和 your username on the SSH server is 鲍勃 。您’d运行以下命令:

ssh -R 8888:localhost:1234 鲍勃 @ssh.youroffice.com

Someone could then connect to the SSH server at port 8888 和 that connection would be 挖洞的 to the server application running at port 1234 on the local PC you established the connection from.

要在Windows的PuTTY中执行此操作,请选择“连接”> SSH >隧道。选择“Remote” option. For “Source 港口”,输入远程端口。对于“Destination”,以local_address:local_port的形式输入目标地址和端口。

例如,如果您要设置上面的示例,则可以’d enter 8888 as the source port 和 本地主机:1234 as the destination. Click “Add”之后,然后单击“Open”打开SSH连接。您还需要在主服务器上输入SSH服务器本身的地址和端口“Session”屏幕,然后再连接。

People could then connect to port 8888 on the SSH server 和 their traffic would be 挖洞的 to port 1234 on your local system.

默认情况下,远程SSH服务器将仅侦听来自同一主机的连接。换句话说,只有与SSH服务器本身位于同一系统上的人才能连接。这是出于安全原因。您’我需要启用“GatewayPorts” option in sshd_config 如果要覆盖此行为,请在远程SSH服务器上运行。

动态 港口 Forwarding: Use Your SSH Server as a Proxy

有关: VPN和代理之间有什么区别?

那里’s also “动态端口转发”,其功能类似于代理或VPN。 SSH客户端将创建一个 袜子代理 您可以配置要使用的应用程序。通过代理发送的所有流量都将通过SSH服务器发送。这类似于本地转发—它将本地流量发送到PC上的特定端口,并通过SSH连接将其发送到远程位置。

有关: 为什么即使访问加密的网站,使用公共Wi-Fi网络也可能很危险

例如,让’s say you’重新使用公共Wi-Fi网络。你想要 安全浏览而不被窥探。如果您在家中可以访问SSH服务器,则可以连接到该服务器并使用动态端口转发。 SSH客户端将在您的PC上创建一个SOCKS代理。发送到该代理的所有流量都将通过SSH服务器连接发送。没有人监视公共Wi-Fi网络将能够监视您的浏览或审查您可以访问的网站。从您访问的任何网站的角度来看,就好像您坐在家里的PC前面一样。这也意味着您可以使用此技巧在美国境外访问仅限美国的网站—当然,假设您可以访问美国的SSH服务器。

作为另一个示例,您可能要访问家庭网络上拥有的媒体服务器应用程序。出于安全原因,您可能只将SSH服务器公开给Internet。你不’t allow incoming connections from the Internet to your media server application. You could set up 动态端口转发, configure a web browser to use the 袜子代理, 和 then access servers running on your home network through the web browser as if you were sitting in front of your SSH system at home. For example, if your media server is located at port 192.168.1.123 on your home network, you could plug the address 192.168.1.123 into any application using the 袜子代理 和 you’d就像访问家庭网络一样访问媒体服务器。

To use dynamic forwarding, run the ssh command with the -D argument, like so:

ssh -D local_port username@server.com

例如,让’s say you have access to an SSH server at ssh.yourhome.com 和 your username on the SSH server is 鲍勃 。您 want to use dynamic forwarding to open a 袜子代理 at port 8888 on the current PC. You’d运行以下命令:

ssh -D 8888 鲍勃 @ssh.yourhome.com

You could then configure a web browser or another application to use your local IP address (127.0.01) 和 port 8888. All traffic from that application would be redirected through the 隧道.

要在Windows的PuTTY中执行此操作,请选择“连接”> SSH >隧道。选择“Dynamic” option. For “Source 港口”,输入本地端口。

例如,如果要在端口8888上创建SOCKS代理,则可以’d enter 8888 as the source port. Click “Add”之后,然后单击“Open”打开SSH连接。您还需要在主服务器上输入SSH服务器本身的地址和端口“Session”屏幕,然后再连接。

然后,您可以配置一个应用程序以访问本地PC上的SOCKS代理(即IP地址127.0.0.1,它指向本地PC)并指定正确的端口。

有关: 如何在Firefox中配置代理服务器

例如,您可以 配置Firefox以使用SOCKS代理。这特别有用,因为Firefox可以具有自己的代理设置,并且没有’不必使用系统范围的代理设置。 Firefox将通过SSH隧道发送其流量,而其他应用程序将正常使用您的Internet连接。

在Firefox中执行此操作时,请选择“手动代理配置”, enter “127.0.0.1”在SOCKS主机框中,将动态端口输入到“Port”框。将“ HTTP代理”,“ SSL代理”和“ FTP代理”框保留为空。

只要您打开SSH会话连接,隧道就将保持活动状态并保持打开状态。当您结束SSH会话并与服务器断开连接时,隧道也将关闭。只需用相应的命令(或腻子适当的选项)重新开放隧道重新连接。

克里斯·霍夫曼 克里斯·霍夫曼
克里斯·霍夫曼(Chris Hoffman)是《 极客》首席编辑。他撰写了近十年的技术文章,并担任PCWorld专栏作家两年。克里斯曾为《纽约时报》撰稿,曾在迈阿密NBC 6等电视台接受过技术专家的采访,而他的工作也被BBC等新闻媒体报道。自2011年以来,克里斯撰写了2,000多篇文章,被阅读了超过5亿次-而这就是How-To Geek的内容。
阅读完整的传记»