有时候要在无外网的环境中去部署一个后台程序,并且做一些简单的测试,但是对应的服务器可能只开放了 22 端口等常用端口。

我在测试后台程序的时候,有时想连到服务器的数据库中看一下都很麻烦。然后我就想到可以用 ssh 转发来做。

ssh 转发可以分为远程转发和本地转发以及动态转发。

远程转发

远程转发就是把远程服务器的端口映射到本地,比如我想把服务器的 msyql 端口 3306 映射到本地 3306,那么可以这样:

ssh -NL 3306:127.0.0.1:3306 user@host

其中 N 表示不为这个连接分配 TTY,N 表示不打开远程 Shell,如果想要后台运行,可以加 -f 参数:

ssh -NLf 3306:127.0.0.1:3306 user@host

不过我一般习惯前台运行,这样方便 ctrl+c 关闭。

现在你就可以连接本地端口 3306 访问远程的数据库了,有了各种方法你甚至可以很方便地切换本地程序运行的数据库。

本地转发

本地转发是正好是远程转发反过来,把本地端口映射到远程。比如这样:

ssh -NL 2000:localhost:3000 user@host

上面就把远程的 2000 端口绑定到了本地 3000 端口,这样远程服务器在访问自身的 2000 端口时,实际上是在访问你的 3000 端口(虽然这个使用场景不太多)。

动态转发

映射端口号实在还是有点麻烦,有时候我只是想把远程服务器当个代理,甚至可以结合 proxychains4 做一些很好玩的事情。

比如我想把通过远程服务器转发数据,本地的 9095 端口当做一个数据的传输接口:

ssh -NfD 9095 user@host

然后在 proxychains.conf 中写上

socks5 	127.0.0.1 9050

接着就可以通过 proxychains4 让你的命令行流量走远程服务器转发:

proxychains4 wget www.google.com

同时也可以通过 switchyomega 设置让浏览器也能通过远程服务器传输数据,这里就不再多说了。