Linux에서 TCP 터널을 특수 문자 장치로 노출할 수 있습니까?

Linux에서 TCP 터널을 특수 문자 장치로 노출할 수 있습니까?

최근 QNX 문서에서 직렬 장치()를 사용하여 별도의 물리적 시스템에 있는 프로세스 간에 메시지 기반 IPC를 설정할 수 있다는 사실을 발견했는데, dev/serX이것이 궁금했습니다.

Linux에서 TCP/UDP 터널링을 위한 시스템 전체의 특수 장치를 만드는 것이 가능합니까? stdin/stdout 과 같은 것들은 nc/dev/something 아래에 공개적으로 노출됩니다.

궁극적으로 나는 한 컴퓨터에서 그러한 파일에 무언가를 쓰고 다른 쪽 끝에서 이를 받을 수 있기를 원합니다. 예를 들면 다음과 같습니다.

#machine1:
echo "Hello" > /dev/somedev

#machine2:
cat < /dev/somedev

나는 man을 보았지만 ncstdio 이외의 io 소스/대상을 지정하는 옵션을 찾지 못했습니다.

답변1

socat"스트림"과 같은 것을 사용하면 이 작업과 다른 많은 작업을 수행할 수 있습니다.

이 기본 아이디어를 사용하면 다음과 같은 작업을 수행할 수 있습니다.

Machine1$ socat tcp-l:54321,reuseaddr,fork pty,link=/tmp/netchardev,waitslave

Machine2$ socat pty,link=/tmp/netchardev,waitslave tcp:machine1:54321

(에서 적응샘플 페이지)

암호화를 원하면 ssl-l:54321,reuseaddr,cert=server.pem,cafile=client.crt,forkmachine1에서 변형을 사용할 수 있고 ssl:server-host:1443,cert=client.pem,cafile=server.crtmachine2에서는 이와 같은 것을 사용할 수 있습니다.

(자세한 내용은소카트 SSL)

답변2

메시지 전달은 상위 계층에서 구현되어야 합니다. TCP에는 메시지 개념이 없습니다. TCP 연결은 옥텟 스트림을 전달합니다.

요청한 것과 유사한 것을 구현할 수 nc있으며명명된 파이프, 시청 man mkfifo하거나 socatAlex Stragies의 지시에 따라 확인해 보세요.

중간 계층 서비스가 없으면 기본적인 문제는 (1) 누군가 상대방에서 수신하지 않는 한 네트워크에 데이터를 쓸 수 없다는 것과 (2) TCP 연결이 양방향이라는 것입니다.

누군가 듣고 있지 않으면 네트워크에 데이터를 쓸 수 없기 때문에 항상 수신기를 시작해야 합니다.앞으로데이터를 보낼 수 있습니다. (메시징 시스템에서 메시지를 처리하는 프로세스는 일종의 버퍼링을 제공합니다.)

귀하의 예는 쉽게 다시 작성할 수 있습니다.

  • 먼저 machine2(대상)에서 리스너를 시작합니다.

     nc -l 1234 | ...some processing with the received data...
    

    귀하의 예에서 이것은

     nc -l 1234 | cat
    

    이렇게 하면 누군가가 포트 1234로 일부 데이터를 보낼 때까지 차단되고 기다립니다.

  • 그런 다음 machine1(소스)에서 일부 데이터를 보낼 수 있습니다.

    ...make up some data... | nc machine2 1234
    

    귀하의 예에서 이것은

     echo "Hello" | nc machine2 1234
    

수신된 데이터를 처리하고 어떤 방식으로든 응답하려면 셸의 공동 처리 기능을 사용할 수 있습니다. 예를 들어, 다음은 매우 단순하고 완고한 웹 서버입니다.

#! /bin/bash

while :; do
  coproc ncfd { nc -l 1234; }
  while :; do
    read line <&${ncfd[0]} || break
    line="$(
      echo "$line" |
      LC_ALL=C tr -cd ' -~'
    )"
    echo >&2 "Received: \"$line\""
    if [ "$line" = "" ]; then
      echo >&${ncfd[1]} "HTTP/1.0 200 OK"
      echo >&${ncfd[1]} "Content-Type: text/html"
      echo >&${ncfd[1]} "Connection: close"
      echo >&${ncfd[1]} ""
      echo >&${ncfd[1]} "<title>It works!</title>"
      echo >&${ncfd[1]} "<center><b>It works!</b></center>"
      echo >&${ncfd[1]} "<center>-- $(date +%Y-%m-%d\ %H:%M:%S) --</center>"
      break
    fi
  done
  kill %%
  sleep 0.1
done

배열에서 파일 설명자를 사용하여 스크립트 본문과 공동 프로세스 간의 양방향 통신을 구현하는 방법을 알아보세요 $ncfd.

답변3

nc와 같은 기본 프로그램을 사용하여 두 대의 컴퓨터를 연결하려는 경우 에서/로 리디렉션할 수 있습니다 /dev/tcp/<host>/<port>.

이는 실제 장치가 아니라 bash에 의해 생성된 가상의 장치이므로 이와 유사한 것은 cat /dev/tcp/foo/19작동하지 않지만 cat < /dev/tcp/foo/19작동할 것입니다.

관련 정보