本地穿透

吴书松
吴书松
发布于 2025-05-06 / 8 阅读
0

本地穿透

本地穿透

本地电脑,通过跳板机,访问跳板机内部的机器

如:

    1、跳板机:192.168.1.242
    2、跳板机能访问的机器:192.168.1.111 端口23500
    3、本地IP 192.168.1.233 但是本地无法访问192.168.1.111

这个时候,可以通过在本地部署穿透,实现本地直接访问目标服务器

1、下载穿透服务并解压

阿里云盘:work/study/my-ssh

代码:https://gitee.com/wushusong/wss-server.git

2、修改配置:resource/application.yml

3、启动

运行环境:jdk8

4、测试

5、注意,如果是win服务器做跳板机,需要开启open-ssh服务

注意配置端口账号密码等

sshd_config

6、多层穿透

package com.wss.wssssh.utils;

import cn.hutool.extra.ssh.JschUtil;
import com.jcraft.jsch.Session;
import com.wss.wssssh.config.SshService;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class SshUtils {

    /**
     * 多层代理
     * @param args
     */
    public static void main(String[] args) {
        //场景:本地,访问跳板机192.168.1.111 内部机器192.168.1.112 的内部机器192.168.1.40
        //由于192.168.1.40 是 192.168.1.112 内部的机器, 并且 192.168.1.112 是192.168.1.111内部的机器,所以 需要两层代理

        //代理1:访问跳板机192.168.1.111内部机器192.168.1.112
        //本地通过跳板机192.168.1.111 访问跳板机内部机器 192.168.1.112 的22 端口,本地IP:127.0.0.1 端口:10001

        //代理2:访问跳板机192.168.1.112内部机器192.168.1.40
        //这里跳板机192.168.1.112 通过代理1 可以通过访问本地地址127.0.0.1:10001 端口直接访问
        //所以通过本地地址127.0.0.1:10001(也就是代理1的实际地址:192.168.1.112:22) 代理到192.168.1.40:8848 本地的ip:192.168.1.239 端口:10002

        //注意,多层穿透中,本地IP和端口,要不一样,这里使用了127.0.0.1作为代理1的本地IP,192.168.1.239作为代理2的本地IP
        
        boolean start1 = start("192.168.1.111", 22, "root", "123456"
                , "192.168.1.112", 22, "127.0.0.1", 10001
        );
        if(start1){
            log.info("服务1 启动成功");

            boolean start2 = start("127.0.0.1", 12345, "root", "123456"
                    , "192.168.1.40", 8848, "192.168.1.239", 10002
            );

            if(start2){
                log.info("服务2 启动成功");
            }else{
                log.info("服务2 启动失败");
            }
        }
        System.out.println(start1);
    }

    /**
     * 启动SSH服务
     * 配置跳板机SSH
     * @param sshHost ssh ip
     * @param sshPort ssh port
     * @param sshUser ssh user
     * @param sshPass ssh pass
     * 配置内网转发
     * @param remoteHost 远程内网IP
     * @param remotePort 远程内网端口
     * @param localHost 本地访问IP
     * @param localPort 本地访问端口
     */
    public static boolean start(String sshHost,int sshPort,String sshUser,String sshPass,
                                String remoteHost,int remotePort,
                                String localHost,int localPort

    ) {
        /**
         * 配置跳板机SSH
         * 参数1:ssh ip
         * 参数2:ssh 端口
         * 参数3:ssh 用户名
         * 参数4:ssh 密码
         */
        Session session = JschUtil.getSession(sshHost, sshPort, sshUser, sshPass);
        /**
         * 配置内网转发
         * 参数1:session
         * 参数2:远程内网IP
         * 参数3:本地访问IP
         * 参数4:远程内网端口
         * 参数5:本地访问端口
         */
        return SshService.bindPort(session, remoteHost, localHost, remotePort, localPort);
    }


}