如何设置SSH隧道(端口转发)

时间:2020-03-05 15:27:33  来源:igfitidea点击:

SSH隧道或者SSH端口转发是一种在客户端和服务器计算机之间创建加密SSH连接的方法,通过该连接可以中继服务端口。

SSH转发对于传输使用未加密协议(例如VNC或者FTP)的服务的网络数据,访问受地理限制的内容或者绕过中间防火墙非常有用。

基本上,我们可以转发任何TCP端口并通过安全的SSH连接建立隧道流量。

SSH端口转发有三种类型:

  • 本地端口转发。 -将连接从客户端主机转发到SSH服务器主机,然后再转发到目标主机端口。
  • 远程端口转发。 -将端口从服务器主机转发到客户端主机,然后转发到目标主机端口。
  • 动态端口转发。 -创建SOCKS代理服务器,该服务器允许跨多个端口进行通信。

在本文中,我们将讨论如何设置本地,远程和动态加密的SSH隧道。

本地端口转发

本地端口转发使我们可以将本地(ssh客户端)计算机上的端口转发到远程(ssh服务器)计算机上的端口,然后再转发到目标计算机上的端口。

在这种类型的转发中,SSH客户端侦听给定的端口,并将与该端口的任何连接通过隧道传输到远程SSH服务器上的指定端口,然后该远程服务器连接到目标计算机上的端口。
目标计算机可以是远程SSH服务器或者任何其他计算机。

本地端口转发通常用于连接到内部网络(例如数据库或者VNC服务器)上的远程服务。

在Linux,macOS和其他Unix系统中,以创建本地端口转发,将'-L'选项传递给'ssh'客户端:

ssh -L [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER

使用的选项如下:

  • '[LOCAL_IP:** LOCAL_PORT'-本地计算机的IP和端口号。如果省略“ LOCAL_IP”,则ssh客户端绑定在localhost上。
  • 'DESTINATION:DESTINATION_PORT'-目标计算机的IP或者主机名和端口。
  • '[USER @] SERVER_IP'-远程SSH用户和服务器IP地址。

我们可以使用任何大于“ 1024”的端口号作为“ LOCAL_PORT”。
小于“ 1024”的端口号是特权端口,并且只能由root用户使用。
如果SSH服务器正在侦听22以外的端口(默认端口),请使用'-p [PORT_NUMBER]'选项。

目标主机名必须可以从SSH服务器解析。

假设我们有一个运行在内部(专用)网络上的机器“ db001.host”上,端口3306上的MySQL数据库服务器,该端口可从机器“ pub001.host”访问,并且我们想使用本地机器“ mysql”进行连接客户端连接到数据库服务器。
为此,我们可以像这样转发连接:

ssh -L 3336:db001.host:3306 [email protected]

运行命令后,系统将提示我们输入远程SSH用户密码。
输入后,我们将登录到远程服务器并建立SSH隧道。
设置基于SSH密钥的身份验证并连接到服务器而不输入密码是一个好主意。

现在,如果将本地计算机数据库客户端指向“ 127.0.0.1:3336”,则连接将通过充当中间服务器的“ pub001.host”计算机转发到“ db001.host:3306”MySQL服务器。

我们可以在一个ssh命令中将多个端口转发到多个目标。
例如,我们在机器“ db002.host”上运行了另一个MySQL数据库服务器,并且想要从本地客户端连接到这两个服务器,我们将运行:

ssh -L 3336:db001.host:3306 3337:db002.host:3306 [email protected]

要连接到第二台服务器,我们将使用'127.0.0.1:3337'。

如果目标主机与SSH服务器相同,而不是指定目标主机IP或者主机名,则可以使用'localhost'。

假设我们需要通过运行在同一服务器上的VNC连接到远程计算机,并且无法从外部访问它。
我们将使用的命令是:

ssh -L 5901:127.0.0.1:5901 -N -f [email protected]

'-f'选项告诉'ssh'命令在后台运行,'-N'不执行远程命令。
我们使用的是“ localhost”,因为VNC和SSH服务器在同一主机上运行。

如果我们在设置隧道时遇到问题,请检查远程SSH服务器配置,并确保未将“ AllowTcpForwarding”设置为“ no”。
默认情况下,允许转发。

远程端口转发

远程端口转发与本地端口转发相反。
它允许我们将远程(ssh服务器)计算机上的端口转发到本地(ssh客户端)计算机上的端口,然后将其转发到目标计算机上的端口。

在这种类型的转发中,SSH服务器侦听给定的端口,并将与该端口的任何连接通过隧道传输到本地SSH客户端上的指定端口,然后该本地SSH客户端连接到目标计算机上的端口。
目标计算机可以是本地计算机,也可以是任何其他计算机。

在Linux,macOS和其他Unix系统中,要创建远程端口转发,请将'-R'选项传递给'ssh'客户端:

ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER

使用的选项如下:

  • '[REMOTE:** REMOTE_PORT'-远程SSH服务器上的IP和端口号。空的“ REMOTE”表示远程SSH服务器将在所有接口上绑定。
  • 'DESTINATION:DESTINATION_PORT'-目标计算机的IP或者主机名和端口。
  • '[USER @] SERVER_IP'-远程SSH用户和服务器IP地址。

远程端口转发通常用于使外部人员可以访问内部服务。

假设我们正在本地计算机上开发Web应用程序,并且想向开发人员显示预览。
我们没有公共IP,因此其他开发人员无法通过Internet访问该应用程序。

如果我们有权访问远程SSH服务器,则可以按照以下步骤设置远程端口转发:

ssh -R 8080:127.0.0.1:3000 -N -f [email protected]

上面的命令将使ssh服务器侦听端口'8080'并将所有流量从该端口传送到端口'3000'上的本地计算机。

现在,同级开发人员可以在浏览器中输入“ the_ssh_server_ip:8080”并预览应用程序。

如果我们在设置远程端口转发时遇到问题,请确保在远程SSH服务器配置中将“ GatewayPorts”设置为“是”。

动态端口转发

动态端口转发使我们可以在充当SOCKS代理服务器的本地(ssh客户端)计算机上创建套接字。
当客户端连接到该端口时,连接将转发到远程(ssh服务器)计算机,然后再转发到目标计算机上的动态端口。

这样,所有使用SOCKS代理的应用程序都将连接到SSH服务器,并且该服务器会将所有流量转发到其实际目的地。

在Linux,macOS和其他创建动态端口转发(SOCKS)的Unix系统中,将'-D'选项传递给'ssh'客户端:

ssh -D [LOCAL_IP:]LOCAL_PORT [USER@]SSH_SERVER

使用的选项如下:

  • '[LOCAL_IP:** LOCAL_PORT'-本地计算机的IP和端口号。如果省略“ LOCAL_IP”,则ssh客户端绑定在localhost上。
  • '[USER @] SERVER_IP'-远程SSH用户和服务器IP地址。

动态端口转发的典型示例是通过SSH服务器建立Web浏览器流量隧道。

以下命令将在端口“ 9090”上创建一个SOCKS隧道:

ssh -D 9090 -N -f [email protected]

建立隧道后,我们可以配置应用程序以使用它。
本文介绍了如何配置Firefox和Google Chrome浏览器以使用SOCKS代理。

必须为要通过其传输流量的每个应用程序分别配置端口转发。

在Windows中设置SSH隧道

Windows用户可以使用PuTTY SSH客户端创建SSH隧道。
我们可以在此处下载PuTTY。

  • 启动Putty,然后在“主机名(或者IP地址)”字段中输入SSH服务器IP地址。
  • 在“连接”菜单下,展开“ SSH”,然后选择“隧道”。选中“本地”单选按钮以设置本地,“远程”设置为远程,“动态”设置为动态端口转发。
  • 如果设置了本地转发,请在“源端口”字段中输入本地转发端口,并在“目的地”中输入目标主机和IP,例如“ localhost:5901”。
  • 对于远程端口转发,请在“源端口”字段中输入远程SSH服务器转发端口,并在“目标”中输入目标主机和IP,例如“ localhost:3000”。
  • 如果设置动态转发,请在“源端口”字段中仅输入本地SOCKS端口。
  • 单击“添加”按钮,如下图所示。
  • 返回“会话”页面以保存设置,这样我们无需每次都输入它们。在“已保存的会话”字段中输入会话名称,然后单击“保存”按钮。
  • 选择已保存的会话,然后单击“打开”按钮登录到远程服务器。

将出现一个新窗口,要求我们输入用户名和密码。输入用户名和密码后,我们将登录到服务器并启动SSH隧道。设置公钥身份验证将使我们无需输入密码即可连接到服务器。