SSH用于隧道代理的一些场景

注意事项

修改中转服务器上的 sshd 服务配置项:GatewayPorts yes 这样当使用 -R 参数进行转发时中转服务器会监听 0.0.0.0 而不是 127.0.0.1

基本用法

1、将 A 机器的某个端口映射到 B 机器的某个端口

例如:

1
ssh -f -N -R 0.0.0.0:80:0.0.0.0:80 root@remote_ip

此命令会将本地机器的 80 端口映射到远程服务器(1.1.1.1)的 80 端口。当别人访问远程服务器的 80 端口时,流量就会被转发到本地的 80端口。

参数解析:

  • -R remote_ip:remote_port:local_ip:local_port 当不指定本地IP和端口时,remote_ip:remote_port 将会表现为 socks4/5代理

  • -f 使ssh命令后台运行

  • -N Do not execute a remote command. This is useful for just forwarding ports.

2、启动 socks 代理服务

在本地启动 socks代理:

1
ssh -N -D 0.0.0.0:1080 root@127.0.0.1

3、SSH 关键参数:

  • -R:将远程的流量接过来

  • -L:将自己的流量转发出去

案例

案例1:云手机走本地 fiddler 代理

准备:

1、一台有公网 IP 的服务器

2、自己的电脑能够通过 ssh 访问 1 的服务器

步骤:

1、本地启动 fiddler

2、本地使用 ssh 将本地 8889 端口(fiddler 端口)映射到服务器的 8889 端口

1
ssh -N -R 0.0.0.0:8889:127.0.0.1:8889 root@remote_ip

3、云手机增加代理:ip 为服务器的公网 ip,端口为 8889

可能的问题:

1、使用不当会造成本地 tcp 连接过多,卡死代理

一句话总结:将有公网IP的服务器的端口流量转发到本地电脑

案例2:远程连接云手机的 frida 服务

准备:

1、云手机开启 frida-server, 端口为 27042

2、云手机可运行 ssh

3、一台有公网 ip 的服务器 A

步骤:

1、云手机 ssh 公钥放到服务器 A 上

2、将云手机的端口映射到服务器 A 上

例如:

1
ssh -p 22 -N -R 0.0.0.0:27042:127.0.0.1:27042 root@A

3、本地通过服务器 A 的 ip:27042 访问云手机的 frida-server

一句话总结:将访问具有公网IP的服务器的流量转发到云手机,转发行为发起人是云手机

案例3:远程连接云手机的 ssh 服务

准备:

1、云手机可运行 ssh

2、一台有公网 ip 的服务器 A

步骤:

1、云手机 ssh 公钥放到服务器 A 上

2、云手机将自己的 22 端口映射到服务器 A 的 8022 端口

例如:

1
ssh -p 22 -NR 0.0.0.0:8022:127.0.0.1:22 root@A_ip

3、本地通过服务器ip_port访问云手机

1
ssh -p 8022 root@A_ip

一句话总结:将访问具有公网IP的服务器的流量转发到云手机,转发行为发起人是云手机

隧道稳定性

SSH 隧道在网络波动的情况下会断掉,所以需要有守护进程来保证断掉重连,推荐使用 autossh

autossh 只能设置免密登录,否则 autossh 不能运行,因为自动重连的时候如果没有免密,是没办法输入密码的

用法参见 autossh 文档

1
autossh -f -M 0 [SSH OPTIONS]

某些时候会出现 ssh 链接仍在,但端口转发失败的情况,此时 autossh 不会自动重启 ssh,可配合定时任务,定时 kill ssh 进程,然后 autossh 会进行重启。

socks 代理应用

案例1:

当公司仅允许通过jumpserver访问服务器,并且禁止了 vpn 的 22 端口时:

  1. 在服务器上启动代理 ssh -p22 -fqND 0.0.0.0:6565 root@127.0.0.1

  2. 本地配合 ProxyCommand

1
ssh -o ProxyCommand='nc -X 5 -x 10.40.34.248:6565 %h %p' root@remote_ip

案例2:

云厂商的服务器公网 IP 都是非住宅类的,而某些应用或服务限制了此类IP,此时可以搭建代理配合 proxifier 使服务器流量走本地。

如下命令,可以在本地启动一个 socks5 代理 监听8880,并将远程机器的

1
ssh -N -R 0.0.0.0:8889 root@remote_ip

将本地端口映射到远程服务器端口, 使远程服务器可通过本地网络上网