socat 인수 순서가 중요한 것 같습니다

socat 인수 순서가 중요한 것 같습니다

매뉴얼 페이지에는 다음과 같은 내용이 socat나와 있습니다.socat는 두 개의 양방향 바이트 스트림을 설정하고 그 사이에 데이터를 전송하는 명령줄 기반 유틸리티입니다.이를 바탕으로 주장의 순서는 중요하지 않습니다. 저는 종종 다른 출처에서 같은 내용을 읽습니다.

하지만 때로는 순서가 중요하다고 느낄 때도 있습니다. 예: 고객의 네트워크에 SSH를 통해 액세스할 수 있는 내장 시스템이 있습니다. 임베드는 MS SQL 데이터베이스에 대한 직접 액세스를 제공합니다. 데이터베이스의 내용을 디버깅하려면 호스트 컴퓨터(IP 192.168.100.1)의 VirtualBox VM에서 실행되는 Azure Data Studio를 사용하고 싶습니다. 너무 간단한 것은 ssh -L1433:dbserver:1433도움이 되지 않습니다. 이것이 내가 socat을 사용하는 곳입니다.

먼저 로컬 전달을 사용하고 대상 포트 1433을 로컬 포트 ​​11433에 연결합니다.

ssh my-remote-embedded -N -L11433:dbserver:1433

socat그런 다음 가상 머신에서 포트에 액세스할 수 있도록 0.0.0.0에 바인딩된 포트 11433과 1433 사이에 직접 연결을 생성 했습니다 .

내가 이렇게 하면:

socat -v tcp:localhost:11433 tcp-listen:1433,bind=0.0.0.0,fork,reuseaddr

그런 다음 Azure Data Studio는 192.168.100.1:1433에 연결을 시도하고 연결이 작동하지만 작동하지 않습니다. Azure Data Studio가 연결되고(socat 출력에서 ​​바이트가 양방향으로 흐르는 것을 볼 수 있는 옵션 덕분에 -v) 연결 아이콘이 녹색으로 바뀌지만 데이터베이스 목록을 가져올 수 없으며 일반 쿼리도 작동하지 않습니다.

그러나 socat 호출 순서를 다음과 같이 바꾸면:

socat -v tcp-listen:1433,bind=0.0.0.0,fork,reuseaddr tcp:localhost:11433

Azure Data Studio는 다시 시작한 후 즉시 연결하여 문제 없이 데이터베이스 목록을 가져오며 쿼리가 제대로 작동합니다.

Azure Data Studio를 닫고 교환된 매개 변수를 사용하여 socat를 다시 시작하면 이 문제가 다시 발생합니다. 연결이 거의 작동하지 않습니다.

따라서 socat의 매개변수 순서는 다음과 같습니다.하다정말 중요합니다. 내가 미쳤어? 내가 여기서 무엇을 놓치고 있는 걸까요?

나는 알고있다https://learn.microsoft.com/en-us/azure-data-studio/download-azure-data-studio?tabs=win-install%2Cwin-user-install%2Credhat-install%2Cwindows-uninstall%2Credhat- 제거#install-azure-data-studio리눅스용 설치 가이드가 있습니다. 내 질문은 이것에 관한 것이 아니라 socat에 관한 것입니다. 매번 동작을 재현할 수 있는 예일 뿐입니다.

답변1

그걸 눈치채셨나요?

주장의 순서는 중요하지 않습니다. 저는 종종 다른 출처에서 같은 내용을 읽습니다.

socat흥미롭게도 ( )에 대한 문서는 man socat다음과 같이 일치하지 않을 수 있습니다.

열기 단계에서 socat은 첫 번째 주소를 연 다음 두 번째 주소를 엽니다. 이러한 단계는 일반적으로 차단됩니다. 따라서 특히 양말과 같은 복잡한 주소 유형의 경우 다음 단계를 시작하기 전에 연결 요청 또는 인증 대화가 완료되어야 합니다.

이는 현재 보고 있는 동작 중 적어도 일부를 설명할 수 있습니다. 이상적으로는 원격 서비스에 연결을 시도하기 전에 청취 소켓에 연결해야 합니다. 그렇지 않고 로컬 소켓에서 연결 요청을 실행하기 전에 원격 서비스에 연결하면 원격 측에서 유휴 시간 초과가 발생할 수 있습니다.

  • 먼저 로컬, 그다음 원격:

    socat -v tcp-listen:1433,bind=0.0.0.0,fork,reuseaddr tcp:localhost:11433  # Yes
    
  • 먼저 원격으로, 그다음 로컬로:

    socat -v tcp:localhost:11433 tcp-listen:1433,bind=0.0.0.0,fork,reuseaddr  # No
    

관련 정보