빈 포트에서의 포트 포워딩. 그러나 "포트에서 수신할 수 없습니다" 및 포트가 꽉 찼습니다.

빈 포트에서의 포트 포워딩. 그러나 "포트에서 수신할 수 없습니다" 및 포트가 꽉 찼습니다.

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 [email protected]
> No response.  

3단계. SSH 재시도

ssh -N -f -L 8888:localhost:8888 -p 5000 [email protected]
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


부족한 영어 실력과 컴퓨터 과학 지식으로 인해 충분히 설명하지 못해 죄송합니다.
추가 정보가 필요하면 답변해 드리겠습니다.

답변1

첫 번째 명령(응답 없음)에 제공된 옵션의 효과는 명령이 성공할 때 피드백이 없다는 것입니다.

  • -N: 원격 명령을 실행하지 마십시오. 포트를 전달할 때만 유용합니다.
  • -f: 인증 단계(있는 경우)가 끝나면 ssh 명령이 백그라운드로 이동합니다.

따라서 첫 번째 명령에는 눈에 띄는 결과가 없지만 예상대로 작동합니다. 즉, 포트 8888을 전달하도록 터널을 설정하고 다른 것은 표시되지 않습니다.

두 번째 명령은 부분적으로만 성공했습니다. 여전히 백그라운드에서 두 번째 원격 SSH 연결을 실행하지만 전달할 수는 없습니다.다시동일한 포트: 이전 명령이 완료되었습니다. 그래서 그것에 대해 불평했습니다. 터널을 생성하지 않고 어떤 명령도 허용하지 않는 이 SSH 명령은 자원 낭비일 뿐입니다.


무엇을 더 잘할 수 있나요? 목표에 따라 다릅니다. 그러나 리소스 낭비를 방지하기 위해 간단히 수행할 수 있는 작업은 추가 옵션을 사용하여 요청된 터널을 설정할 수 없는 SSH 명령이 완전히 실패하도록 강제하는 것입니다 -o ExitOnForwardFailure=yes.

ssh(1)이 모든 요청에 ​​대해 동적, 터널링된 로컬 및 원격 포트 전달을 설정할 수 없는 경우 연결을 종료해야 하는지 여부를 지정합니다. [...]

따라서 결국 한 번 실행해야 하지만 오류 메시지가 나타나는 것 외에 여러 번 시도하는 것은 실제로 문제가 되지 않습니다.

ssh -N -f -o ExitOnForwardFailure=yes -L 8888:localhost:8888 -p 5000 [email protected]

이 명령이 성공하기 전에 이전에 실행된 ssh 명령을 먼저 종료해야 합니다(OP는 그 중 적어도 두 개를 실행했습니다). 그 중 하나는 실제로 포트 8888에 바인딩되어 이 명령이 성공하지 못하게 합니다.

Linux에서는 다음을 사용하여 PID를 찾을 수 있습니다 ss.

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

이런 식으로 그들은 명령에 따라 살해될 수 있습니다 kill.

관련 정보