SSH端口转发实践

背景

条件:有A(Win10),B(Centos8),C(Win10)三台主机,其中AB之间、BC之间可以互相访问(by SSH),但是A不能直接访问C;ABC在子网A,但只有C可访问子网B。

需求:使A通过C临时访问(by http/https)一下子网B。

本以为这个这是个简单的事情,结果浪费了好几个小时。总结一下。

解决方案

1,从A 通过SSH,登录到C。由于之前在C上已部署过ccproxy服务(将安装后的目录压缩成一个包再卸载此程序),解压缩之前保存的包,然后通过sc create命令创建服务,再sc start 或者net start 命令,启动此服务。

注:

这里有个小技巧可以省掉sc  create:首次安装cc并运行后,可以勾选"NT服务“,则该程序会自动创建服务。即便卸载,再运行cc也可自动创建服务。

2,cc默认的http/https/ftp的端口是808;socks端口是1080。这里要特别注意,启动前要检查这两个端口有无被占用。

注:

这一步没留意,导致后续测试始终有问题,导致白白浪费几个小时进行排查。教训深刻。没留意的原因有二:一是之前使用时808并未被占用,这次有点想当然;二是命令行启动cc服务,即使端口被占用也不会报错。

所以,如果用命令行操作,在开启cc前,一定要用netstat 命令查看端口,确保端口未被占用。(或者通过GUI下运行CC,此时若端口占用也会报错。这次也是这样才发现。至于为什么不开始就用远程桌面,根本原因是关不掉的卡巴斯基把rdpwrapper视为病毒。。。)

3, 然后在A上创建SSH本地隧道。用参数L。命令格式为 ssh -L -N 10808:C的地址:808 B的user@B的地址。其中10808可自定义。然后在A的浏览器代理中设置http/https proxy为127.0.0.1和10808。类似地,如果要转发socks5,在A上再创建:ssh -L -N 11080:C的地址:808 B的user@B的地址。其中11080也是自定义。

注:

1,此番设置后,A应可正常使用。

2,如果A不能正常通过代理联网,考虑从以下几个方面排查:A自身的防火墙是否允许相应端口出站或者入站;网络防火墙有无阻止。排查过程中可以用到curl -v 命令。

3,实操发现,在A的命令行set all_proxy=socks5://127.0.0.1:11080,浏览器是无法外网的。还是要设置浏览器的代理。

4,若B(centos8)能访问子网B,则简单的多,直接export all_proxy=socks5://C的地址:1080(也可写入.bashrc),yum 便可正常外网了。

5,除了用SSH创建本地隧道,也可创建远程隧道。

优化方案

上述方案有用到cc(是个GUI程序,不方便命令行操作),且转发时的跳转次数多了点。思考后验证如下方案也是可行的。

1,在B上执行:ssh -N -D 21080 C的用户@C的地址  ,其中21080为自定义端口,可修改。

2,在A上设置 set all_proxy=socks5://B的地址:21080 ,然后curl -v 便可正常访问。此步仅仅是为了验证。并非必需。

3,找个将 socks5 proxy 转换为 http proxy的工具,这里找的是:socks2http-rs,执行 socks2http.exe -l 127.0.0.1:11080 B的地址:21080

4,然后在IE浏览器设置http/https代理为127.0.0.1:11080,便可正常使用。

其他转发示例

正向转发(A经B到C):

方式1:在B上执行:ssh -N -L 9001:hostC:22 userC@hostC (将B的9001端口映射到C的22端口),然后便可在A上可执行:ssh userC@HostB -p 9001,此时实际登入HostC。

方式2:在A上执行:ssh -N -L 9001:hostC:22 userB@hostB,(将A的9001端口通过B映射到C的22端口),便可在A上执行ssh userC@127.0.0.1 -p 9001,此时实际登入HostC。

正向转发(A端口映射后到B端口):

在A上执行:ssh -N -L 9001:hostB:22 userB@hostB,然后在A上执行:ssh userB@127.0.0.1 -p 9001,此时实际登入HostB。

反向转发:

在B上执行:ssh -N -R hostA:9001:127.0.0.1:22 userA@hostA,然后在A上执行:ssh userB@127.0.0.1 -p 9001,此时实际登入hostB。

再举一例:在B上执行 ssh -N -R hostA:9001:127.0.0.1:3389 userA@hostA,然后再A上执行mstsc 127.0.0.0:9001,便可连接到B。

注意:

远程端口转发时,需将「sshd_config」文件中「GatewayPorts」选项后的「no」修改为「yes」。

补充-动态转发场景

场景:A不能上网但B可以。A需要临时联网。

在A上执行: ssh -N -D portA1 userB@hostB

如果要上网:在A上设置浏览器代理或者系统代理便可。要注意的是,通过浏览器设置时,不要设置http或者https等代理,仅需设置socks便可;通过系统设置时,格式是socks=127.0.0.1,端口为portA1。(注意:设置IP地址时,地址中不要填写 http://,因为保存后,它会自动在地址前添加 http://)

如果要使用choco安装:choco目前还不支持socks5或者https代理。所以需要找个工具将socks5代理转换为http代理。除了上面的socks2http-rs,也可使用socks-to-http-proxy

以socks-to-http-proxy为例,在A上执行:sthp.exe -p portA2 -s 127.0.0.1:portA1

然后,便可执行choco 安装。例如:choco install 7zip --proxy="'http://127.0.0.1:portA2'"

补充:如果A是ubuntu 22.04:

同样地,在A上运行 ssh -N -D 11080 userB@hostB 

假设需要apt 能够联网,则

sudo nano /etc/apt/apt.conf.d/proxy.conf

输入内容为:

Acquire::http::Proxy "socks5h://127.0.0.1:11080";
Acquire::https::Proxy "socks5h://127.0.0.1:11080";
Acquire::socks::Proxy "socks5h://127.0.0.1:11080";

则apt 可以联网。 

也可以通过此方式:

sudo apt -o Acquire::http::Proxy="socks5h://127.0.0.1:11080/" install curl

apt和git使用socks5代理_hddong97的博客-CSDN博客_socks5h

Configure proxy for APT? - Ask Ubuntu

apt-get 使用 socks5 代理 (linzhanyu.github.io)

注意:协议要写成socks5h;对apt而言,关键要设置http::Proxy(实践发现,只指定socks::Proxy apt不会联网;只指定http::Proxy apt可联网) 

如果要使得浏览器可上网,则(以firefox为例) 

 

 注意:实践发现,如果指定http代理反而不能上网;只指定socks主机便可。

参考

proxychins+ssh使用socks5代理

通过SSH实现TCP/IP隧道(端口转发):使用OpenSSH可能的8种场景

ssh利用端口转发实现SOCKS5代理

Win10 离线安装Openssh

https://blog.csdn.net/weixin_41601114/article/details/108052922

彻底搞懂SSH端口转发命令 - 知乎

ssh 端口转发_淘金者05012的博客-CSDN博客_gatewayports怎么修改成yes

sshd 中文手册 [金步国]

SSH 命令的三种代理功能(-L/-R/-D) - 苍青浪 - 博客园

windows10 设置 socks5 代理 - xuyaowen - 博客园

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值