ssh静态代理模式讲解与使用
--作者:飞翔的小胖猪
--创建时间:2021年5月18日
--修改时间:2021年5月23日
一、说明
SSH 为建立在应用层基础上的安全协议。SSH 是较可靠专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
SSH除了日常用来登录控制其他设备外,自身还提供代理功能,以解决主机无法直接访问目的主机的跳转问题。可以称呼为代理也可以称呼为隧道。
1.1 代理模式
- 正向代理(-L):相当于 iptable 的 port forwarding
- 反向代理(-R):相当于 frp 或者 ngrok
- socks5 代理(-D):相当于 ss/ssr
1.2 环境说明
1.2.1 主机列表
为了管理方便每一台服务器都有一个111网段的地址作用管理。只有主机A的网口及作为管理用也作为实验用。
其他服务器的111网段网口仅作为管理使用。每台服务器都安装有http服务,用作测试使用。

1.2.2 整体网络拓扑图
每个网段间的主机可以互相访问,不同网段的主机默认是不能互相访问的。

二、实际操作
2.1 正向代理
正向代理的也称为本地转发,使用把远程主机的指定端口映射到本地主机的指定端口,访问本地主机的端口时同等于访问远程主机的端口。
2.1.1 案例一
主机A通过主机B的端口访问到主机C监听在80端口的网页。
此案例的隧道开启操作在主机B上进行。
2.1.1.1 命令格式
主机B上启动一个B 端口,映射到 【主机C的C端口】上,这时访问 【主机B的B端口】相当于访问【主机C的C端口】,该功能类似于iptables的转发功能。
ssh -N -f -L 本地主机ip地址:本地主机端口:远程主机ip地址:远程主机端口 用户名@远程主机ip地址
说明:
-L 正向代理的标志参数
-N 命令不会登录到远程服务器上,会停留在本地服务器中,但是还是会占用一个终端。
-f 把命令放在后台运行,加了-f -N 参数,命令则不会登录到远端服务器上,会在本地服务器的后台运行。
本地主机ip地址 本地主机的端口监听的ip地址,默认是127.0.0.1,如果监听在127.0.0.1则只有本主机可以使用这个端口跳转,就完全失去了代理的意义。
本地主机端口 本地主机用作映射远程主机的端口,此处选择一个未占用的大端口号。
远程主机ip地址 远程主机的ip地址
远程主机端口 远程主机已经处于监听的端口,也就是需要映射到本地主机的端口。
用户名 操作系统用户名,如root。
注:
如果命令没有-N -f 参数,命令使用过后会登录到用户名@远程主机ip地址主机上,请保持这个终端正常运行,一旦终端退出则代理结束。所以-N -f 参数很重要。
使用 -N -f 参数时必须保证 -N -f 为ssh命令后第一二参数位,否则命令会报识别不了参数。
2.1.1.2 实际操作
操作前测试
hostA访问hostC结果。代理开启前,HostA不能访问hostC的网页。
hostB是否对待使用端口进行监听。代理前HostB的33333端口未使用。
开启隧道
在主机B上执行
jenkins@HOST_B:~$ ssh -N -f -L 0.0.0.0:33333:192.168.32.136:80 jenkins@192.168.32.136
结果
hostA通过hostB映射的端口能够正常访问到hostC上的网页。

代理开启后,HostB上的33333端口处于正常监听状态。

2.1.2 案例二
主机A可以通过自身的本地的端口经由主机B访问到主机C上监听在80端口的网页。
此案例的隧道开启操作在主机A上进行。
案例二和案例一的区别在于,案例一是在主机A上访问主机B的端口;案例二是在主机A上访问主机A的端口。
2.1.2.1 命令格式
主机A上启动一个A 端口,通过主机B映射到 【主机C的C端口】上,这时访问 【主机A的A端口】相当于访问【主机C的C端口】,该功能类似于iptables的转发功能,只是中间多了一层主机B的自动跳转。
ssh -N -f -L 0.0.0.0:主机A端口:主机C地址:主机C端口 用户名@主机B地址
说明:
-L 正向代理的标志参数
-N 命令不会登录到远程服务器上,会停留在本地服务器中,但是还是会占用一个终端。
-f 把命令放在后台运行,加了-f -N 参数,命令则不会登录到远端服务器上,会在本地服务器的后台运行。
主机A端口 本地主机用作映射远程主机的端口,此处选择一个未占用的大端口号。
主机C地址 远程主机的ip地址
主机C端口 远程主机已经处于监听的端口,也就是需要映射到主机A的端口。
主机B地址 能够同时连接主机A和主机C的中间主机,同时主机A能够访问的主机B的ip地址。
注:
如果命令没有-N -f 参数,命令使用过后会登录到用户名@主机B地址主机上,请保持这个终端正常运行,一旦终端退出则代理结束。所以-N -f 参数很重要。
使用 -N -f 参数时必须保证 -N -f 为ssh命令后第一二参数位,否则命令会报识别不了参数。
2.1.2.2 实际操作
操作前测试
hostA访问hostC结果。代理开启前,HostA不能访问hostC网页。
hostA是否对待使用端口进行监听。代理前HostB的33333端口未使用。
开启隧道
gitlab@Host_A:~$ ssh -N -f -L 0.0.0.0:33333:192.168.32.136:80 jenkins@192.168.111.130
结果
hostA通过hostB映射的端口能够正常访问到hostC上的网页。

代理开启后,HostA上的33333端口处于正常监听状态。

2.2 反向代理
反向代理的也称为远程端口转发,把主机的指定本地端口映射到远程主机的指定端口,访问远程主机的指定端口时同等于访问本地主机指定的端口。
2.2.1 案例一
主机C上有一个监控在80端口网页,此时我想通过主机A直接访问主机C上的80端口。但是需要在主机B上开启sshd的GatewayPorts。必须在开启隧道前提前开启,不开启该参数的话只有主机A的127.0.0.1能访问。
此案例的隧道开启操作在主机C上进行。
2.2.1.1 命令格式
主机C上运行隧道启动命令,把【主机C上C 端口】,映射到 【主机B的B端口】上,这时访问 【主机B的B端口】的等同于访问【主机C的C端口】。
ssh -N -f -g -R 远程ip地址:远程主机端口:本地主机ip地址:本地主机端口 用户名@远程主机ip地址
说明:
-R 反向代理的标志参数
-N 命令不会登录到远程服务器上,会停留在本地服务器中,但是还是会占用一个终端。
-f 把命令放在后台运行,加了-f -N 参数,命令则不会登录到远端服务器上,会在本地服务器的后台运行。
-g 开启网关功能,开启过后运行命令的主机所有网口都会监听对应端口。
本地主机ip地址 本地主机的端口监听的ip地址,默认是127.0.0.1,如果监听在127.0.0.1则只有本主机可以使用这个端口跳转,就完全失去了代理的意义。
本地主机端口 本地主机用作映射远程主机的端口,此处选择一个未占用的大端口号。
远程主机ip地址 远程主机的ip地址
远程主机端口 远程主机已经处于监听的端口,也就是需要映射到本地主机的端口。
用户名 操作系统用户名,如root。
注:
如果命令没有-N -f 参数,命令使用过后会登录到用户名@远程主机ip地址主机上,请保持这个终端正常运行,一旦终端退出则代理结束。所以-N -f 参数很重要。
使用 -N -f 参数时必须保证 -N -f 为ssh命令后第一二参数位,否则命令会报识别不了参数。
2.2.1.2 实际操作
操作前测试
hostA访问hostC结果。代理开启前,HostA不能通过主机B访问hostC网页。
开启隧道
开启sshd服务的网关功能,在hostB主机上,必须开启后再执行后续的hostC上开启隧道命令。
root@HOST_B:~# vim /etc/ssh/sshd_config #在sshd_config配置文件中修改GatewayPorts为yes
GatewayPorts yes
root@HOST_B:~# systemctl restart sshd
jenkins@Host_c:~$ ssh -N -f -g -R 192.168.32.130:33333:0.0.0.0:80 jenkins@192.168.32.130
结果
hostA通过主机B能够正常访问到hostC上的网页。

代理开启后,HostB上的33333端口处于正常监听状态。

2.2.2 案例二
主机A可以通过自身的本地的端口经由主机B访问到主机C上监听在80端口的网页。此案例的隧道开启操作在主机B上进行。但是需要在主机A上开启sshd的GatewayPorts。必须在开启隧道前提前开启,不开启该参数的话只有主机A的127.0.0.1能访问。
此案例的隧道开启操作在主机B上进行。
2.2.1.1 命令格式
主机C上启动一个C 端口,映射到 【主机A的A端口】上,这时访问 【主机A的A端口】相当于访问【主机C的C端口】,注意和正向代理的案例二区分。
ssh -N -f -g -R 主机A地址:主机A端口:主机C地址:主机C端口 用户名A@主机A地址
说明:
-R 反向代理的标志参数
-N 命令不会登录到远程服务器上,会停留在本地服务器中,但是还是会占用一个终端。
-f 把命令放在后台运行,加了-f -N 参数,命令则不会登录到远端服务器上,会在本地服务器的后台运行。
-g 开启网关功能,开启过后运行命令的主机所有网口都会监听对应端口。
注:
如果命令没有-N -f 参数,命令使用过后会登录到用户名@远程主机ip地址主机上,请保持这个终端正常运行,一旦终端退出则代理结束。所以-N -f 参数很重要。
使用 -N -f 参数时必须保证 -N -f 为ssh命令后第一二参数位,否则命令会报识别不了参数。
2.2.1.2 实际操作
操作前测试
hostA访问hostC结果。代理开启前,HostA不能通过主机B访问hostC的网页。
开启隧道
开启sshd服务的网关功能,在hostA主机上,必须开启后再执行后续的hostB上开启隧道命令。
root@HOST_A:~# vim /etc/ssh/sshd_config #在sshd_config配置文件中修改GatewayPorts为yes
GatewayPorts yes
root@HOST_A:~# systemctl restart sshd
jenkins@HOST_B:~$ ssh -N -f -g -R 192.168.111.129:33333:192.168.32.136:80 gitlab@192.168.111.129
结果
hostA通过本地端口能够正常访问到hostC上的网页。

代理开启后,HostA上的33333端口处于正常监听状态。

ssh静态代理模式讲解与使用的更多相关文章
- 黑马程序员:Java基础总结----静态代理模式&动态代理
黑马程序员:Java基础总结 静态代理模式&动态代理 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 静态代理模式 public class Ts { ...
- Java模式—静态代理模式
静态代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问,提供“真实对象”的代表,在访问对象时引入一定程度的间接性,这种间接性可以附加多种用途. 代理模式的主要作用是为其他对象 ...
- 2.1多线程(java学习笔记) java中多线程的实现(附静态代理模式)
一.多线程 首先我们要清楚程序.进程.线程的关系. 首先进程从属于程序,线程从属于进程. 程序指计算机执行操作或任务的指令集合,是一个静态的概念. 但我们实际运行程序时,并发程序因为相互制约,具有“执 ...
- java 多线--静态代理模式
我们使用 java 多线程时,都需要通过线程代理对象来启动线程,常见的写法: new Thread(target).start(); 这在设计模式中叫静态代理模式,静态代理模式组成; 1.公共接口 2 ...
- java的线程、创建线程的 3 种方式、静态代理模式、Lambda表达式简化线程
0.介绍 线程:多个任务同时进行,看似多任务同时进行,但实际上一个时间点上我们大脑还是只在做一件事情.程序也是如此,除非多核cpu,不然一个cpu里,在一个时间点里还是只在做一件事,不过速度很快的切换 ...
- JAVA笔记7__接口应用/Object类/简单工厂模式/静态代理模式/适配器模式
/** * 接口应用 */ public class Main { public static void main(String[] args) { Person p = new Person(&qu ...
- 【多线程】Thread静态代理模式理解
Thread静态代理模式理解 代码示例: /** * @Description 静态代理模式 * @Author hzx * @Date 2022-03-26 */ public class Stat ...
- JAVA静态代理模式(从现实生活角度理解代码原理)
代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. 代理模式说白了就是"真实对象"的代表,在访问对象时引入一定程度的间接性,因为这种间接性可以附加多种用途. 在 ...
- Java代理模式——静态代理模式
一:代理模式 代理模式的作用是:为其他对象提供一种代理以控制这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 二:代理模式设计 ...
随机推荐
- Natasha 4.0 探索之路系列(四) 模板 API
Natasha 模板 Natasha 在编译单元的基础上进行了封装整理, 并提供了多种模板帮助开发者构建功能. 使用此篇的 API 前提是您对 C# 非常熟悉, 对系统的一些类型足够了解. 据此 Na ...
- gin框架中使用jwt
生成解析token 如今有很多将身份验证内置到API中的方法 -JSON Web令牌只是其中之一.JSON Web令牌(JWT)作为令牌系统而不是在每次请求时都发送用户名和密码,因此比其他方法(如基本 ...
- AOP-底层原理
AOP(底层原理) 1,AOP底层使用动态代理 (1)有两种情况动态代理 第一种 有接口情况,使用JDK动态代理 *创建接口实现类代理对象,增强类的方法 第二种 无接口情况,使用CGLIB动态代理 * ...
- vite搭建vue项目-集成别名@、router、vuex、scss就是这样简单
为什么要使用vite 当我们开始构建越来越大型的应用时, 需要处理的 JavaScript 代码量也呈指数级增长. 包含数千个模块的大型项目相当普遍. 这个时候我们会遇见性能瓶颈 使用 JavaScr ...
- 创建SSH密钥时使用了自定义文件名遇到的问题
问题描述 如图,我自定义了密钥文件名字. 所以在测试连接时导致了: 问题解决 连接的时候指定自己重命名的私钥文件名就好了. ssh -T -i git_test git@github.com SSH命 ...
- nginx入门教程 (转)
1.Nginx 状态码配置和错误文件 server { # 配置访问 /test.js 时报 403 错 location /test.js { return 403; } # 配置访问 /404 时 ...
- 使用C++开发PHP扩展
目前,PHP编程语言也是相当成熟,各种文档,各种问题,只要Google一下,总有你想要的答案.当然"如何开发PHP扩展"的文章也不少,但是很少有专门来介绍使用C++开发PHP扩展的 ...
- python基础语法_闭包详解
https://www.cnblogs.com/Lin-Yi/p/7305364.html 闭包有啥用??!! 很多伙伴很糊涂,闭包有啥用啊??还这么难懂! 3.1装饰器!!!装饰器是做什么的??其 ...
- 如何从0到1设计一个类Dubbo的RPC框架
之前分享了如何从0到1设计一个MQ消息队列,今天谈谈"如何从0到1设计一个Dubbo的RPC框架",重点考验: 你对RPC框架的底层原理掌握程度. 以及考验你的整体RPC框架系统设 ...
- MXNet学习-第一个例子:训练MNIST数据集
一个门外汉写的MXNET跑MNIST的例子,三层全连接层最后验证率是97%左右,毕竟是第一个例子,主要就是用来理解MXNet怎么使用. #导入需要的模块 import numpy as np #num ...