Linux'ta TCP tünelini özel karakter cihazı olarak göstermek mümkün müdür?


10

Son zamanlarda QNX belgelerinde seri cihaz ( dev/serX) kullanarak ayrı fiziksel makinelerde işlemler arasında mesaj tabanlı IPC kurmaya izin verdiğini buldum ve beni merak etti:

Linux'ta TCP / UDP tüneli için sistem çapında özel bir cihaz oluşturmak mümkün müdür? ncStdin / stdout gibi bir şey / dev / bir şey altında alenen ortaya çıktı.

Sonunda bir makinede böyle bir dosyaya bir şey yazmak ve diğer ucunda almak istiyorum örneğin:

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

#machine2:
cat < /dev/somedev

ncİnsana bir göz attım ama stio dışında io kaynağı / hedefi belirtmek için herhangi bir seçenek bulamadım.



1
Mansiyon ödülü: tun / tap cihazları / dev'de oluşturulabilir, ancak üzerlerinde IP kapsülleme yapmanız gerekir. Bazı amaçlar için son derece yararlıdır.
pjc50

Yanıtlar:


19

socat bunu ve diğer birçok şeyi "akarsu" ya benzeyen şeylerle yapabilir

Bu temel fikri kullanan bir şey sizin için yapmalıdır:

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

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

( Örnekler Sayfasından uyarlanmıştır )

Şifrelemek istediğiniz, bir varyasyonu kullanabilirsiniz ssl-l:54321,reuseaddr,cert=server.pem,cafile=client.crt,forkgibi makine1 üzerinde ve bir şey ssl:server-host:1443,cert=client.pem,cafile=server.crtmachine2 üzerinde

( Socat ssl hakkında daha fazla bilgi )


7

Mesaj geçirmenin daha yüksek bir katmana uygulanması gerekir; TCP'nin bir mesaj nosyonu yoktur - TCP bağlantıları sekizli akımları aktarır.

İstediğiniz ncve boru isimleri gibi bir şey elde edebilirsiniz , bakın man mkfifo; veya socatAlex Stragies'in işaret ettiği gibi kontrol edin .

Orta katman hizmeti olmadan, temel sorunlar (1) diğer ucunda dinleyen biri olmadığı sürece verilerin ağa yazılamaması ve (2) TCP bağlantılarının çift yönlü olmamasıdır.

Birisi dinlemediği sürece ağa veri yazamadığınız için, veri gönderebilmeniz için önce dinleyiciyi başlatmanız gerekir . (İleti geçirme sisteminde, iletileri işleme alma işlemi bir tür arabelleğe alma sağlar.)

Örneğiniz kolayca yeniden yazılabilir:

  • İlk olarak makinede bir dinleyici başlatın2 (hedef):

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

    Örneğinizde, bu

     nc -l 1234 | cat
    

    Bu, birisinin 1234 numaralı bağlantı noktasına veri göndermesini engelleyecek ve bekleyecektir.

  • Ardından machine1'den (kaynak) bazı veriler gönderebilirsiniz:

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

    Örneğinizde, bu

     echo "Hello" | nc machine2 1234
    

Alınan verileri bir şekilde işlemek ve yanıtlamak istiyorsanız kabuğun birlikte işleme tesisini kullanabilirsiniz. Örneğin, bu çok basit (ve çok inatçı) bir web sunucusudur:

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

Dizideki dosya tanımlayıcılarını kullanarak komut dosyasının ana gövdesi ile yardımcı işlem arasındaki çift yönlü iletişimin nasıl sağlandığını görün $ncfd.


Haklısın ve cevabında bunu kabul ettim. Bir tür aracı yazılım olmadan bir karakter cihazına sahip olamazsınız.
AlexP

Görünüşe göre orada bir UUOC var.
Michael Hampton

1
@MichaelHampton: OP tarafından sağlanan örnek buydu. Sanırım bu cat"stdin için bazı süreç okuma" anlamına geliyor.
AlexP

5

Eğer nc gibi basit bir program kullanarak iki bilgisayara bağlanmak istiyorsanız, / dan yöneltebilirsiniz /dev/tcp/<host>/<port>.

Bunlar gerçek cihazlar değil, bash tarafından yaratılan bir kurgu, bu yüzden işler cat /dev/tcp/foo/19işe yaramaz, ama işe cat < /dev/tcp/foo/19yarar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.