背景

最近因为一个离奇的bug,不得不重装系统了,这就导致原来所有信任的证书 全部都要再弄一遍了。

这次打算更轻量些,一些依赖的服务不再本地或者我虚拟机里的PaaS平台了,会直接部署到国内的云平台上。

但是坏处么,自然也是非常严重的。

端口不能随便开放,像MySQL(3306),Redis(6379)这样的服务,很容易会被攻破密码,然后造成主机被入侵。

但是我本地又要用到这些,怎么做一个清凉又安全的链接呢?

下面我会分为两个部分来解决这些问题。

SSH-Agent

由于 .ssh这个目录是隐藏的,如果不设置 macOS 是无法通过程序打开的窗口选择这些key的,但是一些SSH工具都会支持 SSH-Agent 登陆。

这样的方式不仅设置更少了,连接的时候也会更轻松,SSH-Agent 会自动尝试对应的Key。

command:

ssh-add id_ed25519

在进行SSH连接的时候可以不用-i id_ed25519了。

// 图片已丢失

tabby

SSH-Tunnel

这个我查了很多资料 发现大多数国人讲的一塌糊涂。

SSH-Tunnel 是 通过SSH链接打开的一个隧道,隧道可以让一个端口通向另外一个端口。

正向代理

我要访通过隧道访问一个端口

先拿最简单的一个例子来理解

ssh -L 8080:google.com:80 ubuntu@server

这行命令的意思是 我打开了一个隧道,本地端口 8080 指向到 Google 的 80 端口(透过 server)。

那么现在访问 8080,你可以访问到 Google的主页了。

那么

我想要通过 server 来访问 server 上的端口 怎么办?

场景是这样的:我在 server 上 开了个MySQL服务 占用 3306 端口,但是我在防火墙上不允许 外部IP 访问 3306,但是我只想自己链接上去。

可以透过隧道这么做

ssh -L 3306:127.0.0.1:3306 ubuntu@server

这行命令 你可能会看到那个 127.0.0.1:3306 很疑惑,我不是要建立的远程隧道么,为什么要写本地端口?

-L 的参数分为两个部分, 冒号前 是本地 Client 的本地端口,冒号后 是通过 server 本地来访问的端口。

那么要访问server本地的MySQL,自然就是本地环路地址了。

反向代理

我要过隧道让远程主机访问我提供的服务

ssh -R 8080:127.0.0.1:8080 ubuntu@server

明白 正向代理后 ,反向代理是一样的,只是方向改变了。

命令行创建太麻烦?

我试过几个工具 但最后还是觉得 VSCode 是最舒服的。

在 VSCode 上 安装 Remote-SSH 即可。(上述SSH-Agent设置好后 只需要 用户名和主机即可链接,非常方便。)

vs code ports