在本地数据库工具里安全地连接自己的云服务器

64 阅读5分钟

一次端口转发练习,记录一下全流程,方便下次照抄。

场景

本地电脑是一个有时候用网线但更多时候用WiFi的笔记本电脑,因此IP会经常变动,无法在云服务器上配置一个指定方向的入站规则,需要定期自动更新本机IP到云服务器的安全组中,并在更新后执行端口转发,以实现对服务器内MySQL数据库的操作。

远程服务器

本次练习使用的是阿里云ECS服务器,且刚需下载阿里云客户端(文档与下载入口:阿里云客户端的优势和功能配置指引_云服务器 ECS(ECS)-阿里云帮助中心),其他云服务器可能也有类似工具,没用过就不写了。

服务器安全组配置

服务器实例创建时会自带一些出入站规则配置,其中入站规则除了一堆2018年的规则外,均建议删除,稍后的端口转发脚本里会有自动新增本机公网IP到安全组中的操作,这也就是为什么前面会说“刚需下载阿里云客户端”,因为脚本里的命令必须下载客户端后才能使用。

RAM用户与AccessKey配置

服务器本身是练习用的,也许不需要弄不同的用户去增加麻烦,但既然是练习了,那肯定是能瞅一遍的都试试,遂进入RAM管理控制台,新增RAM用户。

用户创建后需要在其信息页创建AccessKey,这是后续用来连接本地与云服务器的关键信息。

这个练习场景如果去掉【WiFi环境下IP变动】则完全不需要AccessKey这一步,因为那样的话,直接在控制台新增一个固定方向为本机IP的规则即可,就不需要下面一堆只是为了自动更新IP的操作了。

image.png

image.png

image.png

image.png

image.png

执行配置时一般会跳个安全验证出来,手机验证码与人脸验证任选其一即可。验证通过后就会是下面的进度日志。

image.png

然后进入控制台左侧的用户列表,进入刚刚创建好的用户信息页,下拉找到“创建AccessKey”,点击它。

image.png

创建的AccessKey类型选择【本地开发环境】即可。

image.png

这一步同样会要求二选一的验证,验证通过后,就会给你发AccessKey了。

image.png

到这里,在云服务器控制台上的操作就告一段落了。

本地端口转发配置

首先找一个中意的位置,保存以下脚本(bat格式),保存后别着急执行,里面有不少配置需要改成你自己的云服务器。

@echo off
chcp 65001 >nul
setlocal

:: 智能等待网络就绪
echo 等待网络连接就绪...
:CHECK_NETWORK
powershell -Command "try { (Invoke-RestMethod -Uri 'http://checkip.amazonaws.com' -TimeoutSec 5).Trim(); exit 0 } catch { exit 1 }" >nul 2>&1
if errorlevel 1 (
    echo 网络未就绪,10秒后重试...
    timeout /t 10 /nobreak >nul
    goto CHECK_NETWORK
)

echo 网络已就绪,继续执行...
echo [%date% %time%] 网络就绪,开始更新 >> D:\任意位置\ip_update.log


set SECURITY_GROUP_ID=云服务器的安全组编号
set REGION=云服务器所在区,即阿里云服务器创建时选的华南深圳啥的,不过要填的是英文

echo 阿里云安全组IP更新
echo.

echo 获取当前IP...
for /f "delims=" %%i in ('powershell -Command "(Invoke-RestMethod -Uri 'http://checkip.amazonaws.com').Trim()"') do set CURRENT_IP=%%i
set CURRENT_CIDR=%CURRENT_IP%/32
echo 你的IP: %CURRENT_CIDR%

echo 更新安全组规则...
aliyun ecs AuthorizeSecurityGroup --RegionId %REGION% --SecurityGroupId %SECURITY_GROUP_ID% --IpProtocol tcp --PortRange 22/22 --SourceCidrIp "%CURRENT_CIDR%" --Description "MyHomeIP"

if %errorlevel% equ 0 (
    echo 更新成功!
) else (
    echo 更新失败!
)

echo 正在建立SSH隧道(后台运行)...
start /B "" ssh -i C:\Users\windows\.ssh\id_rsa -L 3307:127.0.0.1:3306 云服务器用户名@云服务器IP地址 -N -o ConnectTimeout=30 -o ServerAliveInterval=60

echo SSH隧道已在后台启动,脚本退出

这个脚本涵盖了几个要点:

  1. 检查当前网络是否通畅,更新云服务器的安全组规则需要在联网状态下使用,如果机器未联网,后续操作便无法实现。
  2. checkip.amazonaws.com 获取当前网络的公网IP,调用阿里云API更新安全组规则
  3. 建立端口转发的ssh隧道,并且用的是类似Linux系统中nohupstart /B开启子进程的方式。

在执行这个脚本前,需要手动配置一下本地的AccessKey:aliyun configure set --access-key-id 新的AccessKeyID --access-key-secret 新的AccessKeySecret --region 云服务器地区 这一步也可以在cmd里简单输入aliyun configure后直接执行,等控制台提示你要输入什么,你再去复制粘贴。

然后,再执行sh-keygen -t rsa -b 4096 -f C:\任意路径\id_rsa -N "",这会在-f 参数指定的路径下生成id_rsa.pub文件,这文件需要拷贝到服务器/root/.ssh/authorized_keys文件里,并配置.ssh文件夹700权限,authorized_keys文件600权限。

端口转发是为了本地能够访问服务器的3306端口,为了不影响本地的3306,这里使用的本地端口是3307,在执行前面的脚本前,需要手动运行一次ssh -i C:\前面设定的路径\id_rsa -L 3307:127.0.0.1:3306 云服务器用户@云服务器IP -N -o ConnectTimeout=30 -o ServerAliveInterval=60

之后,即可直接执行前面的bat脚本。

这个脚本可以配置到【计划任务】里,设置其开机自启动,之后每次开电脑就能解放双手了!