8

こんにちは、データセンターからトンネル経由で Oracle DB にアクセスする際に問題が発生しました。

1 台のマシンが外部からアクセス可能 (私はその IP を dc として /etc/hosts ファイルに入れています) と内部の Oracle DB を備えたかなり標準的なデータセンターがあります。内部ネットワークの Oracle データベースの IP アドレスは 192.168.1.7 です。

トンネルを作成するには、次のコマンドを使用しています。

 ssh -L 1521:192.168.1.7:1521 root@dc

そしてもちろんそれは機能します(何かが通過しているかどうかを確認するために debug -vv を追加することもあります)。

ここで難しいのは、Oracle への接続です。インスタントクライアント 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 はローカル ユーザー名です。なんで相手に送られるの?

アップデート:

データセンター内からもう少し調査すると、次のようになります。-最初の接続はポート1521に接続されます-しかし、sqlplusはポート番号> 3300にリダイレクトされます。私が持っていた)-トンネルを介して接続しようとすると、sqlplusはlocalhostに接続しようとし、明らかに失敗します

そのため、「リスナーがありません」というエラーは、おそらくこれらのポートをリダイレクトしていないことが原因です。特定のポートを強制的に使用する方法 (おそらく tnsnames.ora ファイルのオプション) はありますか?

4

7 に答える 7

3

通常、これは機能するはずです。デフォルトのリスナー ポートを ssh トンネルのエントリとして使用することはありませんが、それは問題にはなりません。また、root アカウントを使用して ssh 接続を作成することもありません。専用の通常のアカウントを使用することをお勧めします。共有サーバーを使用していますか、それともデータベースがたまたま負荷分散構成の RAC データベースですか? 素敵な説明がここにあります sshトンネルチェーン(二重トンネル、企業ネットワーク内のサーバー)を介してORACLE DBに接続するにはどうすればよいですか?、もう少し複雑.....

チェックアウトDbVisualizerを更新すると、ssh トンネリングが統合されました。少なくとも試してみる価値はあると思います。無料ではありませんが、良いです。マルチプラットフォームとマルチデータベースで、非常に柔軟です。

于 2011-04-12T20:22:13.187 に答える
3

Metalink ID 361284.1を調べてください(編集: 事実上公開されていませんが、ここで情報を見つけてください)

Oracle Connection Manager が選択肢のようです。基本的に、ファイアウォール内のポート リダイレクトを処理します。私は以前にそれを使用したことがないので、これ以上アドバイスすることはできません.


更新:もう 1 つの方法は、MTS を使用し、特定のポートでディスパッチャを構成し、ファイアウォールでこれらのポートを開くことです。このために追加のソフトウェアをインストールする必要はありませんが、共有サーバーを介して接続するには、他の考慮事項の中で LARGE_POOL_SIZE を増やす必要がある場合があります。したがって、DISPATCHERS パラメータを変更するには DBA ロールが必要です。また、DB をバウンスする必要があります。

于 2011-06-05T22:25:38.253 に答える
0

何が起こっているのかを正確に判断するためにトレースを作成してみてください:

  • サーバー トレースについては、こちらを試してください(注意してください! すべての新しいリクエストがトレースされ、サーバーが折りたたまれる可能性があります)。
  • クライアント トレースについては、こちらをご覧ください。
于 2011-06-04T13:35:06.293 に答える
0

MJ!トンネルは最初の tcp 接続専用であり、独自の LISTEN ポートはトンネリングされておらず、おそらく実装されていません。ファイアウォールは、アクティブな FTP と同様に、接続を許可する必要があります。Oracle のすべてのポートは、"Building Internet Firewalls" 2/E Chapter 23 の 670 ページから始まる非常に広範囲に文書化されています: Oracle SQL*Net および Net8。SafariBooksOnline.comで表示できます。

ISBN 1565928718

于 2014-01-21T21:37:09.840 に答える
-1

リスナーがまだ開始されていない可能性があります。「 lsnrctrl start」コマンドを実行してみてください。

于 2011-06-08T12:26:20.727 に答える