ssh除了可以用来远程操作服务器外,还可以用来进行端口转发。
端口转发的方式主要有三种,远程转发、本地转发和动态转发,基本涵盖了大部分代理或者跳板的需求。
假设现在有以下设备:
- 个人电脑 - 内网ip
- 云服务器1 - 公网ip和内网ip
- 云服务器2 - 内网ip
通常我们会在个人电脑上使用以下命令进行ssh远程访问:
ssh root@{云服务器1外网ip}
本地转发
本地转发绑定ssh客户端的某个端口,访问该端口都会被ssh服务端转发到设置好的地址中
ssh -L -N 55555:{云服务器2内网ip}:22 root@{云服务器1外网ip}
- -L 本地转发
- -N 不登录SSH会话,通常做转发时会加上
现在我们访问个人电脑的55555端口,云服务器1会帮我们转发到云服务器2的22端口中。
{云服务器2内网ip}:22可以替换为ssh服务端(即云服务器1)任意可以访问的地址。
远程转发
远程转发和本地转发反过来,访问ssh服务端的某个端口会被转发到ssh客户端上设置好的地址中,相当于内网穿透。
ssh -R -N 55555:{个人电脑内网ip}:3389 -N root@{云服务器1外网ip}
- -R 远程转发
- -N 不登录SSH会话,通常做转发时会加上
现在通过访问云服务器1的公网IP+55555端口,会访问个人电脑的3389端口,类似frp和花生壳的内网穿透。
{个人电脑内网ip}:3389可以替换为ssh客户端(即个人电脑)任意可以访问的地址。
动态转发
动态转发使用socks协议,更为灵活地转发流量。我们需要配置应用使用socks代理。
ssh -D -N 55555 root@{云服务器1外网ip}
- -D 动态转发
- -N 不登录SSH会话,通常做转发时会加上
假设云服务器2的80端口上有http服务,那么我们可以在个人电脑上使用:
curl -x socks5://{个人电脑服务器ip}:55555 http://{云服务器2内网IP}:80
来访问云服务器2的80端口上的http服务。
{云服务器2内网IP}:80同样可替换为ssh服务端(即云服务器1)任意可以访问的地址。
这个方法在以前会用来访问外国的服务,但是现在已经被特征识别,访问外国网络容易被封锁。