SSH用于隧道代理的一些场景
注意事项
修改中转服务器上的 sshd 服务配置项:GatewayPorts yes 这样当使用 -R 参数进行转发时中转服务器会监听 0.0.0.0 而不是 127.0.0.1
基本用法
1、将 A 机器的某个端口映射到 B 机器的某个端口
例如:
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代理:
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 端口
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 上
例如:
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 端口
例如:
ssh -p 22 -NR 0.0.0.0:8022:127.0.0.1:22 root@A_ip
3、本地通过服务器ip_port访问云手机
ssh -p 8022 root@A_ip
一句话总结:将访问具有公网IP的服务器的流量转发到云手机,转发行为发起人是云手机
隧道稳定性
SSH 隧道在网络波动的情况下会断掉,所以需要有守护进程来保证断掉重连,推荐使用 autossh
autossh 只能设置免密登录,否则 autossh 不能运行,因为自动重连的时候如果没有免密,是没办法输入密码的
用法参见 autossh 文档
autossh -f -M 0 [SSH OPTIONS]
某些时候会出现 ssh 链接仍在,但端口转发失败的情况,此时 autossh 不会自动重启 ssh,可配合定时任务,定时 kill ssh 进程,然后 autossh 会进行重启。
socks 代理应用
案例1:
当公司仅允许通过jumpserver访问服务器,并且禁止了 vpn 的 22 端口时:
-
在服务器上启动代理 ssh -p22 -fqND 0.0.0.0:6565 root@127.0.0.1
-
本地配合 ProxyCommand
ssh -o ProxyCommand='nc -X 5 -x 10.40.34.248:6565 %h %p' root@remote_ip
案例2:
云厂商的服务器公网 IP 都是非住宅类的,而某些应用或服务限制了此类IP,此时可以搭建代理配合 proxifier 使服务器流量走本地。
如下命令,可以在远程启动一个 socks5 代理 监听 8889 端口,并将远程机器的 8889 端口流量转发到本地的 8889 端口
ssh -N -R 0.0.0.0:8889 root@remote_ip
将本地端口映射到远程服务器端口, 使远程服务器可通过本地网络上网