21 Oct 2007

NetCat, a przesyłanie plików.

NetCat (nc) jest narzędziem pozwalającym m.in transmitować dowolne dane (nie tylko tekstowe) korzystając z protokołów TCP i UDP, skanować porty zdalnych maszyn, tworzyć proste serwery usług i robić wiele innych fajnych rzeczy. Z racji swojej niewielkiej objętości często jest określany scyzorykiem szwajcarskim ... ale nie o tym miałem pisać, każdy kogo zainteresowały dodatkowe opcje nc niech spojrzy do manuala i do licznych przykładów wykorzystania tego programu dostępnych przez Google.

Ja w tej krótkiej notce chciałbym pokazać, że istnieje alternatywny (dla FTP i SCP) sposób transferu dużych plików przez sieć lokalną (nie polecam przesyłać w taki sposób danych przez internet ponieważ nie ma wznawiania transmisji i dane nie są w żaden sposób szyfrowane przez program nc).

A więc po kolei, dla NetCata nie ma znaczenia skąd przychodzą dane i gdzie są wysyłane dopóki jest to możliwe. Program może działać zarówno jako klient jak i serwer. Pora przejść do praktyki:

Serwer do którego przesyłamy ma ip zewnętrzne

Sytuacja taka ma miejsce gdy maszyna na której uruchomiliśmy NetCata jako serwer (punkt docelowy dla danych, które przesyłamy) jest widoczna przez klienta (drugi komputer)

serwer: (punkt docelowy dla danych):

nc -l -p 6666 | tar xvfp -
Notka:Jeśli nie masz praw administratora systemu to jest wątpliwe by udało Ci się uruchomić nasłuchiwanie na porcie niższym niż 1024.
Notka:W tym przypadku serwerem jest maszyna odbierająca dane.

klient (źródło danych):

tar cfp - /katalog/do/przeslania | nc -w 3 ip_serwera_nc 6666
i właściwie nasze dane sa już przesyłane. Notka:Operacja nie zawsze się powiedzie ponieważ jeśli na komputerze będącym serwerem mamy zablokowane porty (np przez iptables) to zadne dane do naszego serwera nie dotrą, ponieważ zostaną odrzucone przez firewall.

Klient ma zewnętrzne ip

Sytuacja taka ma miejsce, gdy punkt docelowy dla danych jest np za firewallem i nijak nie możemy się z nim skomunikować bezpośrednio, ale sami mamy ip widoczne (np zewnętrzne) z punktu docelowego

serwer (źródło danych)

tar cvfp - . | nc -w 3 -l -p 6666

klient (punkt docelowy dla danych):

nc adres_ip_serwera 6666 | tar xvfp -

Oba komputery znajdują się za NATem

Posiadamy dostęp do trzeciego komputera z ip zewnętrznym

Wydaje się, że jest to sytuacja patowa, ale gdy mamy dostęp do zewnętrznego komputera z Linuxem i ten komputer stoi na w miarę dobrym łączu, możemy obejść tą niedogodność niewielkim kosztem (generując dosyć znaczny ruch z maszyny z ip zewnętrznym)

Konfiguracja maszyny z ip zewnętrznym (nazwijmy ją przesiadkową)

nc -w 3 -l -p 6666 | nc -w 3 -l -p 6667 6668
Notka: Uruchamiamy tutaj podwójny serwer nc, który transmituje nam ruch pomiędzy maszynami, ale to nie wszystko zabawa się zaczyna gdy pomiędzy dwa serwery nc damy polecenie tee dodatkowo duplikujące dane przychodzące z pipe do pliku zewnętrznego (jednym słowem za jednym przesłaniem danych mamy je na dwóch maszynach - przesiadkowej i docelowej). Ale to chyba nie jest tak naprawdę interesujące.

klient (źródło danych):

tar cfp - dane_do_poslania | nc -w 3 ip_serwera 6666

klient (punkt docelowy dla danych):

nc ip_serwera 6667 6668 | tar xvfp -
Notka:Ten sposób działa ale dosyć dużym kosztem (podwaja ruch na maszynie przesiadkowej - dobrze by było gdyby miała łącze full duplex), ale można to zrobić lepiej poprzez tzw NAT Traversal ... ale o tym może innym razem.

1 comment:

  1. Na SUSE Linux nc jest instalowane standardowo, ale są dwie wersje:

    nc == package: "netcat-openbsd" - vanilla

    netcat == patchowana wersja oryginalnego netcata - ta jest domyślna package: "netcat"

    ReplyDelete