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

多隧道/跳线

巫马承德
2023-03-14

我不确定这是否是由端口转发使用私钥而不是密码造成的,但下面是我正在尝试做的

我需要将本地端口3308一直转发到位于3306的my SQL DB。

我可以在我的本地终端上一起运行这样的事情

ssh -L 3308:localhost:3307 username@jumpbox "ssh -L 3307:mysqlDB:3306 username@server"
JSch jsch = new JSch();
jsch.addIdentity("~/.ssh/id_rsa");

Session session = jsch.getSession("username", "jumpbox");
session.setConfig("StrictHostKeyChecking", "no");
session.connect();

int assinged_port = session.setPortForwardingL(3308, "localhost", 3307);
Session mysqlSession = jsch.getSession("username", "server", assinged_port);
mysqlSession.setConfig("StrictHostKeyChecking", "no");
mysqlSession.connect(); // Connection timed out here
mysqlSession.setPortForwardingL(3307, "mysqlDB", 3306);

我在JSch或端口转发方面做错了什么吗?

共有1个答案

方宏才
2023-03-14

您的SSH命令使用了运行在“跳转框”上的SSH客户端(另一个SSH)。

当您希望使用Java实现相同的功能时,您有两种选择:

>

  • 在Java中执行相同的操作,即使用session在“跳转框”上运行ssh-l 3307:mysqldb:3306username@server

    避免使用单独的SSH工具,而是通过另一个转发端口在本地打开另一个SSH会话。实际上,您可以使用ssh的最新版本,使用-j(jump)开关(从OpenSSH 7.3开始就支持)来实现相同的功能:

    ssh -L 3308:mysqlDB:3306 -J username@jumpbox username@server
    

    参见OpenSSH支持多跳登录吗?

    我更喜欢这种方法。

    为了实施后一种方法:

    >

  • 必须将某个本地端口转发到服务器:22,以便打开到服务器的SSH连接:

    JSch jsch = new JSch();
    jsch.addIdentity("~/.ssh/id_rsa");
    
    Session jumpboxSession = jsch.getSession("username", "jumpbox");
    jumpboxSession.connect();
    
    int serverSshPort = jumpboxSession.setPortForwardingL(0, "server", 22);
    Session serverSession = jsch.getSession("username", "localhost", serverSshPort);
    serverSession.connect();
    

    然后通过服务器将另一个本地端口转发到MySQL端口:

    int mysqlPort = serverSession.setPortForwardingL(0, "mysqlDB", 3306);
    

  •  类似资料:
    • 通配符域 ngrok允许您将HTTP和TLS隧道绑定到通配符域。 所有通配符域(包括ngrok.io的子域)必须首先在您的信息中心为您的帐户保留。 使用-hostname or -subdomain时,指定前导星号以绑定通配符域。 绑定隧道以接收 example.com的所有子域上的流量 ngrok http --hostname *.example.com 80 通配符域规则 使用通配符域在ng

    • 我有一个控制器,它在上接受一个名为的类。控制器方法看起来像这样: 第一控制器: 属性之一的类型为。 现在,我正在尝试添加某种包装器控制器(将在另一台服务器上运行),它也接受,并将请求转发给第一个控制器: 第二(包装)控制器: 当我向第一个控制器发送请求时: 无法写入JSON:找不到java类的序列化程序。伊奥。FileDescriptor,并且没有发现创建BeanSerializer的属性(为了避

    • 并非您希望公开的所有服务都是基于HTTP或TLS的。 ngrok TCP隧道允许您公开通过TCP运行的任何联网服务。这通常用于公开SSH,游戏服务器,数据库等。启动TCP隧道很容易。 公开在端口1234上运行的基于TCP的服务 ngrok tcp 1234 例子 公开侦听默认端口的SSH服务器 ngrok tcp 22 暴露一个Postgres服务器侦听默认端口 ngrok tcp 5432 暴露

    • HTTPS隧道使用ngrok.com证书终止ngrok.com服务器上的所有TLS(SSL)流量。 对于生产级服务,您需要使用自己的TLS密钥和证书对您的隧道流量进行加密。 ngrok使这个特别容易与TLS隧道。 将TLS流量转发到端口443上的本地HTTPS服务器 ngrok tls -subdomain=encrypted 443 一旦你的隧道运行,尝试访问它与curl。 curl --ins

    • 自定义子域名称 ngrok为它为您打开的HTTP隧道分配随机十六进制名称。 这对于一次性个人用途是可以的。 但是,如果您在黑客马拉松上显示URL或与第三方Webhook集成,则如果隧道名称更改或难以阅读,可能会令人沮丧。 您可以使用-subdomain开关为隧道URL指定自定义子域。 示例:打开具有子域“inconshreveable”的隧道 ngrok http -subdomain=incon

    • 我试图将JProfiler连接到运行在服务器上的JVM,我称之为remote。这台服务器只能通过另一台我称之为middle的服务器从我的工作站(本地)访问。我将JProfiler连接到remote的计划是: > 在远程计算机上安装JProfiler仪表 从本地、中间到远程建立SSH隧道: