在springboot中通过ssh连接远程服务器的mysql和redis

需知:

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. 原理

188f28955a58409eaf431350383f11ca.png

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

 

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值