
我有以下設定:我想從電腦 C 存取電腦 A,但它們都沒有公用 IP 位址。不過,機器 C 與機器 B 位於同一網路中,機器 B 具有公共 IP 存取權限,因此我可以透過先 ssh 進入機器 B,然後從那裡 ssh 進入機器 C,從任何地方存取機器 C。存取權限,而A 和CI 上都有。請參閱下圖以進行說明:
machine A machine B machine C
no public IP public IP no public IP
root access no root access root access
how to access? '---------------------------'
same network
hence both accessible
一個愚蠢的解決方案是讓機器A 定期嗅探機器C 中的檔案(透過上述的兩步驟ssh 存取),每當該檔案中出現命令時,執行它並透過ssh 將輸出寫入機器C 的某處。如果是的話,我該怎麼做?
答案1
您可能必須使用遠端轉送選項machineA
開啟至 的 SSH 隧道machineB
,這將允許您透過 SSHmachineA
進入machineB
。
如果您在 上具有 root 存取權限machineB
,則將設定GatewayPorts
選項設為yes
in /etc/ssh/sshd_config
,然後在 上發出以下命令machineA
:
ssh -N -R 0.0.0.0:2222:127.0.0.1:22 the_public_ip_of_machine_B
這將開啟 上的連接埠 2222 machineB
,並將該連接埠上的任何流量轉發到其自身,即連接埠22。您有無論如何都要打開防火牆machineB
)。當此隧道處於活動狀態時,您可以透過 SSH 連接machineB
到連接埠 2222,這將帶您到machineA
.由於machineB
和machineC
位於同一子網,因此您可以machineA
一步登入machineC
。
如果您沒有 root 存取權限machineB
,則流程是相同的,但偵聽位址除外。如果GatewayPorts
設定為no
(這是預設值),則第一個參數 ( 0.0.0.0
) 將被忽略,並且偵聽位址將綁定到127.0.0.1
。在這種情況下,您仍然可以使用上面的命令,並且轉發將進行相同的工作,但是打開的連接埠將無法從除machineB
.因此,您必須透過 SSH 連接到machineB
,然後透過 SSH 連接到localhost
連接埠 2222,這將帶您到達machineA
。
但是,您可能需要考慮使用更強大的東西,例如 VPN。