需知:
1. 首先我用的是阿里云的linux服务器, 千万别在阿里云的安全组里开放 3306和6379端口 , 非常容易被黑客爆破 , 安全组只开方22端口用于 ssh连接就行了
2.借鉴了别人的springboot连接远程服务器的mysql的方法, 由于我没搜到 怎么ssh连接redis, 于是自己试了试, 发现 多写一个 session就能同时ssh连接mysql和redis , 于是才有了这篇博客
3. 博客的起因是因为 , 在阿里云的数据库被人黑了 , 勒索我 比特币, 问了一些大佬才知道 , 不能在阿里云的安全组里开放端口 , 于是让我用 ssh连接 , 就是 使用 公钥和私钥 进行连接 , 需要去阿里云的实例控制台中 , 把秘钥对 创建好 , 然后下载到自己的win机里 , 才能进入以下步骤
4. 捣鼓这个云服务器真的折腾, 没人教,全部靠自己搜, 网上文章水平参差不齐, 很难找到有用的文章. 我一开始买这个阿里云服务器就是为了不让笔记本内存占用率过高 , 之前服务开满,直接内存暴了, 吓到我了. 然后网上搜了怎么在springboot里连接远程mysql和redis , 清一色的全是让我开放阿里云安全组端口 , 于是开了没几天就被爆破了 , 这次也学到了很多 , 最根本的原因还是安全意识薄弱 , 使用了弱口令(数据库密码太简单) , 而且对外开放3306端口, 别人真的轻轻松松爆破你数据库, 这次我禁用端口,改了密码 , 应该就没问题了
下面是具体操作步骤 , 有问题可以留言 , 这些代码我在 黑马点评里已经全部push好了, 测试完全没问题, 前提就是 1. 依赖 2. 秘钥文件(需要去阿里云创建秘钥对) 3. known_hosts文件(win系统自带) 4.修改my.cnf的端口 5.尽量用复杂密码
1. 依赖
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
2. 配置类
package com.hmdp.config;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import java.util.Properties;
public class SshConfiguration {
//本地的ssh中的knownhost文件路径
private String SSH_PATH_FILE_KNOWN_HOSTS = "C:\\Users\\你的用户名\\.ssh\\known_hosts";//就是win机的,一般不会变
//本地的ssh密钥路径
private String SSH_PATH_FILE_PRIVATE_KEY = "D:\\SoftWare\\秘钥文件名.pem";//就是你放秘钥的位置
//ssh连接的用户名
private String SSH_USER = "root";
//ssh远程连接的ip地址
private String SSH_REMOTE_SERVER = "你的服务器ip";//服务器ip
//ssh连接的端口号,一般默认为22
private Integer SSH_REMOTE_PORT = 22;
//SSH使用密码
//private String sshPassword;
//本地mysql发起连接的IP地址
private String MYSQL_REMOTE_SERVER = "127.0.0.1";//本机就行
//本地数据库连接时用的端口号(不能填3306)
private Integer LOCAl_PORT1 = 3670;//本机虚拟mysql端口(并不是本机的mysql
//远程数据库端口用的端口号
private Integer REMOTE_PORT1 = 3876;//转发到服务器的端口(需要去服务器的vim /etc/my.cnf那里改端口 port=3876
//本地redis发起连接的IP地址
private String REDIS_REMOTE_SERVER = "127.0.0.1";
//本地数据库连接时用的端口号
private Integer LOCAl_PORT2 = 6979;//redis , 本地虚拟redis访问端口 (并不是本机的redis,这是用于ssh的端口转发
//远程数据库端口用的端口号
private Integer REMOTE_PORT2 = 6379;//redis , 服务器的redis端口 懒得改了,就用6379得了
//com.jcraft.jsch.Session;
private Session session1;//mysql
private Session session2;//redis
/**
* 关闭ssh连接
*/
public void closeSSH1() {
session1.disconnect();
}
public void closeSSH2() {
session2.disconnect();
}
/**
* 创建ssh连接
*/
public void createSSH() throws JSchException {
JSch jSch = new JSch();
//下面这两个设置是在公钥模式需要设置的,非公钥模式不需要进行设置
//设置known_hosts文件路径,如:~/.ssh/known_hosts(known_hosts中存储是已认证的远程主机host key)
jSch.setKnownHosts(SSH_PATH_FILE_KNOWN_HOSTS);
//设置私钥
jSch.addIdentity(SSH_PATH_FILE_PRIVATE_KEY);
session1 = jSch.getSession(SSH_USER, SSH_REMOTE_SERVER, SSH_REMOTE_PORT);//mysql
session2 = jSch.getSession(SSH_USER, SSH_REMOTE_SERVER, SSH_REMOTE_PORT);//redis
//如果是密码模式需要设置密码
//session.setPassword(sshPassword);
//设置连接过程不校验known_hosts文件中的信息
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session1.setConfig(config);
session2.setConfig(config);
//ssh 建立连接!
session1.connect();//mysql
session2.connect();//redis
//根据安全策略,您必须通过转发端口进行连接
session1.setPortForwardingL(LOCAl_PORT1, MYSQL_REMOTE_SERVER, REMOTE_PORT1);//localhost:3670->服务器ip:3876
session2.setPortForwardingL(LOCAl_PORT2, REDIS_REMOTE_SERVER, REMOTE_PORT2);//localhost:6389->服务器ip:6379
}
}
3. 监听器 (必须要)
package com.hmdp.config;
import org.springframework.stereotype.Component;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@Component//尽量加上这个
@WebListener//声明为监听器
public class SshListener implements ServletContextListener {
private SshConfiguration sshConnectionConfig;
public SshListener() {
super();
}
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("SSH连接 initialized ... !");
try {
sshConnectionConfig = new SshConfiguration();
sshConnectionConfig.createSSH();
} catch (Throwable e) {
e.printStackTrace(); // 连接失败
}
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("SSH连接 destroyed ... !");
sshConnectionConfig.closeSSH1();//断开ssh连接
sshConnectionConfig.closeSSH2();//断开ssh连接
}
}
4. yaml
spring:
application:
name: hmdp
datasource:
url: jdbc:mysql://localhost:3670/数据库名?autoReconnect=true&useUnicode=true&useSSL=false
#上面的localhost就是本机ip:本机端口,因为ssh有端口转发,直接访问本地就行了
username: root
password: 密码
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
host: 127.0.0.1
port: 6979 #本地端口
password: 密码
lettuce:
pool:
max-active: 10
max-idle: 10
min-idle: 1
time-between-eviction-runs: 10s
5. 在你的redis 配置类里改好 ip:port
@Configuration
public class RedissonConfig {
/** 配置一下 Redisson , 注册到容器 , 我们就可以使用配置好的 锁对象
*
* @return
*/
@Bean
public RedissonClient redissonClient(){
//配置
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6979").setPassword("密码尽量复杂,需要在redis中同步修改redis.conf文件的密码");
//创建Redisson对象
return Redisson.create(config);
}
}
6. 原理

ssh client 我们用的是 localhost 3670
db server 我们用的是 3876端口
**注意:**数据库连接地址由原来的 服务器ip:3876 改为 本机127.0.0.1:3670,这样子,ssh连接会为每一个127.0.0.1:3670上的操作转发到服务区ip:3876上去,便可以正常操作数据库了。ssh连接的创建,可以采用私钥的方式(本文就是),亦可以采用用户名密码的方式。
————————————————
版权声明:本文为CSDN博主「爱学习的大雄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_49137582/article/details/129335722
4万+

被折叠的 条评论
为什么被折叠?



