我是怎么用 SOCKS5 Proxy 解决服务器访问问题的

0 阅读4分钟

image.png

很多程序员第一次接触 SOCKS5 Proxy,其实并不是专门去研究这个协议,而是在解决一个实际问题的时候“顺带用上了”。

我第一次真正理解 SOCKS5,是在一次服务器运维的时候。


一个很真实的场景

那天我需要访问一台公司内网服务器。

结构大概是这样的:

我的电脑 → 跳板机 → 内网服务器

内网服务器只允许 跳板机访问,外部是完全无法连接的。

如果直接 SSH:

ssh user@inner-server

是一定会失败的,因为内网服务器根本不在公网。


传统做法:先登录跳板机

通常的做法是:

ssh user@jump-server

然后在跳板机里再执行:

ssh user@inner-server

这种方式当然可以用,但有几个问题:

  • • 只能在终端里操作
  • • 不能方便访问其它服务
  • • 浏览器 / 数据库 / Git 都用不了

于是我开始找一种更灵活的方式。


用 SSH 创建一个 SOCKS5 Proxy

后来发现 SSH 其实自带一个非常强大的功能:

动态端口转发

只需要一条命令:

ssh -D 1080 user@jump-server

这条命令会在本地创建一个代理:

127.0.0.1:1080

这个端口就是一个 SOCKS5 Proxy

也就是说:

我的电脑 → SOCKS5代理 → 跳板机 → 内网服务器

所有流量都会通过跳板机转发。


SOCKS5 在真实开发中的用途

一旦建立了 SOCKS5 代理,你会发现很多事情都变简单了。

例如:

浏览器访问内网系统
Git 拉取内网仓库
数据库客户端连接内网数据库
调试服务器上的 Web 服务

只要软件支持 SOCKS5,都可以通过这个代理访问内网资源。

换句话说:

你的电脑就像直接进入了内网环境。


现实问题:服务器越来越多

一开始只有一两台服务器的时候,其实问题不大。

很多事情直接用命令就可以解决,例如:

ssh -D 1080 user@jump-server

或者:

ssh -L 3306:127.0.0.1:3306 user@server

这些命令都很常见。

但随着服务器越来越多,事情就会变得复杂起来。

例如你可能会遇到这样的情况:

  • • 服务器 A 需要 SOCKS5 代理
  • • 服务器 B 需要端口转发
  • • 服务器 C 需要跳板机登录
  • • 服务器 D 需要 VNC

每一种连接方式都对应不同的命令。

慢慢你就会发现:

很多时间其实花在 记命令和管理连接信息 上。

例如:

  • • 哪台服务器用哪个端口
  • • 哪个服务走哪个跳板
  • • 哪个代理是 1080,哪个是 1081

如果服务器数量增加,这些信息就很容易混乱。

很多开发者最后会变成这样:

  • • 用笔记软件记录命令
  • • 用 Excel 管服务器信息
  • • 用不同工具连接不同协议

久而久之,运维工作就变得比较零散。


为什么很多人开始使用图形化工具

所以后来越来越多开发者开始使用 图形化的远程管理工具

这些工具会把连接信息统一管理,例如:

  • • 服务器 IP
  • • 用户名
  • • 端口
  • • 协议类型

需要连接的时候,只需要点击一下即可,而不需要每次重新输入一长串命令。

例如:

  • • SSH
  • • RDP
  • • VNC
  • • SFTP

都可以在一个工具里统一管理。

当服务器数量变多时,这种方式会明显提高效率。


一体化工具的思路

现在也有不少这样的工具。

不同的人会有不同的习惯:

有的人习惯纯命令行
有的人习惯图形化工具

其实没有绝对的好坏,只是工作方式不同。

如果选择图形化方案,很多人会使用一体化远程工具。

例如像 DartShell 这样的工具,就是把常见远程协议整合在一起:

  • • SSH
  • • RDP
  • • VNC
  • • SFTP

服务器信息只需要保存一次,需要的时候直接连接即可。

对于经常管理服务器的人来说,这种方式通常会更加高效。

当然,这类工具也有很多选择,大家根据自己的习惯使用即可。


写在最后

很多开发者每天都在使用 SOCKS5 Proxy,例如:

  • • SSH 动态代理
  • • 跳板机访问内网
  • • 调试远程服务
  • • 内网 Git 仓库访问

但很多人只是照着教程在用,并没有真正理解它。

如果你经常需要管理服务器、远程调试或者访问内网资源,理解 SOCKS5 的使用方式,会非常有帮助。