JSch несколько туннелей / прыжков - PullRequest
0 голосов
/ 01 декабря 2018

Я не уверен, если это вызвано использованием закрытого ключа вместо пароля для переадресации портов, но вот что я пытаюсь сделать

enter image description here

Мне нужно перенаправить локальный порт 3308 полностью в мою базу данных SQL на 3306.

Я могу запускать подобные вещи все вместе в терминале на моем локальном

ssh -L 3308:localhost:3307 username@jumpbox "ssh -L 3307:mysqlDB:3306 username@server"

Или запустите первую часть в моем локальном, а затем вторую часть в поле Jumpbox.Оба отлично работают, и я могу подключиться к своему локальному: 3308.

Проблема возникает, когда я начинаю использовать JSch.Вот мой код

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);

Первое соединение установлено, но второе истекло.

Исключение в потоке "main" com.jcraft.jsch.JSchException: java.net.ConnectException: Тайм-аут операции (Тайм-аут соединения)

Я что-то не так делаю с JSch или переадресацией порта?

1 Ответ

0 голосов
/ 01 декабря 2018

Ваша команда ssh использует SSH-клиент (еще один ssh), работающий в «поле ввода».

Если вы хотите реализовать то же самое с помощью Java, у вас есть два варианта:

  1. Сделайте то же самое в Java, т. Е. Используйте session для запуска ssh -L 3307:mysqlDB:3306 username@server на «поле ввода».

    См. Выполнение команды с помощью JSch .

    Хотя я не думаю, что вы должны полагаться на программу ssh для второго прыжка, по той же причине, по которой вы используете Java / JSch для первого прыжка (а не ssh программа).

  2. Избегайте использования отдельного инструмента ssh, и вместо этого откройте другой сеанс SSH локально через еще один перенаправленный порт.Вы можете сделать то же самое, используя последние версии ssh, с переключателем -J (переход) (поддерживается начиная с OpenSSH 7.3):

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

    Я предпочитаю такой подход.


Для реализации последнего подхода:

  • Вы должны перенаправить некоторый локальный порт на server:22, чтобы вы могли открыть SSHподключение к server:

    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();
    
  • Затем вы перенаправите другой локальный порт через server на порт MySQL:

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

    Теперь вы сможетедля подключения к localhost:mysqlPort с использованием клиента MySQL.


Обязательное предупреждение: не используйте StrictHostKeyChecking=no для слепого принятия всех ключей хоста.Это недостаток безопасности.Вы теряете защиту от MITM-атак .

Для правильного (и безопасного) подхода см .:
Как разрешить Java UnknownHostKey при использовании библиотеки JSch SFTP?

...