首页 > 其他分享 >SSH实现多跳代理

SSH实现多跳代理

时间:2023-04-13 14:59:41浏览次数:43  
标签:127.0 实现 端口 代理 0.1 SSH 服务器 ssh

背景

我们实验室有两台服务器,其中一台无法从外网访问,另一台设置了内网穿透。我平常在无法从外网访问的那台服务器上做实验,所以如果在实验室外要连接那台服务器就需要将设置了内网穿透的服务器作为跳板,通过两次ssh登进实验服务器。

最近我的实验需要联网下载包,但是服务器要联网需通过登录认证服务网页进行认证,而服务器又没有安装远程桌面,直接通过命令行访问认证网页实在是力不从心。所以我需要想办法设置代理,使得我可以通过自己电脑上的浏览器通过实验服务器访问认证网页,从而登录上网。

总结一下需求,就是网络中有A、B、C、D四个节点,其中A和B互联,B和C互联,C和D互联,如何设置使得A能访问D。

方法

考虑简单情况,如果B和D是互联的,那么就可以直接通过ssh的Socks代理实现功能,具体步骤如下:

  1. 在A运行:ssh -N -D 127.0.0.1:Aport Busername@Bhostname。其中Aport可以是A上任意闲置的端口。
  2. 在A中打开浏览器,设置浏览器的代理为socks5://127.0.0.1:Aport,然后输入D的网址,即可访问认证网页。

实际上,相当于A对D的请求被ssh代理转发到B上,由B的sshd进程访问D。所以如果B服务器要上网,通过这种方法在D上认证后能够上网的就是B。那么如何将A对D的请求转发到C上,由C访问D呢?

失败方法

我一开始考虑的方法是利用ssh的端口转发功能,端口转发实现的是将远程服务器的端口映射到本地端口。这么说是不是很抽象,然而大部分博客就是这样说的,能看懂就见鬼了。以我的需求做例子,在B上运行命令:ssh -L Bport:Dhostname:Dport Cusername@Chostname,其中Bport可以是B上任意闲置的端口,实现的功能就是可以通过访问Bport端口透过C访问D了。那么理论上我就可以通过前面所说的Socks代理方法用A访问D:

  1. 在A运行:ssh -N -D 127.0.0.1:Aport Busername@Bhostname。其中Aport可以是A上任意闲置的端口。
  2. 在A中打开浏览器,设置浏览器的代理为socks5://127.0.0.1:Aport,然后输入https://127.0.0.1:Bport,通过B代理透过C访问D。

为了测试,我在B上运行curl -I https://127.0.0.1:Bport,连是能连,但返回了证书错误,说明如果验证网页是http,方法应该是可行的。可惜认证网页是https,让我不得不去寻找其他方法。

顺带一提,ssh的端口转发功能分为两种,一种是本地端口转发,一种是远程端口转发,前面使用参数-L的方法是本地端口映射,如果要使用远程端口映射,则在C上运行命令ssh -R Bport:Dhostname:Dport Busername@Bhostname,其中Bport可以是B上任意闲置的端口,实现的功能和本地端口映射完全等价,不过本地端口转发是B上的ssh负责监听,转发给C上的sshd负责请求;远程端口转发是B上的sshd负责监听,转发给C上的ssh负责请求,ssh和sshd互换了身份,当然对于我的需求,两种方法都不满足。

成功方法

我在网上搜相关资料的时候,意外搜到一个给ssh本身添加代理的方法,顿时有了灵感。如果我能通过某种方法,使A能够直连到C,这样我就可以将C作为Socks5代理连到D了。那么如何使A直连到C呢?给ssh本身添加代理就是解决方案!具体步骤如下:

  1. 在A运行:ssh -N -D 127.0.0.1:Aport1 Busername@Bhostname,其中Aport1可以是A上任意闲置的端口。
  2. 在A运行:ssh -o ProxyCommand='C:\Program Files\Git\mingw64\bin\connect.exe -S 127.0.0.1:Aport1 %h %p' -p 20022 -N -D 127.0.0.1:Aport2 Cusername@Chostname,其中Aport2可以是A上任意和Aport1不一样的闲置端口。
  3. 在A中打开浏览器,设置浏览器的代理为socks5://127.0.0.1:Aport2,然后输入D的网址,即可访问认证网页。

注意A是Windows系统,所以给ssh添加代理的方法是使用connect.exe,Linux下使用的是Netcat,网上有很多相关资料。另外就是这个connect.exe似乎是Git自带的一个程序,我刚好电脑里有Git就用上了,不知道有没有别的办法。

这个方法的意思是先建立一个B服务器的代理,然后建立一个通过B代理连接C服务器的代理,再通过C代理连接D。从A出发的对D的请求,先通过第二条ssh指令转变为往C发送,而往C发送的请求通过第一条ssh指令转变为往B发送,B的sshd收到以后往C发送,C的sshd收到以后往D发送,就实现了功能。

扩展

基于该方法,不难将其扩展到任意跳服务器的代理。比如将我需求中的两跳服务器改为三跳,即有A、B、C、D、E五个节点,A和B互联,B和C互联,C和D互联,D和E互联,怎么从A连到E。参考前面方法,只需要在A执行三个ssh代理命令即可:

ssh -N -D 127.0.0.1:Aport1 Busername@Bhostname
ssh -o ProxyCommand='C:\Program Files\Git\mingw64\bin\connect.exe -S 127.0.0.1:Aport1 %h %p' -p 20022 -N -D 127.0.0.1:Aport2 Cusername@Chostname
ssh -o ProxyCommand='C:\Program Files\Git\mingw64\bin\connect.exe -S 127.0.0.1:Aport2 %h %p' -p 20022 -N -D 127.0.0.1:Aport3 Dusername@Dhostname

三条命令在不同的命令行窗口下执行。用浏览器设置Socks5代理端口为Aport3,就能访问E了。再多跳数也是如此,跳数多少就执行多少条ssh代理命令。

标签:127.0,实现,端口,代理,0.1,SSH,服务器,ssh
From: https://www.cnblogs.com/YuanZiming/p/17314780.html

相关文章

  • 微信小程序嵌套的webview页面实现导航,可跳转高德百度等app
    需求:微信小程序中使用webview嵌套了h5页面,h5页面中有经纬度,需要实现唤醒高德app。实现思路:此处h5未配置wxSDK,无法直接使用openLocation,所以将经纬度传给小程序,map页面为跳转中间页,再实现打开地图页面。h5://高德地图导航constaMapNavigate=(address,lng,lat)=>{......
  • 如何实现 Java SpringBoot 自动验证入参数据的有效性
    JavaSpringBoot通过javax.validation.constraints下的注解,实现入参数据自动验证如果碰到@NotEmpty否则不生效,注意看下@RequestBody前面是否加上了@ValidValidation常用注解汇总Constraint详细信息@Null被注释的元素必须为null@NotNull被注释的元素必须不......
  • 反欺诈(羊毛盾)API 实现用户行为分析的思路分析
    简介反欺诈(羊毛盾)API是一种用于识别和防范各种欺诈行为的技术解决方案。它可集成到各种应用程序和平台中,通过手机号码、手机IP进行异常检测,达到防范恶意注册、虚假评论、虚假交易等欺诈行为的目的。本文主要介绍反欺诈(羊毛盾)API的工作原理、以及在用户行为分析技术、地理位置......
  • 如何利用Socks5代理防止爬虫被封禁
      在当前互联网环境下,爬虫已经成为了许多企业和个人获取信息的重要途径。然而,很多网站都设置了反爬虫机制,导致许多爬虫被封禁或者被限制访问。在这种情况下,利用Socks5代理是一个不错的解决方案。  Socks5代理是一种网络协议,它能够将网络请求通过代理服务器进行转发。Socks5......
  • Windows安装SSH服务器
    1、打开Win的设置并在设置中找到应用2、在应用中依次选择应用和功能可选功能3、在可选功能中选择添加功能(OpenSSH客户端默认已存在)选中OpenSSH服务器后点击下方的安装 4、快捷键win+r在运行中打开cmd在控制台中输入ssh,如下显示则说明ssh服务安装成功5、打开防火墙......
  • JOB实现定时收集特定用户的统计信息
    --创建存储过程createprocedureanalyze_table_elan4is--analyze_table_elan4存储过程名,自定义begindbms_stats.gather_schema_stats(ownname=>'ELAN',--修改要收集统计信息的用户options=>'GATHER',estimate_percent=>dbms......
  • Android技术分享 | 一行代码实现屏幕、声音采集
    之前发布过一行代码实现安卓屏幕采集编码,并介绍了如何屏幕采集编码并进行了封装,简单的调用即可实现MediaProjection权限申请、H264硬编码、错误处理等功能。本文将介绍新增的功能,还是只需一行代码即可实现屏幕、声音采集。一行代码实现屏幕采集编码之前的文章,我们已经介绍过如何......
  • 批量上传GPT知识库,前端elementui的upload上传组件,后端Golang的上传接口实现
    为了实现批量上传GPT的知识库并且功能,那么这个上传组件就必不可少,需要能把文档上传到服务器中。前端部分,我是采用的cdn引入的形式,引入的elmentui。该框架是有上传组件的,可以参考我的用法:action部分就是上传接口,其他三个是上传之前的处理,上传成功和失败后的回调函数......
  • 手机直播源码,JS实现页面下拉加载数据操作
    手机直播源码,JS实现页面下拉加载数据操作主要是在id="ph"的div内加载数据: <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml&qu......
  • 机器学习(六):回归分析——鸢尾花多变量回归、逻辑回归三分类只用numpy,sigmoid、实现RANS
    [实验1回归分析]一、预备知识使用梯度下降法求解多变量回归问题数据集Iris鸢尾花数据集是一个经典数据集,在统计学习和机器学习领域都经常被用作示例。数据集内包含3类共150条记录,每类各50个数据,每条记录都有4项特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度,可......