diff --git a/client+/neutrino-proxy-client-starter/pom.xml b/client+/neutrino-proxy-client-starter/pom.xml
index fcad790c..9c2a34ba 100644
--- a/client+/neutrino-proxy-client-starter/pom.xml
+++ b/client+/neutrino-proxy-client-starter/pom.xml
@@ -73,6 +73,18 @@
${mica-auto.vaersion}
provided
+
+
+ com.jcraft
+ jsch
+ 0.1.54
+
+
+ com.jcraft
+ jzlib
+ 1.1.3
+
+
diff --git a/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHConnectionFactory.java b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHConnectionFactory.java
new file mode 100644
index 00000000..1c3596b0
--- /dev/null
+++ b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHConnectionFactory.java
@@ -0,0 +1,5 @@
+package org.dromara.neutrinoproxy.client.starter.ssh;
+
+public class SSHConnectionFactory {
+ public static final SSHConnectionService factory = new SSHConnectionServiceImpl();
+}
diff --git a/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHConnectionService.java b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHConnectionService.java
new file mode 100644
index 00000000..fedf326c
--- /dev/null
+++ b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHConnectionService.java
@@ -0,0 +1,8 @@
+package org.dromara.neutrinoproxy.client.starter.ssh;
+
+public interface SSHConnectionService {
+ String addConnection(String host, String username, String password, int localPort, int remotePort,String remoteHost);
+ void openTunnel(String sshId);
+ void closeTunnel(String sshId);
+ void closeAllTunnels();
+}
\ No newline at end of file
diff --git a/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHConnectionServiceImpl.java b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHConnectionServiceImpl.java
new file mode 100644
index 00000000..0986221a
--- /dev/null
+++ b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHConnectionServiceImpl.java
@@ -0,0 +1,60 @@
+package org.dromara.neutrinoproxy.client.starter.ssh;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+public class SSHConnectionServiceImpl implements SSHConnectionService {
+
+ private Map connections;
+ private Map factories;
+
+ public SSHConnectionServiceImpl() {
+ connections = new HashMap<>();
+ factories = new HashMap<>();
+ }
+
+ @Override
+ public String addConnection(String host, String username, String password, int localPort, int remotePort,String remoteHost) {
+ SSHProxy connection = new SSHProxy();
+ String sshId = UUID.randomUUID().toString();
+ connection.setSshId(sshId);
+ connection.setHost(host);
+ connection.setUsername(username);
+ connection.setPassword(password);
+ connection.setLocalPort(localPort);
+ connection.setRemotePort(remotePort);
+ connection.setRemoteHost(remoteHost);
+ connections.put(connection.getSshId(), connection);
+ return sshId;
+ }
+
+ @Override
+ public void openTunnel(String sshId) {
+ SSHProxy connection = connections.get(sshId);
+ if (connection != null && !factories.containsKey(sshId)) {
+ SSHProxyFactory factory = new SSHProxyFactoryImpl(connection);
+ factory.openTunnel();
+ factories.put(sshId, factory);
+ }
+ }
+
+ @Override
+ public void closeTunnel(String sshId) {
+ SSHProxyFactory factory = factories.get(sshId);
+
+ if (factory != null) {
+ factory.closeTunnel();
+ factories.remove(sshId);
+ }
+ }
+
+ @Override
+ public void closeAllTunnels() {
+ for (Map.Entry entry : factories.entrySet()) {
+ SSHProxyFactory factory = entry.getValue();
+ factory.closeTunnel();
+ }
+ factories.clear();
+ }
+}
\ No newline at end of file
diff --git a/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHProxy.java b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHProxy.java
new file mode 100644
index 00000000..903efc4e
--- /dev/null
+++ b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHProxy.java
@@ -0,0 +1,23 @@
+package org.dromara.neutrinoproxy.client.starter.ssh;
+
+import lombok.Data;
+
+@Data
+public class SSHProxy {
+ private String sshId;
+
+ //跳板机服务器公网IP
+ private String host;
+ //跳板机服务器登录名
+ private String username;
+ //跳板机登陆密码
+ private String password;
+ //本地的端口
+ private int localPort;
+
+ //需代理服务器端口号
+ private int remotePort;
+ //需代理服务器ip
+ private String remoteHost;
+
+}
\ No newline at end of file
diff --git a/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHProxyFactory.java b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHProxyFactory.java
new file mode 100644
index 00000000..9ecb65ee
--- /dev/null
+++ b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHProxyFactory.java
@@ -0,0 +1,6 @@
+package org.dromara.neutrinoproxy.client.starter.ssh;
+
+public interface SSHProxyFactory {
+ void openTunnel();
+ void closeTunnel();
+}
\ No newline at end of file
diff --git a/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHProxyFactoryImpl.java b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHProxyFactoryImpl.java
new file mode 100644
index 00000000..a6520e7b
--- /dev/null
+++ b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHProxyFactoryImpl.java
@@ -0,0 +1,59 @@
+package org.dromara.neutrinoproxy.client.starter.ssh;
+
+import com.jcraft.jsch.JSch;
+import com.jcraft.jsch.Session;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class SSHProxyFactoryImpl implements SSHProxyFactory {
+ private SSHProxy connection;
+ private Session session;
+
+ public SSHProxyFactoryImpl(SSHProxy connection) {
+ this.connection = connection;
+ }
+
+ @Override
+ public void openTunnel() {
+ try {
+ JSch jsch = new JSch();
+ session = jsch.getSession(connection.getUsername(), connection.getHost(), 22);
+ session.setPassword(connection.getPassword());
+ // 开启调试模式,打印更多详细日志
+ java.util.Properties config = new java.util.Properties();
+ config.put("StrictHostKeyChecking", "no");
+ config.put("userauth.gssapi-with-mic", "no");
+ config.put("compression.s2c", "zlib@openssh.com,zlib,none");
+ config.put("compression.c2s", "zlib@openssh.com,zlib,none");
+ session.setConfig(config);
+ session.setDaemonThread(true);
+ JSch.setLogger(new com.jcraft.jsch.Logger() {
+ public boolean isEnabled(int level) {
+ return true;
+ }
+ public void log(int level, String message) {
+ log.info("JSch - " + level + ": " + message);
+ }
+ });
+
+ int assignedPort = session.setPortForwardingL(connection.getLocalPort(), connection.getRemoteHost(), connection.getRemotePort());
+ session.connect(10000);
+ if (assignedPort != -1) {
+ log.info("SSH connection established successfully!");
+ } else {
+ log.info("Failed to establish SSH connection!");
+ }
+ } catch (Exception e) {
+ // 异常处理
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void closeTunnel() {
+ if (session != null && session.isConnected()) {
+ session.disconnect();
+ log.info("SSH connection closed successfully!");
+ }
+ }
+}
\ No newline at end of file
diff --git a/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/Test.java b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/Test.java
new file mode 100644
index 00000000..46807f5f
--- /dev/null
+++ b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/Test.java
@@ -0,0 +1,18 @@
+package org.dromara.neutrinoproxy.client.starter.ssh;
+
+public class Test {
+ public static void main(String[] args) {
+
+ // 添加SSH连接
+ String sshId = SSHConnectionFactory.factory.addConnection("194.36.209.398", "root", "xxxxxx", 1234, 6379,"xx.xx.xx.xx");
+ SSHConnectionFactory.factory.openTunnel(sshId);
+ try {
+ Thread.sleep(100000000);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ // 关闭SSH隧道
+ SSHConnectionFactory.factory.closeTunnel(sshId);
+
+ }
+}