Linux

TNS 連接轉發

  • October 19, 2019

有3台機器如下:

機器 A - 遠端 Exadata DB 機器

機器 B - 只有我可以連接到機器 A 的埠 1521 的遠端機器

機器 C - 本地機器(要執行 SQL Developer,不能直接連接機器 A)

機器 D - 我通過它的堡壘伺服器連接到機器 B

機器 C只能使用 SSH 隧道 訪問在機器 B中執行的服務。

有什麼方法可以使用在機器 C 中執行的 SQL Developer****從機器 A 訪問 Exadata 數據庫

我正在嘗試這種方式:

ssh MachineD -L 15219:MachineB:15220 -L 15220:MachineA:1521 

這是行不通的。

你試過

ssh MachineD -L 15219:MachineB:15220 -L 15220:MachineA:1521 

這不起作用,但您認為方向正確,您想加入兩條隧道。

登錄到 MachineD 並從您的 MachineB 埠 15219 到 MachineB 埠 15220 建立隧道

ssh -L 15219:MachineD:15220 MachineD

因此,如果您現在向 MachineC 埠 15219 發送內容,那麼您的 ssh 會話(從 MachineC 到 MachineD)將其發送到 MachineD 埠 15220

如果你做一個

tnsping  '(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = MachineC)(PORT = 15219))(CONNECT_DATA = (SERVICE_NAME = ORCL)))'

您將收到一條錯誤消息

TNS-12541: TNS:no listener

或類似的東西,如果您嘗試連接 SQL Developer。

因為如果您現在向 MachineC 埠 15219 發送內容,那麼您的 ssh 會話(從 MachineC 到 MachineD)會將其發送到 MachineD 埠 15220。而在 MachineD 埠 15220 上實際上沒有人在監聽。

現在在 MachineD 上的 ssh 會話中執行以下命令

ssh -L 15220:MachineA:1521 MachineB

現在您已經打開了一個從 MachineC 到 MachineB 的 ssh 會話,發送到 MachineD 埠 15220 的數據被第二個 ssh 會話讀取並發送到 MachineA 埠 1521。所以您有兩個 ssh 會話,第二個擴展了第一個。

但是,您可以在一個命令中執行此操作,而不是打開一個 ssh 會話並在此 ssh 會話中打開另一個會話

ssh -L 15219:MachineD:15220 MachineD ssh -L 15220:MachineA:1521 MachineB

通過並列兩個命令。如果在 ssh 命令後跟在另一個命令之後,則在登錄後執行此命令。為了避免出現錯誤消息,例如

Pseudo-terminal will not be allocated because stdin is not a terminal.

您可以使用-T第二個 ssh 命令的選項。

ssh -L 15219:MachineD:15220 MachineD ssh -T -L 15220:MachineA:1521 MachineB

如果你得到一些

bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 15220 

消息然後更改地址。

例如,使用 15221 而不是 15220。當然,您必須在兩個位置上替換它:

ssh -L 15219:MachineD:15221 MachineD ssh -T -L 15221:MachineA:1521 MachineB

我希望這行得通。可以配置 ssh 守護程序,從而不允許本地轉發。

您不能連接任意數量的隧道。

我無法測試 -W 選項,因為我得到

SSH-2.0-OpenSSH_5.3

Protocol mismatch.

您自己說過:SSH 隧道。

在機器 C 上:

ssh -L 12345:machineA:1521 machineB

然後在 SQL Developer 中使用 localhost:12345。

通過以上操作,您使用 SSH 從機器 C 登錄到機器 B,並通過機器 B 創建到機器 A 的偵聽器埠的隧道。

引用自:https://dba.stackexchange.com/questions/196589