背景
最近因为一个离奇的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
了。
// 图片已丢失
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设置好后 只需要 用户名和主机即可链接,非常方便。)