Linux
穩定的遠端埠轉發
我需要一個可公開訪問的主機上的一些埠,不斷轉發到防火牆後面的伺服器。
我目前正在使用 autossh 從伺服器連接到在 GKE 上執行的 openssh 容器,並根據需要轉發埠:
/usr/bin/autossh \ -y \ -v \ -i <ssh key> \ -M 0 \ -q \ -o 'ServerAliveInterval 60' \ -o 'ServerAliveCountMax 3' \ -p <alternative ssh port> \ -l <user name> \ <name resolving (locally) to GKE public IP address> \ -R 30000:localhost:6000 'while true; do echo were up; sleep 10; done' # this is done to generate a minimal amount of traffic.
問題是,有時當連接斷開時,autossh 會重新連接但無法再次設置轉發。但它不會失敗,因此不會重試。當我停止 autossh 並嘗試在這種情況下連接時,僅使用 ssh (-vvv),我收到一條警告消息,指出該埠已在使用中。
問題:
- 有沒有更好的方法來繼續將埠轉發到防火牆後面的伺服器(安全地)
- 為什麼連接斷開後埠沒有立即釋放,我可以強制以某種方式釋放它,或者至少斷開連接並重試直到它被釋放?
這是因為您要連接的主機可能沒有意識到之前的連接已經斷開,並且仍在使用該埠。雖然新的 autossh 連接會成功,但它不會打開隧道並且 autossh 不會重新啟動,因為它認為連接正常。
在使用 autossh 時,有兩個特定的 OpenSSH 選項很有用:
ExitOnForwardFailure=yes在客戶端確保在 autossh 假定連接設置正確時轉發成功。
伺服器端的ClientAliveInterval,以確保如果連接在客戶端關閉,則偵聽套接字在伺服器端關閉。將 autossh 命令替換為:
-o “ServerAliveCountMax 3” 與 -o “ServerAliveCountMax=3”
-o “ServerAliveInterval 60” 和 -o “ServerAliveInterval =60”
“ **=”**符號很關鍵
例子:
autossh -M 0 -q -f -gNC -o “ServerAliveCountMax=3” -o “ServerAliveInterval=60” -o “ExitOnForwardFailure=yes” -R xxxx:localhost:22 auto ssh@remotehost