Java:SSH 隧道 - 将本地 SOCKS 设置为侦听器

Posted

技术标签:

【中文标题】Java:SSH 隧道 - 将本地 SOCKS 设置为侦听器【英文标题】:Java: SSH tunneling - set local SOCKS as the listener 【发布时间】:2014-07-07 17:05:34 【问题描述】:

我要做的是设置一个 SOCKS 服务器,然后将其端口添加为 SSH 隧道连接中的本地侦听端口。我想要实现的是动态端口转发(ssh 中的 -D 选项,如果我没记错的话)。我正在使用 JSch 进行 SSH 隧道。这是我到目前为止的代码(复制自http://kahimyang.info/kauswagan/code-blogs/1337/ssh-tunneling-with-java-a-database-connection-example):

int assigned_port;   
int local_port=<local listening port goes here>;

// Remote host and port
int remote_port=<remote port goes here>;
String remote_host = "<SSH host goes here>";
String login = "<SSH login goes here>";
String password = "<SSH password goes here>";

try 
    JSch jsch = new JSch(); 

    // Create SSH session.  Port 22 is your SSH port which
    // is open in your firewall setup.
    Session session = jsch.getSession(login, remote_host, 22);
    session.setPassword(password);

    // Additional SSH options.  See your ssh_config manual for
    // more options.  Set options according to your requirements.
    java.util.Properties config = new java.util.Properties();
    config.put("StrictHostKeyChecking", "no");
    config.put("Compression", "yes");
    config.put("ConnectionAttempts","2");

    session.setConfig(config);

    // Connect
    session.connect();            

    // Create the tunnel through port forwarding.  
    // This is basically instructing jsch session to send 
    // data received from local_port in the local machine to 
    // remote_port of the remote_host
    // assigned_port is the port assigned by jsch for use,
    // it may not always be the same as
    // local_port.

    assigned_port = session.setPortForwardingL(local_port, 
            remote_host, remote_port);

 catch (JSchException e)             
    System.out.println("JSch:" + e.getMessage());
    return;


if (assigned_port == 0) 
    System.out.println("Port forwarding failed!"); 
    return;

但是,如果我在客户端计算机上启动本地 SOCKS 代理,JSch 无法将其端口用作本地侦听端口,表示无法绑定。我猜这是因为端口被 SOCKS 服务器占用(这很明显,呵呵)。问题是,使用 JSch 进行动态端口转发的正确方法是什么?

【问题讨论】:

你有没有找到用 Java 实现这一目标的方法? 【参考方案1】:

如果 SOCKS 代理在远程服务器上运行,您可以建立从本地服务器上的端口到远程服务器上的 SOCKS 代理端口的 SSH 隧道。设置好之后,支持 SOCKS 的客户端就可以使用本地隧道端口,就好像它是 SOCKS 代理一样。

OpenSSH ssh 程序和 windows Putty 实用程序具有内置的 SOCKS 代理功能。您可以只使用其中之一。

【讨论】:

【参考方案2】:

这是-D的描述:

指定本地“动态”应用程序级端口转发。 这通过分配一个套接字来监听本地端口来工作 侧,可选地绑定到指定的 bind_address。 无论何时 连接到这个端口,连接被转发 安全通道,然后使用应用程序协议 确定从远程机器连接到哪里。现在 支持 SOCKS4 和 SOCKS5 协议,ssh 会起作用 作为 SOCKS 服务器。 只有 root 可以转发特权端口。 动态端口转发也可以在配置中指定 文件。

@Kenster 对 ssh 所做的事情是正确的,但我认为您想要的不是远程运行 SOCKS 代理,而是实现 jsch 中的 Java SOCKS 代理服务器服务器(然后贡献回到jsch)。

【讨论】:

以上是关于Java:SSH 隧道 - 将本地 SOCKS 设置为侦听器的主要内容,如果未能解决你的问题,请参考以下文章

红蓝对抗之隧道技术第二篇(reGeorg内网穿透SSH隧道本地Socks代理SSH远程转发Earthworm Socks5代理Tunna正向代理ICMP隧道DNS隧道Frp穿透)

通过 SSH SOCKS 隧道将流量转发到特定 IP

使用 SSH 隧道实现端口转发SOCKS 代理

使用 JSch 创建一个通过 SSH 隧道化的 SOCKS 代理

CobaltStrike使用-第八篇-隧道技术(socks转发ssh隧道CS转发监听器)

CobaltStrike使用-第八篇-隧道技术(socks转发ssh隧道CS转发监听器)