GNU/Linux >> Tutoriales Linux >  >> Linux

¿Es posible exponer el túnel TCP en Linux como dispositivo de caracteres especiales?

socat puede hacer esto y muchas otras cosas con cosas que se asemejan a "flujos"

Algo que use esta idea básica debería funcionar por ti:

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

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

(adaptado de la página de ejemplos)

Si desea cifrar, puede usar una variación de ssl-l:54321,reuseaddr,cert=server.pem,cafile=client.crt,fork en máquina1, y algo como ssl:server-host:1443,cert=client.pem,cafile=server.crt en máquina2

(Más sobre socat ssl)


El paso de mensajes debe implementarse en una capa superior; TCP no tiene una noción de mensaje:las conexiones TCP transfieren flujos de octetos.

Puede lograr algo parecido a lo que solicita con nc y canalizaciones con nombre, consulte man mkfifo; o marque socat como indica Alex Stragies.

Sin un servicio de capa intermedia, los problemas básicos son (1) que los datos no se pueden escribir en la red a menos que haya alguien en el otro extremo escuchando y (2) que las conexiones TCP son bidireccionales.

Debido a que no puede escribir datos en la red a menos que alguien los esté escuchando, siempre debe iniciar el oyente antes puedes enviar datos. (En un sistema de paso de mensajes, el proceso que maneja los mensajes proporcionará algún tipo de almacenamiento en búfer).

Su ejemplo se puede reescribir fácilmente:

  • Primero inicie un oyente en la máquina2 (el destino):

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

    En tu ejemplo, esto sería

     nc -l 1234 | cat
    

    Esto bloqueará y esperará a que alguien envíe algunos datos al puerto 1234.

  • Luego puede enviar algunos datos desde la máquina 1 (la fuente):

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

    En tu ejemplo, esto sería

     echo "Hello" | nc machine2 1234
    

Si desea procesar los datos recibidos de alguna manera y responder, puede usar la función de coprocesamiento del shell. Por ejemplo, este es un servidor web muy simple (y muy obstinado):

#! /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

Vea cómo se logra la comunicación bidireccional entre el cuerpo principal del script y el coproceso utilizando los descriptores de archivo en la matriz $ncfd .


Si simplemente desea conectar dos computadoras usando un programa básico como nc, puede redirigir desde/hacia /dev/tcp/<host>/<port> .

Estos no son dispositivos reales sino una ficción creada por bash, así que cosas como cat /dev/tcp/foo/19 no funcionará, pero cat < /dev/tcp/foo/19 voluntad.


Linux
  1. ¿Qué son los archivos especiales de caracteres y bloques especiales en un sistema Unix?

  2. Comando de eco de Linux

  3. Posible usar un .dll en Linux

  4. ¿Cuál es la forma más fácil de detectar datos de tráfico TCP en Linux?

  5. aumento del volumen del sonido más allá del 100% siempre que sea posible en Linux

Comando Echo en Linux (con ejemplos)

16 ejemplos de comandos de eco en Linux

Comando Echo en Linux con ejemplos

Todo es archivo en Linux – Parte 1

Linux Mint KDE todavía es posible

¿Cómo montar un dispositivo en Linux?