
我有一個位於兩個網關後面的遠端伺服器,如圖所示。gw1
向外界開放,而gw2
只能從 訪問gw1
。Server
只能從多個可能的伺服器之一訪問gw2
,並且它可以是多個可能的伺服器之一。我想透過配置連接埠轉發,ssh
以便443
從我的客戶端電腦自動轉發到2000
on gw1
。這不是問題。我有:
HostName gw1
User user
ForwardAgent yes
LocalForward 443 localhost:2000
這非常有效。現在我想2000
從gw1
轉發到到時443
通過。我可以:Server
gw2
ssh
gw2
HostName gw2
LocalForward 2000 Server:443
無論如何,我是否可以將伺服器的 IP 作為參數傳遞,因為它每次都可能不同?
答案1
假設您不關心連接埠 2000。假設您有主機 server1、server2、server3,... 擔任伺服器角色。如果將其新增至 .ssh/config 中:
Match host server*
ProxyCommand ssh gw1 nc gw2 22
LocalForward 443 %h:443
然後,例如,ssh server1
將透過 gw1 連接到 gw2,並將 443 從那裡轉發到 server1。
其作用:ProxyCommand
告訴 ssh 首先連接到 gw1 並將標準輸出透過管道傳輸到nc gw2 22
,後者將該流轉送到連接埠22 上的gw2。 。然後 ssh 透過該隧道開啟第二個 ssh 會話到 gw2。建立後,LocalForward
會將連接埠 443 轉送到 server1(%h
即您在命令列中提供的主機名稱)。
請參閱 man ssh_config 以了解 Match 和 ProxyCommand。
請注意,雖然命令是ssh server1
,但這實際上僅將 ssh 連接到 gw2,然後僅從那裡轉發連接埠 443。 shell 將在 gw2 上打開,而不是在 server1 上開啟。因此,您可能想要ssh -N server1
改為運行,以避免開啟 shell,因為目標實際上只是轉送連接埠。不幸的是,.ssh/config 中沒有與 -N 等效的選項,但您可以添加類似的內容LocalCommand wait
來實現相同的效果 - shell 只會等到中斷,並且不會出現 shell 提示符。