远程查看数据库的方法

远程查看数据库的方法

项目部署在独立的内网中。内网可以连通Internet,但是经过了nat和防火墙。一般对方会提供一台内网主机(192.168.1.2)供远程连接。

现在想要查看这个内网中数据库的数据。

方法一:在远程连接到的主机(192.168.1.2)上查看

通过远程连接工具(向日葵、dodesk、teamviewer等)可以远程操作这台电脑。然后在这台电脑上访问内网上的服务器、数据库等。

如果要在这台内网主机上访问数据库,还需要在这台主机上安装数据库客户端。

方法二:内网穿透加端口映射

第一次远程连接内网主机(192.168.1.2)时,运行脚本和程序: 1.内网主机(192.168.1.5)数据库端口3306映射到当前主机(192.168.1.2)端口13306, 2.内网主机(192.168.1.2)打开防火墙对端口13306的入站限制。 3.下载和配置内网穿透工具frp客户端,将内网主机(192.168.1.2)端口13306,映射为公网vps的x.x.x.x:13306. 同时vps上也要配置frp服务端。

然后我们直接就可以在公网(本机)上访问x.x.x.x:13306访问内网数据库了。

下面实现了一下 方法二

Windows内网主机端口映射以及防火墙开放端口

这里主要实现一下在windows中添加端口映射,以及为相应的端口打开防火墙。我把这个过程写成一个bat脚本,以管理员权限运行一下即可。注释挺多的,其实涉及的命令没几条。

rem @echo off
rem ******************************************************************************************
rem 场景:
rem 远程/外网可以访问到本机(teamviewer、向日葵、doDesk等远程连接,或者frp、ngrok、花生壳等内网穿透)
rem 远程/外网想要通过本机访问本地网络上的数据库或其他端口
rem *******************************************************************************************
rem 分析:
rem 若外网主机可以访问到本机,想通过本机访问局域网其他主机上的端口,一般有两种方法:
rem 1.在本机上安装数据库客户端,外网主机和本机的客户端交互
rem 2.通过端口映射,将局域网其他主机端口映射到本机端口。
rem *******************************************************************************************
rem 功能:
rem 在本机上添加:到局域网特定主机端口的映射(数据转发/端口转发)
rem *******************************************************************************************

rem 变量设置:
rem 参考:https://blog.csdn.net/chuangxin/article/details/104100725
setlocal
rem 本地监听端口
set LISTENPORT=13306

rem 映射到的主机IP
set CONNECTADDR=192.168.1.21

rem 映射到的主机端口
set CONNECTPORT=3306

rem -----------------------------------------------------------------------------

rem 跳转到此批处理所在目录
cd /d %~dp0

rem -----------------------------------------------------------------------------

rem 使用netsh工具,必须电脑上安装ipv6
rem xp需要这一步骤
netsh interface ipv6 install

rem 设置端口映射
rem 参考:https://segmentfault.com/a/1190000037584182
rem listenaddress:监听地址,0.0.0.0表示监听所有地址,建议用0.0.0.0,也可以填本机的本地ip地址,也可以省略不填
rem listenport:监听端口,指的是本地的端口
rem connectaddress:需要代理的ip
rem connectport:需要转发的端口
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=%LISTENPORT% connectaddress=%CONNECTADDR% connectport=%CONNECTPORT%


rem 列出当前所有端口转发规则
netsh interface portproxy show all

rem -----------------------------------------------------------------------------

rem 设置防火墙
rem 允许13306端口的TCP入站(下面的操作等同于在windows defender 防火墙中手动添加入站规则)
netsh advfirewall firewall add rule name="allowPort%LISTENPORT%In" dir=in action=allow protocol=TCP localport=%LISTENPORT%
rem 允许13306端口的TCP出站
netsh advfirewall firewall add rule name="allowPort%LISTENPORT%Out" dir=out action=allow protocol=TCP localport=%LISTENPORT%

rem 列出防火墙转发规则
netsh advfirewall firewall show rule name="allowPort%LISTENPORT%In"
netsh advfirewall firewall show rule name="allowPort%LISTENPORT%Out"

rem -----------------------------------------------------------------------------

pause

对应的写了一个删除内网主机端口映射,以及删除防火墙相应端口配置的windows的bat脚本。配一下端口,以管理员权限执行脚本就可以删除端口映射与删除添加的防火墙规则。

rem @echo off 
rem *******************************************************************************************
rem 功能:
rem 在本机上移除:到局域网特定主机端口的映射(数据转发/端口转发)
rem 需要以管理员身份运行
rem *******************************************************************************************

rem 变量设置:
rem 参考:https://blog.csdn.net/chuangxin/article/details/104100725
setlocal
rem 本地监听端口
set LISTENPORT=13306

rem -----------------------------------------------------------------------------

rem 跳转到此批处理所在目录
cd /d %~dp0

rem -----------------------------------------------------------------------------
rem 移除端口映射
rem 参考:https://segmentfault.com/a/1190000037584182
rem listenaddress:监听地址,0.0.0.0表示监听所有地址,建议用0.0.0.0,也可以填本机的本地ip地址
rem listenport:监听端口,指的是本地的端口
rem connectaddress:需要代理的ip
rem connectport:需要转发的端口
netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=%LISTENPORT%
netsh interface portproxy delete v4tov4 listenaddress=* listenport=%LISTENPORT%

rem 或者清空端口映射列表
rem netsh interface portproxy reset

rem 列出当前所有端口转发规则
netsh interface portproxy show all

rem -----------------------------------------------------------------------------

rem 设置防火墙
rem 参考:http://www.voidcn.com/article/p-gtkxnxtm-bqm.html
rem 参考:https://blog.csdn.net/mystudyblog0507/article/details/79617629

rem 删除13306端口的TCP入站(下面的操作等同于在windows defender 防火墙中手动删除入站规则)

netsh advfirewall firewall delete rule name="allowPort%LISTENPORT%In"
rem 删除13306端口的TCP出站
netsh advfirewall firewall delete rule name="allowPort%LISTENPORT%Out"

rem 列出防火墙转发规则
netsh advfirewall firewall show rule name="allowPort%LISTENPORT%In"
netsh advfirewall firewall show rule name="allowPort%LISTENPORT%Out"

rem -----------------------------------------------------------------------------

pause

内网穿透

内网穿透用花生壳、ngrok、frp等都可以做,这里使用frp。

找一台vps,一般阿里云、腾讯云的学生机配置就够了。

vps上安装frp

vps选用的是centos7系统,其他Linux系统也类似。arch 命令查看vps是x86_64架构。

#github 上找合适的版本,下载
wget https://github.com/fatedier/frp/releases/download/v0.36.2/frp_0.36.2_linux_amd64.tar.gz
#解包解压缩
tar -zxvf frp_0.36.2_linux_amd64.tar.gz
#丢到/usr/local下
mv ./frp_0.36.2_linux_amd64 /usr/local
#去对应目录下操作
cd /usr/local/frp_0.36.2_linux_amd64

#vps是作为内网穿透服务器,本目录下的frpc*是客户端的程序和配置,不用可以删除

#编辑内网穿透服务器配置,其实默认的配置就可以了
vim ./frps.ini

其实默认的配置就可以了,也可以像下面一样,添加dashboard管理端口,方便查看已穿透的端口。

[common]
bind_port = 7000
dashboard_port = 7500
# dashboard's username and password are both optional,if not set, default is admin.
dashboard_user = xxxx
dashboard_pwd = xxxxxxx

运行frp服务端

############################################
#测试一下能否启动
./frps -c ./frps.ini
#按ctrl+c从shell退出

############################################

#可以使用nohup脱离shell控制,退出shell不会杀进程
#可以使用 & 退到后台
nohup ./frps -c ./frps.ini
#可以通过ps命令查看进程号
#ps -aux| grep frps
#kill -15 pidxxx

############################################

#可以配置为linux服务(centos6和7方式不同)
#这里是centos7的服务配置

#当前路径/usr/local/frp_0.36.2_linux_amd64/

#查看frps.service配置
cat ./systemd/frps.service

#软链接配置文件到/etc/frp下
mkdir /etc/frp
ln -s /usr/local/frp_0.36.2_linux_amd64/frps.ini /etc/frp/frps.ini

#软链接程序命令到/usr/bin下
ln -s /usr/local/frp_0.36.2_linux_amd64/frps /usr/bin/frps

#软链接service配置到/lib/systemd/system下
ln -s /usr/local/frp_0.36.2_linux_amd64/systemd/frps.service /lib/systemd/system/frps.service
ln -s /usr/local/frp_0.36.2_linux_amd64/systemd/frps@.service /lib/systemd/system/frps@.service

#设置服务为开机启动
systemctl enable frps.service
#立即启动服务
systemctl start frps.service
#查看服务状态
systemctl status frps.service

退出shell,重新进入,ps -aux | grep frp验证进程还在。

内网主机安装frp

一般会提供一台windows主机作为内网主机,供我们远程连接使用。

一样的操作,先下载合适的windows版本:https://github.com/fatedier/frp/releases,

解压到合适的目录,打开此目录。

本地主机作为frp客户端,该目录下frps*是服务器端的程序和配置,可以删除。

编辑frpc.ini

#编辑frpc.ini
[common]
server_addr = 121.5.151.29
server_port = 7000

#[ssh]
#type = tcp
#local_ip = 127.0.0.1
#local_port = 22
#remote_port = 6000

#windows远程桌面端口的内网穿透
[win13389]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 13389

#内网上的数据库已映射为本机13306端口,配置13306端口的内网穿透
[win13306]
type = tcp
local_ip = 127.0.0.1
local_port = 13306
remote_port = 13307

在此目录shift+右键,打开powershell

#运行frp客户端做内网穿透
.\frpc.exe -c .\frpc.ini

还可以将frpc设为windows系统服务,开机自动启动

本来想使用sc create命令直接添加系统服务的,但是这条命令对作为服务的exe也有要求,直接添加总是超时报错:错误1053:服务没有及时相应启动或控制请求。

后来找了开源工具winsw,用工具在命令行添加windows服务。

去github下载合适的版本:https://github.com/winsw/winsw/releases

将winsw复制到frp目录,重命名为winsw.exe,并新建一个winsw.xml的配置文件,如下:

<service>
  <!-- 配置参考:https://github.com/winsw/winsw -->
  <!-- 配置参考:http://www.dngz.net/windows-frptoservice.htm -->
  
  <!-- ID of the service. It should be unique across the Windows system-->
  <id>frp</id>
  <!-- Display name of the service -->
  <name>frp</name>
  <!-- Service description -->
  <description>fast reverse proxy,这里是用于做内网穿透,外网访问内网主机</description>
  
  <!-- Path to the executable, which should be started -->
  <executable>%BASE%\frpc.exe</executable>
  <arguments>-c %BASE%\frpc.ini</arguments>

  <onfailure action="restart" delay="60 sec"/>
  <onfailure action="restart" delay="120 sec"/>
  <logmode>reset</logmode>
</service>

将frp安装为服务,并启动:

以管理员权限打开一个命令窗口,cd到frp所在目录,执行:

#安装服务(默认服务启动类型:自动)
winsw install
#启动服务
winsw start

如果要卸载服务,(管理员)执行命令:

#先停止服务(也可以去windows服务界面去停止)
winsw stop
#卸载服务
winsw uninstall