starter内添加了SSH中转隧道的实现

This commit is contained in:
xgc
2024-01-24 12:34:18 +08:00
parent f525c45f8c
commit c5d0763172
8 changed files with 191 additions and 0 deletions
@@ -73,6 +73,18 @@
<version>${mica-auto.vaersion}</version>
<scope>provided</scope>
</dependency>
<!--SSH中转隧道-->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependency>
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jzlib</artifactId>
<version>1.1.3</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
@@ -0,0 +1,5 @@
package org.dromara.neutrinoproxy.client.starter.ssh;
public class SSHConnectionFactory {
public static final SSHConnectionService factory = new SSHConnectionServiceImpl();
}
@@ -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();
}
@@ -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<String, SSHProxy> connections;
private Map<String, SSHProxyFactory> 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<String, SSHProxyFactory> entry : factories.entrySet()) {
SSHProxyFactory factory = entry.getValue();
factory.closeTunnel();
}
factories.clear();
}
}
@@ -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;
}
@@ -0,0 +1,6 @@
package org.dromara.neutrinoproxy.client.starter.ssh;
public interface SSHProxyFactory {
void openTunnel();
void closeTunnel();
}
@@ -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", "[email protected],zlib,none");
config.put("compression.c2s", "[email protected],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!");
}
}
}
@@ -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);
}
}