[笔记]SSH 端口转发

ssh 拥有很强大的能力,因为在服务器运维中一直在使用 ssh ,因此探讨 ssh 的功能能够在日常开发过程中受益颇多,这里描述下 ssh 的三种端口转发功能。灵活使用可以大大简化我们的开发过程。
在这里插入图片描述

准备

下面的端口转发都是基于 ssh 命令实现的,是 ssh 命令在登录到远程主机后所携带的附加功能,因此所有命令都是基于 ssh 登录远程主机为基础,然后再上面增加端口转发选项:

ssh root@remote01

SSH 常用选项

选项描述
-v打开调试模式冗详模式。打印关于运行情况的调试信息。在调试连接、认证和配置问题时非常有用。多个 -v 选项能够增加冗详程度,最多三个,如 -vvv
-T禁止分配伪终端
-N不执行远程命令,用于转发端口。仅限协议第二版
-n把 stdin 重定向到 /dev/null,防止从 stdin 读取数据。在后台运行时一定会用到这个选项
-L本地端口转发(Local Port Forward),L 表示 Local
-R远端端口转发(Remote Port Forward),R 表示 Remote
-C压缩所有数据。压缩算法与 gzip(1) 使用的相同
-fssh 在执行命令前退至后台

SSH 本地转发-L [bind_address:]port:host:hostport

本地端口转发(Local Port Forwarding),是将本地主机某个端口流量转发到远程主机的指定端口。具体命令格式如下:

ssh -L [bind_address:]port:host:hostport username@host
# ssh -L [绑定的地址:]绑定的端口:映射的远程地址:映射的远程端口 登录用户名@等于主机地址
# bind_address 绑定的地址,是本地主机上的地址,不填默认为 127.0.0.1
# port 绑定的端口,ssh 会在本地创建并监听该端口,因此该端口不能是已经被占用的端口
# host 映射的地址,可以是登录的远程主机的地址,也可以远程主机能够访问到的任何地址
# port 映射的端口,用映射的地址
# 示例
# 在本地主机创建并监听8080端口并将请求到该端口的流量转发到远程的80端口上
ssh -L 8080:localhost:80 username@host

# 在本地主机创建并监听8080端口并将请求到该端口的流量转发到远程的80端口上
# 这里监听的 8080 端口是绑定到本地主机的所有网络接口上的,因此内网其他用户也能够访问到
ssh -L 0.0.0.0:8080:localhost:80 username@host
ssh -L *:8080:localhost:80 # 效果同上,通配符 * 监听到本地主机的所有网络接口

# 在本地主机创建并监听8080端口并将请求到该端口的流量转发到baidu.com的80端口上
# 这个流量转发是由登录的远程主机完成的,需要远程主机能够请求到 baidu.com 的80
ssh -L 8080:baidu.com:80 username@host

在执行该命令后,会在本机创建一个端口,当有请求到该端口时,SSH 会将该请求通过远程主机转发到指定的IP和端口上去。

示例1:

# 本地主机1上执行命令
ssh -L 81:192.168.2.11:80 root@11.259.31.33

上面的命令会在本地主机1上新建一个81端口,然后将请求到该端口的流量经由远程主机1转发到远程主机2的80端口上。在正常情况下远程主机2的80端口是无法直接被本地网络访问到,但是通过上面的命令实现了通过访问本地端口经由远程主机1代理实现对远程主机2的访问。

示例2:
在这里插入图片描述

# 本地主机1上执行命令
ssh -L 3307:192.168.2.10:3306 root@11.259.31.33

我在远程主机1上创建了一个数据库。通过上面的命令会在本地创建一个3307端口,然后将请求到该端口的流量经由远程主机1转发到远程主机1的3306端口上。这样我就能够通过本地端口3307访问到远程主机1的数据库端口了。

# 本地主机1执行命令
mysql -h localhost -p 3307 -u root -proot
# 请求本地的 3307 端口,实际通过ssh会被转发到远程主机1上创建的数据库

SSH 远程转发-R [bind_address:]port:host:hostport

与本地端口转发相反,远程转发会在登录的远程主机上创建一个端口,并将请求到该端口上的流量转发到映射的本地端口上。具体命令格式如下:

ssh -R [bind_address:]port:host:hostport username@host
# ssh -R [绑定的地址:]绑定的端口:映射的地址:映射的端口 登录的用户名@登录的远程主机地址
# [绑定的地址:] 登录的远程主机的地址,不填默认为 127.0.0.1
# port 绑定的端口,ssh 会在登录的远程主机上创建并监听该端口,因此该端口不能是已经被占用的端口
# host 映射的地址,可以是本地主机的地址,也可本地主机能够访问到的任何地址
# port 映射的端口,同映射地址
# 示例:
# 在远程主机创建并监听8080端口并将请求到该端口的流量转发到本地的80端口上
ssh -R 8080:localhost:80 username@host

# 在远程主机创建并监听8080端口并将请求到该端口的流量转发到本地的80端口上
# 这里监听的 8080 端口是绑定到远程主机的所有网络接口上的,因此远程主机所在的内网都能访问到
ssh -R 0.0.0.0:8080:localhost:80 username@host
ssh -R *:8080:localhost:80 username@host # 效果同上,通配符 * 表示监听在远程主机的所有地址上

# 在远程主机上创建8080端口并将请求到该端口的流量转发的baidu.com的80端口上
# 这个流量转发是由本地主机完成的,需要本地主机能够请求到 baidu.com 的 80
ssh -R 8080:baidu.com:80 username@host

# 在远程主机上创建一个任意端口并实现端口转发
ssh -R 0:localhost:80 username@host

示例1

在这里插入图片描述

# 在本地主机1执行命令
ssh -R 81:192.168.1.11:80 root@11.259.31.33

上面的命令会在远程主机1上新建一个81端口,然后将请求到该端口的流量经由·本地主机1·转发到·本地主机2·的80端口上。在正常情况下本地主机2的80端口是无法被远程网络访问到,但是通过上面的命令实现了通过访问远程主机的端口经由本地主机1代理实现对本地主机2的访问。

示例2

在这里插入图片描述

# 在本地主机1执行命令
ssh -R 3307:192.168.1.10:3306 root@11.259.31.33

我在本地主机1上启动了一个数据库服务器,使用了 3306 端口。通过在本地主机1上执行上面的 ssh 的命令可以为我们在远程主机1上创建一个3307端口,并且将请求到该接口上的流量通过 ssh 连接转发到本地主机的 3306 端口上,实现了本地服务的透出。

SSH 动态转发 -D [bind_address:]port

指定一个本地主机动态的应用程序级的转发端口。工作原理是这样的,本地机器上分配了一个 socket 侦听 port 端口,一旦这个端口上有了连接,该连接就经过安全通道转发出去,根据应用程序的协议可以判断出远程主机将和哪里连接。目前支持 SOCKS4 和 SOCKS5 协议,而 ssh 将充当 SOCKS 服务器. 只有 root 才能转发特权端口。可以在配置文件中指定动态端口的转发

在这里插入图片描述

# 在本地主机1上执行命令
# 在本地创建并监听 3128 端口,并且作为 socket 代理将请求转发到 远程主机1上
ssh -D 3128 root@11.259.31.33
# 验证方式,调用 curl 命令发起请求并通过代理选项设置代理,任何请求都会通过代理发起
curl -x socks5://localhost:3128 https://www.baidu.com

参考资料

Linux 命令之ssh 命令
ssh端口转发的三种方式
Linux curl命令使用代理、以及代理种类介绍1
Linux curl命令使用代理、以及代理种类介绍2
Linux curl命令详解
搭建一个SOCKS代理服务器
Socks5代理服务器搭建
Linux搭建Socks5代理服务器
彻底搞懂SSH端口转发命令
SSH 端口转发
ssh-port-forwarding

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值