TNS 連接轉發
有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 的偵聽器埠的隧道。