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

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

SSH转发对于传输使用未加密协议的服务(例如VNC或FTP),访问受地理限制的内容或绕过中间防火墙的网络数据很有用。 基本上,您可以转发任何TCP端口并通过安全的SSH连接建立流量隧道。

SSH端口转发有三种类型:

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

本文介绍了如何设置本地,远程和动态加密的SSH隧道。

本地端口转发

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

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

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

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

ssh -L [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT [[email protected]]SSH_SERVER

使用的选项如下:

  • [LOCAL_IP:]LOCAL_PORT -本地计算机的IP地址和端口号。 什么时候 LOCAL_IP 如果省略,则ssh客户端绑定在本地主机上。
  • DESTINATION:DESTINATION_PORT -目标计算机的IP或主机名以及端口。
  • [[email protected]]SERVER_IP -远程SSH用户和服务器IP地址。

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

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

假设您有一个在计算机上运行的MySQL数据库服务器 db001.host 在内部(专用)网络上的端口3306上,可以从计算机访问该端口 pub001.host,并且您想使用本地计算机MySQL客户端连接到数据库服务器。 为此,可以使用以下命令转发连接:

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

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

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

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

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]remote.host

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

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

远程端口转发

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

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

在Linux,macOS和其他Unix系统上创建远程端口转发,将 -R 选项 ssh 客户:

ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT [[email protected]]SSH_SERVER

使用的选项如下:

  • [REMOTE:]REMOTE_PORT -远程SSH服务器上的IP和端口号。 一个空的 REMOTE 表示远程SSH服务器将在所有接口上绑定。
  • DESTINATION:DESTINATION_PORT -目标计算机的IP或主机名以及端口。
  • [[email protected]]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 在他/她的浏览器中,预览您的应用程序。

如果您在设置远程端口转发时遇到问题,请确保 GatewayPorts 被设定为 yes 在远程SSH服务器配置中。

动态端口转发

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

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

在Linux,macOS和其他Unix系统上,通过创建动态端口转发(SOCKS) -D 选项 ssh 客户:

ssh -D [LOCAL_IP:]LOCAL_PORT [[email protected]]SSH_SERVER

使用的选项如下:

  • [LOCAL_IP:]LOCAL_PORT -本地计算机的IP地址和端口号。 什么时候 LOCAL_IP 如果省略,则ssh客户端绑定在localhost上。
  • [[email protected]]SERVER_IP -远程SSH用户和服务器IP地址。

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

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

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

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

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

在Windows中设置SSH隧道#

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

  1. 启动Putty,然后在 Host name (or IP address) 领域。

  2. 在下面 Connection 菜单,展开 SSH 然后选择 Tunnels。 检查 Local 单选按钮设置本地 Remote 对于远程,和 Dynamic 用于动态端口转发。

    • 设置本地转发时,请在 Source Port 现场和在 Destination 输入目标主机和IP,例如, localhost:5901
    • 对于远程端口转发,请在 Source Port 现场和在 Destination 输入目标主机和IP,例如, localhost:3000
    • 如果要设置动态转发,请仅在本地输入SOCKS端口。 Source Port 领域。

    配置隧道腻子

  3. 点击 Add 按钮,如下图所示。

    添加隧道腻子

  4. 回到 Session 页面以保存设置,因此您无需每次都输入它们。 在中输入会话名称 Saved Session 字段,然后单击 Save 按钮。

    保存会话腻子

  5. 选择已保存的会话,然后通过单击登录到远程服务器。 Open 按钮。

    公开会议腻子

    将出现一个新窗口,要求您输入用户名和密码。 输入用户名和密码后,您将登录到服务器,并且SSH隧道将启动。

    设置公共密钥身份验证使您无需输入密码即可连接到服务器。

结论#

我们已经向您展示了如何设置SSH隧道以及如何通过安全的SSH连接转发流量。 为了易于使用,您可以在SSH配置文件中定义SSH隧道,或创建将建立SSH隧道的Bash别名。

如果您遇到问题或有反馈,请在下面发表评论。

SSH安全

Sidebar