Использование oracle db через ssh туннель. Ошибка «ORA-12541: TNS: нет слушателя» - PullRequest
8 голосов
/ 13 января 2010

Здравствуйте! У меня проблема с доступом к БД Oracle из нашего центра обработки данных через туннель.

У нас есть довольно стандартный центр обработки данных, в котором одна машина доступна снаружи. (Я помещаю его IP в файл / etc / hosts как dc), а внутри Oracle DB. IP-адрес нашей базы данных Oracle во внутренней сети: 192.168.1.7

Для создания туннеля я использую команду:

 ssh -L 1521:192.168.1.7:1521 root@dc

и, конечно, это работает (иногда я также добавляю некоторую команду debug -vv, чтобы проверить, проходит ли что-нибудь).

Теперь сложная часть - подключение к Oracle. Я установил InstantClient 11.2. и мой tnsnames.ora выглядит так:

testdb =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = dbname)
    )
  )

А когда я пытаюсь подключиться с помощью команды:

./sqlplus username/pass@testdb

Он начинает подключаться через туннель (я вижу это в отладке ssh), но затем не удается говоря:

./sqlplus username/pass@testdb

SQL*Plus: Release 11.2.0.1.0 Production on Wed Jan 13 20:46:07 2010

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

ERROR:
ORA-12541: TNS:no listener


Enter user-name: 

Когда я пытаюсь выполнить эту же команду, когда я нахожусь в интрасети, она работает (очевидно, единственное отличие состоит в том, что в tnsnames.ora HOST у нас 192.168.1.7, а не localhost).

Я также пытался использовать простую командную строку:

./sqlplus username/pass@//localhost:1521/testdb

или альтернативно

./sqlplus username/pass@//localhost:1521/testdb

Но ничего не помогло:)

Буду признателен за любую помощь или предложения. Я пропускаю какой-нибудь ssh-флаг, чтобы сделать это возможным?

Вероятно, файл журнала:

***********************************************************************

Fatal NI connect error 12541, connecting to:
 (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=DBNAME)(CID=(PROGRAM=sqlplus@velvet)(HOST=velvet)(USER=johndoe))))

  VERSION INFORMATION:
    TNS for Linux: Version 11.2.0.1.0 - Production
    TCP/IP NT Protocol Adapter for Linux: Version 11.2.0.1.0 - Production
  Time: 13-JAN-2010 20:48:42
  Tracing not turned on.
  Tns error struct:
    ns main err code: 12541

TNS-12541: Message 12541 not found; No message file for product=network, facility=TNS
    ns secondary err code: 12560
    nt main err code: 511

TNS-00511: Message 511 not found; No message file for product=network, facility=TNS
    nt secondary err code: 111
    nt OS err code: 0

где velvet - мое локальное имя хоста, а johndoe - мое локальное имя пользователя. Почему оно отправлено на другую сторону?

UPDATE:

После небольшого исследования внутри центра обработки данных, оно выглядит следующим образом: - первое соединение идет к порту 1521 - но затем sqlplus перенаправляется на номер порта> 3300, который каждый раз отличается и увеличивается на 3 (по крайней мере, несколько попыток у меня было) - когда мы пытаемся подключиться через туннель, sqlplus попытается подключиться к локальному хосту, и он, очевидно, потерпит неудачу

Таким образом, ошибка «No Listener» возникает, вероятно, из-за того, что мы не перенаправляем эти порты. Есть ли способ (возможно, какая-то опция в файле tnsnames.ora) принудительно использовать какой-то определенный порт?

Ответы [ 6 ]

3 голосов
/ 06 июня 2011

Загляните в Metalink ID 361284.1 (Изменить: фактически не публично, но найти информацию здесь )

Похоже, Oracle Connection Manager будет вашим выбором. Он в основном обрабатывает перенаправления портов внутри брандмауэра . Я не использовал его раньше, поэтому не могу дать вам дальнейших советов.


Обновление: Еще один способ - использовать MTS, настроить диспетчеры с определенными портами и открыть эти порты в брандмауэре. Для этого вам не нужно устанавливать дополнительное программное обеспечение, но для подключения через общий сервер может потребоваться увеличение LARGE_POOL_SIZE, помимо прочего. Таким образом, вам все еще нужна роль DBA для изменения параметра DISPATCHERS. Тебе также придется отскочить от БД.

3 голосов
/ 13 апреля 2011

Обычно это должно работать. Я бы не использовал порт прослушивателя по умолчанию в качестве входа для туннеля ssh, но это не должно быть проблемой. Я также не стал бы использовать учетную запись root для создания ssh-соединения, предпочтительно выделенную обычную учетную запись. Используете ли вы общие серверы или база данных является базой данных RAC с конфигурацией балансировки нагрузки? Хорошее объяснение здесь Как я могу подключиться к ORACLE DB через цепочку туннелей ssh ​​(двойной туннель, сервер в сети компании)? , немного сложнее .....

обновление checkout DbVisualizer , теперь он имеет встроенное туннелирование ssh. Я думаю, что стоит хотя бы попробовать. Это не бесплатно, но хорошо. Многоплатформенная и многопользовательская база данных, очень гибкая.

0 голосов
/ 22 января 2014

MJ! Ваш туннель предназначен только для начального соединения TCP, ваш собственный порт LISTEN не туннелирован и, вероятно, не реализован. Брандмауэр должен разрешить подключение обратно к вам, аналогично активному FTP. Все порты для Oracle достаточно подробно документированы, начиная со страницы 670 «Создание межсетевых экранов в Интернете» 2 / E, глава 23, параграф: Oracle SQL * Net и Net8. Вы можете просмотреть его на SafariBooksOnline.com

ISBN 1565928718

0 голосов
/ 29 июня 2013

Также хорошее объяснение здесь соединение с базой данных оракула через безопасную оболочку SSH , которая работала для меня.

  1. Откройте putty и на странице сеанса введите имя сервера и убедитесь, что установлен SSH. Сервер может быть любым сервером, который у вас есть имя пользователя и пароль для входа. Я использую один под названием BLUEBIRD как Я владею им!

  2. На странице connection-> ssh-> tunnels снимите обе опции сверху («Локальные порты принимают ...» и «Удаленные порты делают то же самое»).

  3. Введите 9999 (или любой порт выше 1024 в качестве порта источника.

  4. В пункте назначения введите хост и порт базы данных согласно tnsnames. В моем случае это сервер под названием GREENBIRD и порт

  5. Введите это как сервер: порт.

  6. Поскольку перенаправляемый порт находится на вашем рабочем столе, установите флажок «Локальный». Оставьте «Авто» проверенным также и для версии IP.

  7. Нажмите кнопку Добавить. Вы увидите L9999 greenbird: 1521 (ваш будет отличаться) в списке переадресованных портов.

  8. Снова перейдите на страницу сеанса, введите имя сохраненного сеанса и нажмите «Сохранить».

  9. Нажмите открыть. Укажите имя пользователя и пароль для сервера (BLUEBIRD в моем случае). Вы войдете в обычный сеанс SSH на сервер с именем BLUEBIRD.

0 голосов
/ 08 июня 2011

Возможно, ваш слушатель еще не запущен. Попробуйте выполнить команду " lsnrctrl start ".

0 голосов
/ 04 июня 2011

Можете ли вы попытаться сделать трассировку, чтобы точно определить, что происходит:

  • Для трассировки сервера попробуйте здесь (будьте осторожны! Все новые запросы будут отслежены и сервер может быть свернут).
  • Для трассировки клиента, проверьте здесь .
...