Linux

空埠中的埠轉發。但是“無法監聽埠”並且埠已被填滿

  • September 30, 2022

步驟 1. 檢查埠

netstat -tnlpa
(No info could be read for "-p": geteuid()=1000 but you should be root.)  
Active Internet connections (servers and established)  
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name  
tcp        0      0 127.0.0.1:6443          0.0.0.0:*               LISTEN      -  
tcp6       0      0 :::8080                 :::*                    LISTEN      -  

步驟 2. 嘗試 SSH

ssh -N -f -L 8888:localhost:8888 -p 5000 one@destination.com
> No response.  

步驟 3. 重試 SSH

ssh -N -f -L 8888:localhost:8888 -p 5000 one@destination.com
bind [127.0.0.1]:8888: Address already in use  
channel_setup_fwd_listener_tcpip: cannot listen to port: 8888  
Could not request local forwarding.  

步驟 4. 檢查埠

netstat -tnlpa 
(Not all processes could be identified, non-owned process info  
will not be shown, you would have to be root to see it all.)  
Active Internet connections (servers and established)  
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name  
tcp        0      0 127.0.0.1:6443          0.0.0.0:*               LISTEN      -  
tcp        0      0 127.0.0.1:8888          0.0.0.0:*               LISTEN      228/ssh  
tcp        0      0 172.23.246.199:46180    20.194.107.22:5000      ESTABLISHED 228/ssh  
tcp        0      0 172.23.246.199:46182    20.194.107.22:5000      ESTABLISHED 230/ssh  
tcp6       0      0 :::8080                 :::*                    LISTEN      -  
tcp6       0      0 ::1:8888                :::*                    LISTEN      228/ssh  

本地:WSL2 LTS 20.04

伺服器:AzureVM LTS 18.0X


由於我的英語技能和電腦科學知識不佳,我沒有解釋得足夠多,我很抱歉。

如果我們需要更多資訊,我會回复。

為第一個命令(沒有響應)提供的選項的效果是,當命令成功時,沒有回饋:

  • -N:不要執行任何遠端命令,這在僅轉發埠時很有用。
  • -f:當身份驗證階段(如果有)結束時,ssh 命令進入後台。

因此,第一個命令沒有可見的結果,但確實按預期工作:設置隧道以轉發埠 8888,沒有其他任何內容(可見)。

第二個命令僅部分成功:它仍然在後台執行第二個遠端 SSH 連接,但無法再次轉發相同的埠:它已經由上一個命令完成。所以它抱怨這個。這種不創建隧道且不允許任何命令的 SSH 命令只是浪費資源。


有什麼可以做得更好?這取決於目標。但是,為了防止浪費資源,可以簡單地做的是通過使用附加選項來強制無法建立請求的隧道的 SSH 命令完全失敗-o ExitOnForwardFailure=yes

指定如果 ssh(1) 無法設置所有請求的動態、隧道、本地和遠端埠轉發,是否應終止連接,

$$ … $$

所以最後你應該執行一次,但這不是一個真正的問題,除了得到一個錯誤消息之外,多次嘗試:

ssh -N -f -o ExitOnForwardFailure=yes -L 8888:localhost:8888 -p 5000 one@destination.com

在此命令成功之前,應先終止先前執行的 ssh 命令(OP 至少執行了其中兩個):其中一個實際上綁定到埠 8888 並將阻止此命令成功。

在 Linux 上,他們的 PID 可能通過這個ss命令找到:

ss -tnp dst == destination.com and dport == 5000

所以他們可以被kill命令殺死。

引用自:https://unix.stackexchange.com/questions/719294