• [笔记]SSH 端口转发


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

    准备

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

    ssh root@remote01
    
    • 1

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

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

    示例1:

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

    上面的命令会在本地主机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
    • 2

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

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

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    示例1

    在这里插入图片描述

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

    上面的命令会在远程主机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
    • 2

    我在本地主机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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    参考资料

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

  • 相关阅读:
    如何选择百科营销机构?如何挑选百科代建公司?
    docker本地容器化部署项目
    JAVA财务管理系统的设计与实现计算机毕业设计Mybatis+系统+数据库+调试部署
    Aoac唤醒的软件方案
    R语言ggplot2可视化:使用ggpubr包的ggpie函数可视化饼图(pie chart)、为饼图添加自定义标签(包含文本内容以及数值百分比)
    java-php-python-ssm绿色农产品推广应用网站计算机毕业设计
    科研-聚苯乙烯-b-聚丙烯酸胶束血红蛋白组装/牛血清白蛋白聚苯乙烯纳米微球PS/BSA
    Vue3 企业级优雅实战 - 组件库框架 - 1 搭建 pnpm monorepo
    使用 Set-Cookies HttpOnly & Secure标志保护 Tomcat
    openXBOW的使用(1)
  • 原文地址:https://blog.csdn.net/qq_19922839/article/details/126781848