Linux

穩定的遠端埠轉發

  • June 9, 2021

我需要一個可公開訪問的主機上的一些埠,不斷轉發到防火牆後面的伺服器。

我目前正在使用 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),我收到一條警告消息,指出該埠已在使用中。

問題

  1. 有沒有更好的方法來繼續將埠轉發到防火牆後面的伺服器(安全地)
  2. 為什麼連接斷開後埠沒有立即釋放,我可以強制以某種方式釋放它,或者至少斷開連接並重試直到它被釋放?
  1. 這是因為您要連接的主機可能沒有意識到之前的連接已經斷開,並且仍在使用該埠。雖然新的 autossh 連接會成功,但它不會打開隧道並且 autossh 不會重新啟動,因為它認為連接正常。

  2. 在使用 autossh 時,有兩個特定的 OpenSSH 選項很有用:

  3. ExitOnForwardFailure=yes在客戶端確保在 autossh 假定連接設置正確時轉發成功。

  4. 伺服器端的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

引用自:https://serverfault.com/questions/1065721