"локальный порт ... не может быть привязан" при переадресации порта с использованием JSch в Java - PullRequest
0 голосов
/ 11 июня 2019

Мне нужно подключиться к MongoDB через туннель SSH, и при переадресации порта JSch выдается ошибка:

локальный порт 127.0.0.1:27017 не может быть привязан

Я должен подключиться к MongoDB через туннель SSH.Я нашел код здесь на stackoverflow, и это решило мою проблему.Но через несколько недель тот же код перестал работать.Я не могу определить причину этого.Кроме того, используя те же учетные данные, которые я использую в коде Java, я также пытался подключиться к нему через CMD с помощью команды SSH -L, и она работала правильно.Я также могу подключиться к MongoDB для использования тех же учетных данных из NoSQLBrowser.Я попробовал и искал все на Google, и проблема все еще остается нерешенной.Ниже приведен код для этого -

java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
JSch jsch = new JSch();
SSH_SESSION = null;
SSH_SESSION = jsch.getSession(SSH_USER, SSH_HOST, SSH_PORT);
SSH_SESSION.setPassword(SSH_PASSWORD);
SSH_SESSION.setConfig(config);
SSH_SESSION.connect();
SSH_SESSION.setPortForwardingL(27017, "localhost", 22);

MongoClient mongoClient = new MongoClient(LOCAL_HOST, LOCAL_PORT);
mongoClient.setReadPreference(ReadPreference.nearest());
MongoCursor<String> dbNames = mongoClient.listDatabaseNames().iterator();
while (dbNames.hasNext()) {
System.out.println(dbNames.next());```

Я получаю следующую ошибку на линии переадресации портов: -

com.jcraft.jsch.JSchException: PortForwardingL: local port 127.0.0.1:27017 cannot be bound.
    at com.jcraft.jsch.PortWatcher.<init>(PortWatcher.java:158)
    at com.jcraft.jsch.PortWatcher.addPort(PortWatcher.java:110)
    at com.jcraft.jsch.Session.setPortForwardingL(Session.java:1847)
    at com.jcraft.jsch.Session.setPortForwardingL(Session.java:1828)
    at com.jcraft.jsch.Session.setPortForwardingL(Session.java:1809)
    at com.jcraft.jsch.Session.setPortForwardingL(Session.java:1792)
    at com.schenker.boot.bootdemo.controller.TestMongoAgain.main(TestMongoAgain.java:35)
Caused by: java.net.BindException: Address already in use: JVM_Bind
    at java.net.DualStackPlainSocketImpl.bind0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketBind(Unknown Source)
    at java.net.AbstractPlainSocketImpl.bind(Unknown Source)
    at java.net.PlainSocketImpl.bind(Unknown Source)
    at java.net.ServerSocket.bind(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)
    at com.jcraft.jsch.PortWatcher.<init>(PortWatcher.java:150)
    ... 6 more
com.jcraft.jsch.JSchException: PortForwardingL: local port 127.0.0.1:27017 is not registered.
    at com.jcraft.jsch.PortWatcher.delPort(PortWatcher.java:118)
    at com.jcraft.jsch.Session.delPortForwardingL(Session.java:1876)
    at com.jcraft.jsch.Session.delPortForwardingL(Session.java:1865)

Кроме того, очень странная вещь, которая вместо PortForwardingL если я использую PortForwardingR, он не выдает никакой ошибки, но в следующей строке он подключается к моей локальной MongoDB.Может кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 11 июня 2019

Порт 27017, вероятно, используется некоторыми приложениями / службами, работающими на вашем локальном компьютере & ndash; Вероятно, ваша локальная БД Mongo .

В любом случае, просто выберите любой другой номер порта. Это может быть что угодно.

Хотя, если вы используете порт для внутреннего использования без приложения, вам не следует полагаться на фиксированный номер порта. Вы никогда не знаете, когда какое-то другое приложение блокирует этот порт. Пусть JSch автоматически выберет свободный порт:

int forwardedPort = SSH_SESSION.setPortForwardingL(0, "localhost", 22);
MongoClient mongoClient = new MongoClient(LOCAL_HOST, forwardedPort);

Хотя в целом ваш код кажется неверным. Вы перенаправляете порт на 22, в то время как вы, вероятно, должны перенаправить его на удаленный порт БД Mongo.

Смотрите полный рабочий пример (хотя для MySQL, для MongoDB он такой же, только с другим портом):
Подключение к удаленной базе данных MySQL через SSH с использованием Java


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

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

...