GNU/Linux >> Belajar Linux >  >> Linux

Apakah mungkin untuk mengekspos terowongan TCP di Linux sebagai perangkat karakter khusus?

socat dapat melakukan ini dan banyak hal lainnya dengan hal-hal yang menyerupai "aliran"

Sesuatu yang menggunakan ide dasar ini seharusnya melakukannya untuk Anda:

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

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

(diadaptasi dari Halaman Contoh)

Jika Anda ingin mengenkripsi, Anda dapat menggunakan variasi ssl-l:54321,reuseaddr,cert=server.pem,cafile=client.crt,fork di mesin1, dan sesuatu seperti ssl:server-host:1443,cert=client.pem,cafile=server.crt di mesin2

(Selengkapnya tentang socat ssl)


Penyampaian pesan perlu diimplementasikan pada lapisan yang lebih tinggi; TCP tidak memiliki gagasan tentang pesan -- koneksi TCP mentransfer aliran oktet.

Anda dapat mencapai sesuatu seperti yang Anda minta dengan nc dan pipa bernama, lihat man mkfifo; atau centang socat seperti yang ditunjukkan oleh Alex Stragies.

Tanpa layanan lapisan tengah, masalah dasarnya adalah (1) bahwa data tidak dapat ditulis ke jaringan kecuali ada seseorang di sisi lain yang mendengarkannya, dan (2) bahwa koneksi TCP bersifat dua arah.

Karena Anda tidak dapat menulis data ke jaringan kecuali seseorang sedang mendengarkannya, Anda harus selalu memulai pendengar sebelum Anda dapat mengirim data. (Dalam sistem pengiriman pesan, proses yang menangani pesan akan menyediakan semacam buffering.)

Contoh Anda dapat dengan mudah ditulis ulang:

  • Pertama, mulai pendengar di mesin2 (tujuan):

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

    Dalam contoh Anda, ini akan menjadi

     nc -l 1234 | cat
    

    Ini akan memblokir dan menunggu seseorang mengirim beberapa data ke port 1234.

  • Kemudian Anda dapat mengirim beberapa data dari machine1 (sumber):

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

    Dalam contoh Anda, ini akan menjadi

     echo "Hello" | nc machine2 1234
    

Jika Anda ingin memproses data yang diterima dengan cara tertentu dan merespons, Anda dapat menggunakan fasilitas coprocessing dari shell. Misalnya, ini adalah server web yang sangat sederhana (dan sangat keras kepala):

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

Lihat bagaimana komunikasi dua arah dicapai antara badan utama skrip dan koproses menggunakan deskriptor file dalam larik $ncfd .


Jika Anda hanya ingin menghubungkan dua komputer menggunakan program dasar seperti nc, Anda dapat mengalihkan dari/ke /dev/tcp/<host>/<port> .

Ini bukan perangkat sebenarnya tetapi fiksi yang dibuat oleh bash, jadi hal-hal seperti cat /dev/tcp/foo/19 tidak akan berfungsi, tetapi cat < /dev/tcp/foo/19 akan.


Linux
  1. Linux – Sysfs dan Devtmpfs?

  2. Apa Karakter Khusus Dan Blokir File Khusus Dalam Sistem Unix??

  3. Perintah gema Linux

  1. Apa cara termudah untuk mengendus data lalu lintas TCP di Linux?

  2. Enkripsi partisi yang ada di Linux sambil mempertahankan datanya

  3. Bagaimana cara memasang perangkat di Linux?

  1. Linux – Pemulihan Data Setelah Menyalin File ke Blokir Perangkat?

  2. echo Contoh Perintah di Linux

  3. Kemungkinan untuk membatalkan shutdown di Linux?