Skip to content

堡垒机ssh通道常驻【现网连数据库】

Published: at 08:00

场景

为了数据安全,大多数据库不对外网开放,本地机器如果需要连接数据库,基本都是通过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

看看进程里有没有你想看到的就好啦

祝好!