socat을 사용하여 base64 디코딩 프록시를 구현하는 방법은 무엇입니까?

socat을 사용하여 base64 디코딩 프록시를 구현하는 방법은 무엇입니까?

목표: 들어오는 데이터를 단방향으로 디코딩하는 동안 양방향 통신

이론: 포트 8080에서 수신 대기하는 프록시/서버가 있고 여러 클라이언트를 동시에 처리해야 한다고 가정합니다. 들어오는 데이터는 Base64로 인코딩되며 디코딩되어 다른 포트(80)로 전달되어야 합니다.

연습: 저는 socat의 모든 기능 때문에 사용하고 싶습니다(또한 이 모든 기능을 수행할 수 있는 유일한 제품이기 때문에, 다른 것을 알고 있다면 작동할 것입니다).

  • TCP에서 TCP로
  • UDP에서 TCP로
  • 포크와 재사용 주소
  • 주문 실행

나는 비슷한 것을 찾고 있습니다 :

socat tcp-listen:8080,reuseaddr,fork exec:/path/to/myscript.sh

/path/to/myscript.sh 사용:

#!/bin/sh
exec base64 -d | socat - tcp:localhost:80

하지만 불행히도 이것은 완전히 양방향이 아니기 때문에 제 경우에는 작동하지 않습니다.

답변1

귀하의 주요 문제는 아마도 base64 -d( base64나의 경우 GNU) 출력을 버퍼링하는 것이며, 외관상으로는 그렇게 하지 말라고 말할 수 없습니다. openssl base64 -d내 테스트도 마찬가지다. 그러나 recodeGNU에게 버퍼링을 위해 GNU를 사용하지 않도록 지시하는 것은 가능합니다 stdbuf.

따라서 socat2의 경우 다음을 수행할 수 있어야 합니다.

socat tcp-listen:8080,fork,reuseaddr \
      'exec1:stdbuf -o0 recode /b64 % nop | tcp:localhost:80'

1을 사용하면 socat다음을 수행할 수 있습니다.

socat tcp-listen:8080,fork,reuseaddr \
      'system:"stdbuf -o0 recode /b64 | socat - tcp:localhost:80"'

이것은 본질적으로 귀하의 것과 동일하지만 중간 스크립트 인라인(및 버퍼링되지 않은 Base64 디코딩)이 있습니다.

관련 정보