SSH 端口转发

SSH 端口转发

本文用于记录一下 SSH 端口转发功能的学习笔记,以做备忘,主要参考文章如下:

  1. 彻底搞懂SSH远程转发命令
  2. SSH端口转发
  3. An Illustrated Guide to SSH Tunnels

SSH 不仅可以远程登录,还有一个非常实用的功能:端口转发。

SSH 端口转发又叫 SSH 隧道(tunnel),是在 SSH 连接的基础上,通过将客户端或服务器端的某个端口的数据放到 SSH 连接中加密传输,从而在不安全的网络中安全的传输数据或者绕过防火墙的限制实现对目的主机目的端口的访问的一个功能。

端口转发有两个主要作用:

(1)将不加密的数据放在 SSH 安全连接里面传输,在不安全的网络或不受信任的网络提供安全连接,比如通过端口转发访问 Telnet、FTP 等明文服务,数据传输就都会加密,或者在不安全的公用网络中,利用信任的 SSH 服务器访问网络或邮件服务器。

(2)绕过防火墙的限制实现对目的主机的访问。

端口转发有三种使用方法:本地端口转发,远程端口转发,动态端口转发。

本地端口转发(本地隧道)

本地端口转发 是指在 SSH 连接的基础上,将远程的 SSH 服务器作为中介,建立一个本地客户端主机到目的主机(第三台主机)的连接,将对于本地客户端主机指定端口的访问通过 SSH 连接转发给 SSH 服务器,再由 SSH 服务器发到目标主机的目标端口,同时将结果传回。由于被转发的端口位于本地客户端,所以就叫做本地端口转发。本地被转发的端口类似于隧道的的入口,目标主机的目标端口类似于隧道的出口。

创建本地端口转发的命令格式如下:

ssh -L 本地端口:目标主机:目标端口 uesr@host [-N]
  1. 这个命令在本地客户端主机执行,它在建立端口转发的同时也建立了基本的 SSH 连接;
  2. -L 选项表示建立本地端口转发,在之后本地端口、目标主机、目标端口之间用 :(冒号)隔开;
  3. user@host 是登录 SSH 服务器的用户名与地址;
  4. -N 选项(可选)表示这个 SSH 连接只进行端口转发,不登录远程 Shell,不能执行远程命令,只能充当隧道;
  5. 目标主机不一定必须是第三台主机,也可以是 SSH 服务器本身,此时目标主机就是 localhost;如果目标主机是第三台主机,那么端口转发只能保证本地主机至 SSH 服务器之间的连接是安全的,并不能保证 SSH 服务器至目标主机间的连接是安全的,这取决于 SSH 服务器与目标主机的连接方式。

应用场景1

(1)台式机 B 上运行着虚拟机 C,虚拟机使用虚拟机软件搭建的虚拟网络与宿主主机 B 相连接,但在主机 B 以外无法直接访问该虚拟网络。想要通过 SSH,用与台式机 B 处于同一 WiFi 下的笔记本 A 来远程控制虚拟机 C,(在A上)执行端口转发命令:

ssh -L 22022:虚拟机 C 地址:22 desktop_user@台式机 B 地址

这个命令中,22022 是一个主机 A 上未被占用的端口,desktop_user是登录到台式机 B 的用户名,注意此时台式机 B 需要开启 ssh 服务器端服务。
在虚拟机 C 上也开启 ssh 服务器端服务后,在主机 A 上执行:

ssh -P 22022 vitual_user@localhost

这个命令以 SSH 协议访问本机的 22022 端口,这个请求会通过主机 A 和台式机 B 之间的 SSH 连接到达台式机 B,台式机 B 将这个请求转变为对虚拟机 C 的 22 端口的访问请求,并为 主机 A 返回结果,这样就可以在主机 A 上以 SSH 协议登录虚拟机 C。
在这个命令中,-P 选项指定访问特定端口,而不是默认的 22 端口,vitual_user 是登录到虚拟机的用户名,因为主机 A 是访问自己的端口,所以地址是 localhost,也可以利用其它主机访问主机 A 的 22022 端口达到访问虚拟机 C 的目的,此时 localhost 就改为 主机 A 的 ip 地址或域名。

(2)加密访问邮件服务器

想要通过 SSH 连接安全的访问邮件服务器,在本地主机执行以下命令:

ssh -L 1100:mail.example.com:110 mail.example.com

这个命令中,1100 是本机未被占用的端口,mail.example.com 是邮件服务器,这个命令将对本机的 1100 端口的访问转发到邮件服务器 mail.example.com 的 110 端口(邮件获取协议 POP3 协议的默认端口)。端口转发建立以后,POP3 邮件客户端只需要访问本机的 1100 端口,请求就会自动转发到 mail.example.com 的 110 端口。

在这种情况下,邮件服务器 mail.example.com 本身作为中介,必须运行 SSH 服务器,否则,就必须通过另一台 SSH 服务器作为中介,命令如下:

ssh -L 1100:mail.example.com:110 other.example.com

这个命令中,本机的 1100 端口还是绑定 mail.example.com 的 110 端口,但是由于 mail.example.com 没有运行 SSH 服务器,所以必须通过 other.example.com 中介。本机的 POP3 请求通过 1100 端口,先发给 other.example.com 的 22 端口(sshd 默认端口),再由后者转给 mail.example.com,得到数据以后再原路返回。

注意,采用上面的中介方式,只有本机到 other.example.com 的这一段是加密的,other.example.com 到 mail.example.com 的这一段并不加密。

远程端口转发(远程隧道)

远程端口转发 是指在建立 SSH 连接的基础上,将本地客户端主机作为中介,建立一个 SSH 服务器到目的主机(第三台主机)的连接,将对于 SSH 服务器指定端口的访问通过 SSH 连接转发给客户端,再由客户端主机发到目标主机的目标端口,同时将结果传回。由于被转发的端口位于远程 SSH 服务器,所以就叫做远程端口转发。远程 SSH 服务器上被转发的端口类似于隧道的的入口,目标主机的目标端口类似于隧道的出口。

创建远程端口转发的命令格式如下:

ssh -R 远程端口:目标主机:目标端口 uesr@host [-N]
  1. 这个命令同样在客户端主机执行;
  2. -R 选项表示建立远程端口转发,在之后远程端口、目标主机、目标端口之间用 :(冒号)隔开,远程端口是一个在远程 SSH 服务器上的端口;
  3. user@host 是登录 SSH 服务器的用户名与地址;
  4. -N 选项(可选)表示这个 SSH 连接只进行端口转发,不登录远程 Shell,不能执行远程命令,只能充当隧道;
  5. 目标主机不一定必须是第三台主机,也可以是本地客户端主机本身,此时目标主机就是 localhost;如果目标主机是第三台主机,那么端口转发只能保证 SSH 服务器至本地主机之间的连接是安全的,并不能保证本地客户端主机至目标主机间的连接是安全的,这取决于本地客户端主机与目标主机的连接方式。
  6. 注意:OpenSSH 服务器对于远程端口转发的设定,默认只接受远程服务器主机本机上的应用发起的请求,想要从其他连接到服务器的设备发起请求,需将 /etc/ssh/sshd_config 配置文件中 GatewayPorts 选项后的 no 修改为 yes。

应用场景2

(1)台式机 B 上运行着虚拟机 C,虚拟机使用虚拟机软件搭建的虚拟网络与宿主主机 B 相连接,但在主机 B 以外无法直接访问该虚拟网络。想要通过 SSH,用与台式机 B 处于同一 WiFi 下的笔记本 A 来远程控制虚拟机 C,在 B 上执行端口转发命令:

ssh -R 22122:虚拟机 C 地址:22 desktop_user@笔记本 A 地址

这个命令中,22122 是一个笔记本 A 上未被占用的端口,desktop_user是登录到笔记本 A 的用户名,注意此时笔记本 A 是远程 ssh 服务器,此时与本地端口转发的例子是不同的,在本地端口转发的例子中,台式机 B 是远程 ssh 服务器。
在虚拟机 C 上也开启 ssh 服务器端服务后,在笔记本 A 上执行:

ssh -P 22122 vitual_user@localhost

-P 选项指定访问特定端口,vitual_user 是登录到虚拟机的用户名,因为主机 A 是访问自己的端口,所以地址是 localhost。
这样,笔记本 A 对本机 22122 端口的 SSH 访问请求经过台式机 B 和笔记本 A之间的 SSH 连接转发到台式机 B,再由台式机 B 发送给虚拟机 C,这样就建立了笔记本 A 和虚拟机 C 之间的 SSH 连接。

(2)内网计算机 A 运行着 http 服务,但 A 没有公网 IP,其他设备不能使用该服务。恰好云服务器 B 有公网 IP(甚至域名),便于被访问。在不将 http 服务迁移至云服务器 B 的前提下,可以使用 SSH 端口转发使其他设备通过访问 B 的方式访问 A 上的 http 服务。在 A 上执行端口转发命令:

ssh -R 80:localhost:80 cloud_user@server.example.com

这时目标主机是 A 本身(localhost),80 号端口是 http 默认端口,cloud_user 是 B 上的用户名;server.example.com 是 B 的域名。

于是其它人就可以通过访问 http://server.example.com 来访问内网计算机 A 提供的 http 服务了。

动态端口转发

动态端口转发 是指在本机与 SSH 服务器之间建立一个 SSH 连接,然后本机内部针对某个端口的通信,都通过这个加密连接转发,但这种转发不规定目标主机和目标端口,而是去读取应用发起的请求,从请求中获取目标信息。在这种情况下,SSH 服务器要去访问哪一个网站,完全是动态的,取决于原始通信,所以就叫做动态端口转发。

相对的,本地端口转发和远程端口转发在建立时要指定目标主机目标端口,可以统称为固定端口转发

创建动态端口转发的命令格式如下:

ssh -D 本地端口 user@host [-N]

这个命令中,-D 表示动态端口转发,user@host 表示登录到 SSH 服务器的用户名和地址,-N 表示这个 SSH 连接只进行端口转发,不能执行远程命令。

需要注意动态端口转发只绑定本地端口,并没有指定目标主机目标端口,而是在通信到达 SSH 服务器时使用 SOCKS4 或 SOCKS5 协议动态确定。所以,如果要使用动态端口转发访问网络,需要在系统或应用(浏览器等)中设置一个使用SOCKS5 协议、服务器为 localhost、端口为绑定的端口的代理,利用代理使请求走绑定的端口。

举例来说,如果本地端口是2121,那么动态转发的命令就是下面这样。

ssh -D 2121 user@host -N

下面是动态端口转发建立后的一个使用实例:

curl -x socks5://localhost:2121 http://www.example.com

上面命令中,curl 的 -x 参数指定代理服务器,即通过 SOCKS5 协议的本地 2121 端口,访问 http://www.example.com

多级端口转发

端口转发可以有多级,以达到绕过多个防火墙的效果。比如建立两个端口转发,第一个端口转发的出口作为第二个端口转发的入口,通过第二个端口转发访问目标主机目标端口。

例如,本地主机 A 想访问 目的主机 D,但因为防火墙的限制,无法直接连接,现在知道主机 A 可以连接到服务器 B,而服务器 B 可以连接到服务器 C ,服务器 C 可以直接访问目标主机 D,在这种情况下,就可以建立两级连接。

先在主机 A 建立到服务器 B 的本地端口转发:

ssh -L 本地端口:localhost:2999 user_b@服务器 B ip 地址

这个命令在本地主机 A 和 服务器 B 之间建立一个端口转发,2999 是服务器 B 上一个空闲的端口,localhost 表示服务器 B 接收到主机 A 的请求后转发到自己的 2999 端口。这个命令没有加 -N 参数,因为还需要登录服务器 B 建立第二个端口转发。
在登录服务器 B 之后,建立服务器 B 经过服务器 C 到目标主机 D 的端口转发:

ssh -L 2999:目标主机 D:目标端口 user_c@服务器 C ip 地址 -N

这个命令将对 2999 端口的访问请求经由服务器 C 转发到目标主机 D。
这样,最终就通过两级端口转发实现访问主机 A 的端口相当于访问目标主机 D 的目标端口的效果。

  • 7
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值