ssh三种代理模式(L/R/D)

三种模式:

ssh命令除了登陆外还有三种代理功能:

  • 正向代理(-L):相当于iptables的port forwarding
  • 反向代理(-R):相当于frp或ngrok
  • socks5代理(-D):相当于ss/ssr

概述:

正向代理:

所谓“正向代理”就是在本地启动端口,把本地端口数据转发到远端。

用法1:远程端口映射到其他机器。

HostB上启动一个PortB端口,映射到HostC:PortC上,在HostB上运行:

HostB$ ssh -L PortB:HostC:PortC user@HostC

 

这时访问HostB:PortB相当于访问HostC:PortC。

 

用法2:本地端口通过跳板映射到其他机器:

HostA上启动PortA端口,通过HostB转发到HostC:PortC上,在HostA上运行:

HostA$ ssh -L PortA:HostC:PortC  user@HostB

这时访问HostA:PortA相当于访问HostC:PortC。(A与B能通,B与C能通)。

一般在本地执行,例如:

HostA$ ssh -L 1111:172.18.0.2:80  root@chensir.icu -p 2222

在本地电脑执行,访问本地的1111端口,转给到chensir.icu,然后再去访问172.18.0.2:80;就相当于chensir.icu服务器作为本地的正向代理服务器。

 

两种区别:

方法1:本地到跳板机HostB的数据是明文的

方法2:一般本地就是HostA,访问本地PortA,数据被加密传输给HostB,然后再转发给HostC:PortC。

反向代理

反向代理就是让远端启动端口,把远端端口数据转发到本地。

HostA将自己可以访问的HostB:PortB暴露给外网服务器HostC:PortC,在HostA上运行:

HostA$ ssh -R HostC:PortC:HostB:PortB  user@HostC

 

链接HostC:PortC相当于链接HostB:PortB,使用时需修改HostC的/etc/ssh/sshd_config,添加:

GatewayPorts yes

 

相当于内网穿透,比如HostA和HostB是同一个内网下的两台可以互相访问的机器,HostC是外网跳板机,HostC不能访问HostA,但是HostA可以访问HostC。

那么通过在内网HostA上运行ssh -R告诉HostC,创建PortC端口监听,把该端口所有数据转发给HostA,然后HostA会再转发给同一内网的HostB:PortB。

 

同内网下的 HostA/HostB 也可以是同一台机器,换句话说就是内网 HostA 把自己可以访问的端口暴露给了外网 HostC。

例如:

ssh -R 9999:127.0.0.1:1111 root@chensir.icu -p 2222

 

个人理解:将127.0.0.1:1111暴露给公网的chensir.icu:9999端口,访问chensir.icu:9999端口相当于访问127.0.0.1:1111端口。其中127.0.0.1:1111也可以是127.0.0.1可达的任何一台内网服务器。

 

本地socks5代理

在HostA的本地1080端口启动一个socks5服务,通过本地socks5代理的数据会通过ssh链接先发送给HostB,再从HostB转发给远程主机:

HostA$ ssh -D localhost:1080  HostB

 

在HostA上面,浏览器配置socks5代理位127.0.0.1:1080,看网页时就能把数据通过HostB代理出去,类似ss/ssr版本,只不过用ssh来实现。

 

命令详解:

1、正向隧道-----隧道监听本地port,为普通活动提供安全链接:

HostA上执行:

ssh -qTfnN -L PortA:HostB:PortB  -l user HostB

访问HostA:PortA相当于访问HostB:PortB

 

2、反向代理----隧道监听远程port:

HostA上执行,HostA能通HostC,HostA能通HostB

ssh -qTfnN -R HostC:PortC:HostB:PortB  user@HostC

访问HostC:PortC相当于访问HostB:PortB(HostB也可以是本地)

 

3、socks代理:

ssh -qTfnN -D localhost:1080  HostB

通过本地的1080端口动态访问HostB,然后HostB代理去访问远程主机

 

-q:安静模式,忽略一切对话和错误提示

-T:不占用 shell

-f:后台运行,并推荐加上 -n 参数

-n:后台运行,并推荐加上 -n 参数

-N:不执行远程命令,专为端口转发度身打造

 

实例:

ssh -CfNg -L 6300:172.16.1.164:1521 oracle@172.16.1.164

访问127.0.0.1:6300相当于访问172.16.1.164:1521端口

 

ssh -CfNg -R 1521:127.0.0.1:6300 oracle@172.16.1.164

访问远端地址172.16.1.164:1521相当于访问127.0.0.1:6300(也可以是与127.0.0.1能通的其他局域网主机)

例如:

 ssh -CfNg -R 9999:192.168.56.3:22 root@chensir.icu -p 2222

在虚拟机1中设置远端代理,此时访问chensir.icu的9999端口,相当于访问192.168.56.3的22端口。

 

参数说明:

 

"-C选项" Enable compression.压缩数据传输。

 

"-L选项":表示使用本地端口转发创建ssh隧道

 

"-R选项":表示使用远程端口转发创建ssh隧道

 

"-N选项": 表示创建隧道以后不连接到sshServer端,不执行脚本或命令,,通常与"-f"选项连用

 

"-f选项":表示在后台运行ssh隧道,通常与"-N"选项连用

 

"-g选项":表示ssh隧道对应的转发端口将监听在主机的所有IP中,不使用"-g选项"时,转发端口默认只监听在主机的本地回环地址中,"-g"表示开启网关模式,远程端口转发中,无法开启网关功能。在-L/-R/-D参数中,允许远程主机连接到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接。

 

"-L选项" port:host:hostport

将本地机(客户机)的某个端口转发到远端指定机器的指定端口. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 同时远程主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有 root 才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport

 

"-R选项" port:host:hostport

将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口. 工作原理是这样的, 远程主机上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转向出去, 同时本地主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有用 root 登录远程主机才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport

 

"-D选项" port

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

posted @ 2021-12-28 12:24  Day__Day_Up  阅读(347)  评论(0编辑  收藏  举报