장치는 알려진 특정 포트에서 원격 서버에 계속 연결을 시도합니다.
원격 서버에는 열린 TCP 포트 외에는 아무것도 없습니다.
원격 서버의 포트를 내 컴퓨터로 전달하고 TCP 서버를 열어 데이터를 읽고 싶습니다.
궁극적으로 나는 이것을 달성하기 위해 Python을 사용하고 싶지만
그동안 나는 ssh: 를 사용하여 이 작업을 수행하려고 합니다. ssh -N -R 10000:localhost:10000 username@hostname
내
쪽(내 컴퓨터)에서는 포트 10000에서 수신 대기하기 위해 Python을 사용하여 소켓을 열려고 합니다. 열려고 노력하다헤라클레스그러나 TCP 서버를 시뮬레이션하면 데이터가 수신되지 않습니다.
확실히 뭔가 빠진 게 있는 것 같은데, 그게 뭔가요?
p.s. 원격 서버에서 TCP 서버를 열면 데이터를 얻을 수 있지만
내 컴퓨터에서 연결을 제어해야 합니다.
답변1
관련 부분은 다음과 같습니다-R
ssh
매뉴얼 페이지 에서:
-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 데몬을 다시 로드해야 합니다.