「OpenSSH」- 端口转发

  CREATED BY JENKINSBOT

问题描述

本地转发,将本地连接转发到远程服务器;远程转发,将本地服务映射到远程主机的端口上;动态转发,类似于 SOCKS 代理功能。

该笔记将记录:与 SSH 端口转发有关的内容。

动态转发(SSH -D)

功能介绍

该功能实际上使用SOCKS协议,因此经常被用来科学上网。使用动态转发,只要是远程主机可以访问的站点,客户端也可以访问(所以说是科学上网嘛)。

如何配置

执行如下命令即可,然后配置应用程序,使用SOCKS协议即可。

ssh -D 8888 user@remoteserver

使用场景

1)网络加速。当时由SSH提供的SOCKS协议具有某些特征,容易被长城牌子的防火墙识别,因此作用也不是很大。

本地转发(SSH -L)

功能介绍

该功能在本地监听一个端口,该端口的连接被转发到远程主机的特定端口。相当于把远程端口映射到本地,即“将远程端口放在本地”。

如何配置

如下命令,监听本地的 9999 端口,任何访问 9999 的客户端,都相当于访问远程主机 xample.com 的80端口,但是流量是通过 remoteserver 的,并且所有流量都被加密:

ssh -L 0.0.0.0:9999:example.com:80 user@remote.server

# 上述命令涉及到三台主机:
# 本地主机:0.0.0.0
# 目标主机:example.com,这是我们要访问的主机
# 代理主机:remote.server,也是我们的跳板机

还有一种变体:目标主机与代理主机可以是同一台主机,即将remote.server服务映射到本地:

ssh -L 0.0.0.0:9999:127.0.0.1:6379 user@remote.server

出于安全考虑,在远程主机中的某个服务只监听了6379端口,但是另一台主机想访问该服务。此时,我们便可以将服务通过SSH映射到该主机上。

使用场景

1)流量加密。比如,你在远程主机上搭建HTTP代理,但是,如果你直接使用它,容易被发现(比如被防火墙屏蔽),这时可以加一层SSH转发,将远程的HTTP端口映射到本地。现在(09/21/2019)SOCKS协议已经可以被检测到,所以不要直接访问SOCKS主机,可以将流量通过SSH进行代理。

2)服务安全。比如,上面的“变体”,明白人已经看出来6379是REDIS服务了,由于REDIS的安全性较弱,可以通过该方法提高安全性(这只是一个主意,还有很多细节需要测试,比如性能、可用性、稳定性等等)。

远程转发(SSH -R)

功能介绍

与“本地转发”正好相反,该功能在远程监听一个端口,该端口的连接被转发到本地主机的特定端口。相当于把本地端口映射到远程,即“将本地端口放在远程”。

如何配置

访问远程 1999 端口,将转发到本地 9022 端口

ssh -v -R 0.0.0.0:1999:127.0.0.1:9022 user@remote.server

但是默认仅能监听远程主机的 127.0.0.1 端口,需要修改 sshd_config 的 GatewayPorts yes 才能监听远程主机的 0.0.0.0 端口。或者:

ssh -o GatewayPorts=true -R 0.0.0.0:1999:127.0.0.1:9022 user@remote.server

使用场景

1)内网服务映射。将在内网中的服务,通过远程主机暴露出来,提供给他人访问。

补充说明

通过 -N 选项,可使不执行任何命令。

参考文献

SSH Examples, Tips & Tunnels
SSH 端口转发
SSH port forwarding without session – Super User
portforwarding – How to make SSH remote port forward that listens 0.0.0.0 – Stack Overflow