원격 TCP 포트를 로컬 포트로 전달

원격 TCP 포트를 로컬 포트로 전달



나는 다음과 같은 설정을 가지고 있습니다 : 설정 다이어그램

장치는 알려진 특정 포트에서 원격 서버에 계속 연결을 시도합니다.
원격 서버에는 열린 TCP 포트 외에는 아무것도 없습니다.
원격 서버의 포트를 내 컴퓨터로 전달하고 TCP 서버를 열어 데이터를 읽고 싶습니다.

궁극적으로 나는 이것을 달성하기 위해 Python을 사용하고 싶지만
그동안 나는 ssh: 를 사용하여 이 작업을 수행하려고 합니다. ssh -N -R 10000:localhost:10000 username@hostname
쪽(내 컴퓨터)에서는 포트 10000에서 수신 대기하기 위해 Python을 사용하여 소켓을 열려고 합니다. 열려고 노력하다헤라클레스그러나 TCP 서버를 시뮬레이션하면 데이터가 수신되지 않습니다.

확실히 뭔가 빠진 게 있는 것 같은데, 그게 뭔가요?
p.s. 원격 서버에서 TCP 서버를 열면 데이터를 얻을 수 있지만
내 컴퓨터에서 연결을 제어해야 합니다.

답변1

관련 부분은 다음과 같습니다-Rssh매뉴얼 페이지 에서:

-R [bind_address:]port:host:hostport

[...]

기본적으로,서버의 TCP 수신 소켓은 루프백 인터페이스에만 바인딩됩니다.. 이것Bind_address를 지정하여 재정의할 수 있습니다.. 하나빈 바인딩_주소 또는 주소 '*', 원격 소켓이 모든 인터페이스를 수신해야 함을 나타냅니다.GatewayPorts 원격 바인딩 주소 지정은 서버 옵션이 활성화된 경우에만 성공합니다(참조:sshd_config(5)).

원격 서버의 청취 소켓은 청취만 합니다.로컬 호스트따라서 UNIT으로부터의 연결이 거부됩니다(즉, "닫혀 있습니다").

따라서 서버에서 이미 허용하는 경우 다음을 사용하세요.

ssh -N -R :10000:localhost:10000 username@hostname

:앞에는 "빈 바인드 주소"가 있습니다(실제 원격 서버의 UNIT 연결 IP 주소를 사용할 수도 있음) . 이는 다음과 같이 개선되어야 합니다.

ssh -o ExitOnForwardFailure=yes -N -R :10000:localhost:10000 username@hostname

실수로 두 번 실행되는 것을 방지합니다.

그러나 이러한 유형의 바인딩 주소는 일반적으로 원격 서버의 주소로 허용되지 않습니다.SSHD다음과 같이 구성됨GatewayPorts바뀌어야 합니다. 원격 서버에서 구성 파일은 /etc/ssh/sshd_config일반적으로 다음과 같은 (주석 처리되지 않은) 항목을 갖도록 수정되어야 합니다.

GatewayPorts clientspecified

그리고 새로운 구성을 사용하려면 ssh 데몬을 다시 로드해야 합니다.

관련 정보