反向 SSH 隧道如何工作?
據我了解,防火牆(假設預設設置)拒絕所有先前沒有相應傳出流量的傳入流量。
基於Reversing an ssh connection和SSH Tunneling Made Easy,反向 SSH 隧道可用於繞過討厭的防火牆限制。
我想在遠端機器上執行 shell 命令。遠端機器有自己的防火牆,並且位於額外的防火牆(路由器)後面。它有一個類似 192.168.1.126 的 IP 地址(或類似的地址)。我不在防火牆後面,我知道從 Internet 上看到的遠端機器的 IP 地址(不是 192.168.1.126 地址)。此外,我可以先讓某人
ssh (something)
在遠端機器上以 root 身份執行。誰能一步一步地向我解釋反向 SSH 隧道如何繞過防火牆(本地和遠端電腦的防火牆以及它們之間的附加防火牆)?
開關 (
-R
,-f
,-L
,-N
) 的作用是什麼?
我喜歡通過視覺化來解釋這種事情。:-)
將您的 SSH 連接視為管道。大管子。通常,您將通過這些管子在遠端電腦上執行 shell。shell 在虛擬終端 (tty) 中執行。但是你已經知道這部分了。
將您的隧道想像成管中的管。您仍然擁有較大的 SSH 連接,但 -L 或 -R 選項可讓您在其中設置一個較小的管道。
每個管子都有開始和結束。大管,您的 SSH 連接,從您的 SSH 客戶端開始,到您連接的 SSH 伺服器結束。所有較小的管子都具有相同的端點,除了“開始”或“結束”的角色取決於您是否使用
-L
或-R
(分別)創建它們。(你沒有說,但我假設你提到的“遠端”機器,防火牆後面的機器,可以使用網路地址轉換(NAT)訪問網際網路。這很重要,所以如果這個假設是錯誤的,請更正這個假設。)
當您創建隧道時,您需要指定它會應答的地址和埠,以及它將被傳遞到的地址和埠。該
-L
選項告訴隧道在隧道的本地端(執行客戶端的主機)進行應答。該-R
選項告訴隧道在遠端端(SSH 伺服器)進行應答。所以…為了能夠從 Internet SSH 到防火牆後面的機器,您需要有問題的機器打開與外部世界的 SSH 連接,並包括一個
-R
隧道,其“入口”點是“遠端”端他的聯繫。在上面顯示的兩個模型中,您需要右邊的那個。
從防火牆主機:
ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com
這告訴您的客戶端建立一個帶有
-R
表情入口點的隧道。連接到隧道遠端埠 22222 的任何東西實際上都會到達“localhost 埠 22”,其中“localhost”是從隧道出口點(即您的 ssh 客戶端)的角度來看的。其他選項是:
-f
在 ssh 驗證後告訴 ssh 到後台執行,因此您不必坐下來在遠端伺服器上執行某些東西以使隧道保持活動狀態。-N
說你想要一個 SSH 連接,但你實際上並不想執行任何遠端命令。如果您創建的只是一個隧道,那麼包含此選項可以節省資源。-T
禁用偽 tty 分配,這是合適的,因為您沒有嘗試創建互動式 shell。除非您為無密碼登錄設置了 DSA 或 RSA 密鑰,否則將會出現密碼挑戰。
請注意,強烈建議您使用僅為此隧道/客戶/伺服器設置的一次性帳戶(不是您自己的登錄名)。
現在,在yourpublichost上的 shell 中,通過隧道與防火牆主機建立連接:
ssh -p 22222 username@localhost
您將獲得主機密鑰挑戰,因為您以前可能從未打過此主機。然後您將收到該
username
帳戶的密碼挑戰(除非您設置了無密碼登錄的密鑰)。如果您要定期訪問此主機,您還可以通過在
~/.ssh/config
文件中添加幾行來簡化訪問:host remotehostname User remoteusername Hostname localhost Port 22222
調整
remotehostname
以remoteusername
適應。該remoteusername
欄位必須與您在遠端伺服器上的使用者名匹配,但remotehostname
可以是任何適合您的主機名,它不必匹配任何可解析的內容。也可以看看: