GNU/Linux >> Znalost Linux >  >> Linux

Je možné vystavit TCP tunel v Linuxu jako speciální znakové zařízení?

socat může dělat toto a mnoho dalších věcí s věcmi připomínajícími „proudy“

Něco využívající tuto základní myšlenku by to mělo udělat za vás:

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

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

(převzato ze stránky Příklady)

Pokud chcete šifrovat, můžete použít variantu ssl-l:54321,reuseaddr,cert=server.pem,cafile=client.crt,fork na stroji1 a něco jako ssl:server-host:1443,cert=client.pem,cafile=server.crt na stroji2

(Více o socat ssl)


Předávání zpráv musí být implementováno na vyšší vrstvě; TCP nemá pojem zprávy -- TCP spojení přenášejí proudy oktetů.

Pomocí nc můžete dosáhnout něčeho podobného, ​​co požadujete a pojmenované kanály, viz man mkfifo; nebo zaškrtněte socat jak naznačuje Alex Stragies.

Bez služby střední vrstvy jsou základní problémy (1) že data nelze zapisovat do sítě, pokud je někdo na druhém konci neposlouchá, a (2) že TCP spojení jsou obousměrná.

Protože nemůžete zapisovat data do sítě, pokud je někdo neposlouchá, musíte posluchače vždy spustit před můžete odesílat data. (V systému předávání zpráv bude proces zpracovávající zprávy poskytovat určitý druh ukládání do vyrovnávací paměti.)

Váš příklad lze snadno přepsat:

  • Nejprve spusťte posluchače na počítači2 (cíl):

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

    Ve vašem příkladu by to bylo

     nc -l 1234 | cat
    

    Tím se zablokuje a počká, až někdo pošle nějaká data na port 1234.

  • Poté můžete odeslat některá data ze stroje1 (zdroj):

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

    Ve vašem příkladu by to bylo

     echo "Hello" | nc machine2 1234
    

Pokud chcete přijatá data nějakým způsobem zpracovat a odpovědět, můžete použít koprocesní zařízení shellu. Toto je například velmi jednoduchý (a velmi tvrdohlavý) webový server:

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

Podívejte se, jak je dosaženo obousměrné komunikace mezi hlavní částí skriptu a koprocesem pomocí deskriptorů souborů v poli $ncfd .


Pokud chcete jednoduše propojit dva počítače pomocí základního programu, jako je nc, můžete přesměrovat z/do /dev/tcp/<host>/<port> .

Toto nejsou skutečná zařízení, ale fikce vytvořená bash, takže věci jako cat /dev/tcp/foo/19 nebude fungovat, ale cat < /dev/tcp/foo/19 bude.


Linux
  1. Linux – Sysfs a Devtmpfs?

  2. Co jsou speciální znaky a speciální soubory bloků v systému Unix?

  3. Linuxový příkaz echo

  1. Příklady příkazů echo v Linuxu

  2. Je možné přerušit vypnutí na Linuxu?

  3. Zašifrujte existující oddíl v Linuxu při zachování jeho dat

  1. Jak nainstalovat ovladač zařízení v systému Linux

  2. je možné probudit linuxové zařízení v určitou dobu

  3. Jak připojit zařízení v Linuxu?