当前位置: 首页 > 知识库问答 >
问题:

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

荀辰钊
2023-03-14

我要做的是设置一个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 sesshtml" target="_blank">ion.  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做动态端口转发的正确方法是什么?

共有1个答案

乌骏
2023-03-14

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

OpenSSHssh程序和windowsputty实用程序具有内置的SOCKS代理功能。你可以用其中一个。

 类似资料:
  • 问题内容: 按下手机上的按钮时,我想执行自定义操作。 是否可以在按钮上设置onClickListener(或类似按钮)? 仅在第一次按下按钮时才被调用-我已经尝试过了。 问题答案: 通常,您不应因为用户期望菜单出现而覆盖行为,但是您可以沿以下方式使用:

  • 我想通过SSH隧道访问jupyter笔记本,并遵循以下方法 要总结-: 1.登录远程机器 2.在新航站楼: 3.然后转到浏览器,然后转到 现在我的问题是:我只能在两个步骤中访问远程机器 jupyter笔记本电脑只安装在我的电脑上。 当我用较长的登录过程替换第一步的第一行时,第二步应该写什么? 当我插入remote_user=username和remote_user=my_pc_name时,我从ju

  • 问题内容: 我正在尝试制作带有三个按钮的秒表,分别是“开始”,“暂停”和“停止”。我的老师只教我们如何将动作监听器设置为两个按钮。如何将动作监听器设置为三个按钮?到目前为止,这是我的编码 我还没有为“暂停”功能设置任何动作监听器,因为无论如何我都不知道如何暂停计时器。但是我想先将动作链接到按钮,然后再弄清楚如何暂停。 问题答案: 您正在寻找的是一条声明。 基本上,像往常一样将都添加到所有三个按钮…

  • 问题内容: 我想为SOCKS5代理设置列表,即应使用直接连接的主机名列表。 正如oracle docs所描述的,有一些名为的选项,可以为HTTP和FTP设置代理排除,但没有针对SOCKS代理的特定设置。 我试过了,但这不会影响SOCKS连接。 SOCKS代理是通过以下方式设置的: 但这导致即使数据库连接也正在使用SOCKS代理,这是不可接受的。 应该如何使用?如何从代理连接中排除某些主机? 问题答

  • 我有一个关于正确配置kafka侦听器属性的问题-侦听器和advertised.listers。 在我的配置中,我设置了以下道具: 客户端使用 进行连接。我是否需要在侦听器和广告侦听器中具有相同的值。这里 是指向运行 kafka 代理的主机的 dns 记录。 在什么情况下,我希望它们保持不变和不同? 谢谢!

  • 问题内容: 在涉及回调的Fragment示例中,通常它们在onAttach方法中分配侦听器,然后在onDetach方法中将侦听器设置为null。 这最后一部分是必要的吗?片段被分离/销毁时,监听器是否不会自动设置为null?还是在某些情况下,您可能会分离该片段并将其重新附加到其他位置,并且您不希望回调指向特定的内容,直到它重新附加至某个内容? 问题答案: 我从来没有明确地将监听器引用设置为,因为在