场景
为了数据安全,大多数据库不对外网开放,本地机器如果需要连接数据库,基本都是通过ssh通道的方式来连接。
基本原理是这样的:
你工作的电脑(客户端),是在一个外网环境下我们计作【A】好了;
数据库【比方说是mysql】所在的服务器在一个内网环境下(或者只有内网才能连接),我们计作【B】;
堡垒机和数据库在同一个内网,但可以通过外网访问,计作【C】;
我们通过Navicat或是datagrip等客户端访问数据库的时候
过程是这样的:
1、A会先通过ssh来连接C(一般是22端口);
2、A告诉C,让C来访问B,并把B的3306端口映射到A的某一个端口(默认随机也可以指定)上;
3、然后,客户端A就可以通过访问A自己的这个端口
间接访问B了;
但是,并不是所以的数据库客户端都可以来配置ssh的,比方说,我们要在A上部署个数据调度系统;
所以,我们要用一个服务来帮助我们把前两步的事情做了,然后我们只要做后一步就好了;
很简单
/usr/bin/ssh -N -L 0.0.0.0:[A的端口]:[B的ip]:[B的数据库端口] [C的用户名]@[C的外网ip] -i /root/.ssh/id_rsa
举个🌰
/usr/bin/ssh -N -L 0.0.0.0:3306:10.10.10.243:3306 user1@10.30.0.136 -i /root/.ssh/id_rsa
这样,直接连接A机器的IP和3306端口就可以了
但是这样会断掉
我们把它包装成一个后台服务吧
cd /usr/lib/systemd/system
vim db_ssh.service
编辑
Description=db_ssh
Requires=network.target
After=network.target
[Service]
Type=simple
#开始命令
ExecStart= /usr/bin/ssh -N -L 0.0.0.0:3306:10.10.10.243:3306 user1@10.30.0.136 -i /root/.ssh/id_rsa
#重启等待时间
# RestartSec=1s
#重启时机
Restart=on-failure
KillMode=process
User=root
Group=root
[Install]
WantedBy=multi-user.target
然后:
systemctl daemon-reload
systemctl start db_ssh.service
查看服务状态
systemctl start db_ssh.service
ps aux | grep ssh
看看进程里有没有你想看到的就好啦
祝好!