Telnet je mrežni protokol koji omogućava daljinski pristup računaru, uspostavljajući dvosmernu tekstualnu komunikaciju. Za ovu svrhu, neophodni su vam telnet server i klijent, kako bi komunikacija bila moguća.
Telnet je bio popularan alat u Linux/Windows okruženjima, dugo služeći svojoj nameni. Međutim, glavni problem sa telnetom u savremenim sistemima jeste njegova nebezbednost. Celokupna komunikacija u telnetu odvija se u nešifrovanom, običnom tekstu, čineći mrežni saobraćaj ranjivim. Svako sa odgovarajućim pristupom i alatima može pratiti mrežni saobraćaj i čitati podatke. Zbog toga većina modernih Linux operativnih sistema ne dolazi sa predinstaliranim telnetom, a preporuka je da se on izbegava.
Sa pojavom SSH (Secure Shell) protokola, koji predstavlja šifrovanu zamenu za telnet, originalna upotreba telneta je odavno zastarela. Međutim, postoji alternativna upotreba telneta koju mnogi sistemski administratori i tehnološki entuzijasti i dalje koriste, a to je provera povezanosti udaljenih TCP portova.
Pomoću telnet komande, lako možete proveriti da li udaljeni TCP port reaguje i sluša na zahtev. Ispod je prikazano kako možemo proveriti da li je google.com dostupan, proveravajući HTTP/HTTPS vezu.
$ telnet google.com 80 Trying 142.250.183.206... Connected to google.com. Escape character is '^]'. ^] telnet> quit Connection closed. $ $ telnet google.com 443 Trying 142.250.183.206... Connected to google.com. Escape character is '^]'. ^] telnet> quit Connection closed. $
TCP port koji nije otvoren ili dostupan će se ponašati na sledeći način kada se proveri pomoću telneta:
$ telnet google.com 22 Trying 142.250.193.174... ^C $
Ovo pojednostavljuje rešavanje jednostavnih problema sa mrežnim povezivanjem, u kombinaciji sa komandama kao što su ping, traceroute ili tracepath, netstat itd.
Ako koristite RHEL 8 (ili čak starije verzije RHEL/CentOS), imate opciju da koristite `nc` (ili Ncat, ili Network Connector), alat koji podržava mnoge opcije vezane za dijagnostiku mreže. U nastavku ćemo razmotriti kako instalirati i koristiti ovaj alat na RHEL8 i sličnim sistemima.
Šta je `nc`?
`nc` (ili Ncat) je popularan alat komandne linije opšte namene, koji se koristi za čitanje, pisanje, preusmeravanje i šifrovanje podataka preko mreže. Prvobitno razvijen za nmap projekat, sada postoji više implementacija Netcat-a. Radi sa TCP i UDP protokolima, preko IPv4 i IPv6, i pruža širok spektar potencijalnih slučajeva upotrebe.
Ispod su neke od glavnih karakteristika `nc` alata:
- Sposobnost povezivanja programa (kao cevi)
- Preusmeravanje TCP, UDP i SCTP portova na druge lokacije
- Šifrovanje komunikacije uz SSL podršku
- Podrška za proxy preko SOCKS4/5 ili HTTP proxy-a (uključujući autentifikaciju)
- Podrška za više platformi, uključujući Windows, Linux i macOS
Instaliranje `nc`
`nc` je dostupan kao deo podrazumevanih repozitorijuma u RHEL sistemima. Za instaliranje na RHEL 7 sistemu, jednostavno unesite sledeću komandu u terminal:
$ sudo yum install -y nc
Za RHEL 8 sistem, možete koristiti `dnf` na sledeći način:
$ sudo dnf install -y nc
Provera TCP Povezivanja
Iako `nc` nudi brojne funkcije koje podržavaju različite scenarije upotrebe, jedna od najčešćih je dijagnostika mrežnih problema, kao alternativa telnetu.
`nc` može da pokaže da li možete da pristupite TCP portu. Sintaksa je sledeća:
$ nc -vz <IP/DNS> <Port>
Na primer, ako želimo da proverimo da li je sajt techblog.co.rs.com dostupan putem HTTP ili HTTPS protokola, možemo to uraditi koristeći `nc` kao što je prikazano ispod (port 80 je za HTTP, dok je 443 za HTTPS):
$ nc -vz techblog.co.rs.com 80 Ncat: Version 7.70 ( https://nmap.org/ncat ) Ncat: Connected to 104.26.11.88:80. Ncat: 0 bytes sent, 0 bytes received in 0.02 seconds. $ $ nc -vz techblog.co.rs.com 443 Ncat: Version 7.70 ( https://nmap.org/ncat ) Ncat: Connected to 104.26.10.88:443. Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds. $
Slično tome, nedostupan ili blokiran port će prikazati izlaz poput ovog (proverava se više adresa jer DNS za techblog.co.rs.com pokazuje na više IP adresa):
$ nc -vz techblog.co.rs.com 22 Ncat: Version 7.70 ( https://nmap.org/ncat ) Ncat: Connection to 172.67.70.213 failed: Connection timed out. Ncat: Trying next address... Ncat: Connection to 104.26.11.88 failed: Connection timed out. Ncat: Trying next address... Ncat: Connection to 104.26.10.88 failed: Connection timed out. Ncat: Trying next address... Ncat: Connection to 2606:4700:20::681a:a58 failed: Network is unreachable. Ncat: Trying next address... Ncat: Connection to 2606:4700:20::681a:b58 failed: Network is unreachable. Ncat: Trying next address... Ncat: Network is unreachable. $ $ dig techblog.co.rs.com +short 104.26.10.88 172.67.70.213 104.26.11.88 $
Provera UDP Povezivanja
Dok telnet može proveriti komunikaciju samo sa udaljenim TCP portom, `nc` vam omogućava da proverite i TCP i UDP povezivanje.
`nc` može jednostavno slati UDP pakete umesto podrazumevanih TCP, koristeći sledeću komandu:
$ nc -vzu <IP/DNS> <Port>
Međutim, UDP je protokol bez sesije, za razliku od TCP-a, pa se stoga, ne može potvrditi end-to-end UDP konekcija u svim mogućim scenarijima samo slanjem UDP paketa sa jedne strane. Jedino ako proces koji sluša na udaljenoj strani pošalje neki odgovor, `nc` neće moći da proceni da li je poslati paket stigao do odredišta ili ne. Međutim, `nc` nudi alternativu za određivanje end-to-end UDP povezivanja pokretanjem UDP slušaoca, pod pretpostavkom da imate ispravan pristup CLI na udaljenom serveru.
Dakle, pretpostavimo da treba da proverite UDP povezanost između dva Linux hosta za DNS koristeći `nc`. Jednostavan način da to uradite bio bi da pokrenete slušanje `nc` servera na potrebnom portu:
$ sudo nc -ul <Port>
Za DNS, potrebno je da proverimo port 53, pa bi gornja komanda bila:
$ nc -ul 53
Na strani klijenta, trebalo bi da pokrenete drugi `nc` proces koji šalje UDP pakete serveru:
$ nc -u <IP/DNS> <Port>
Što bi našu komandu učinilo:
$ nc -u <IP/DNS> 53
Pod pretpostavkom da ništa ne blokira UDP saobraćaj za port 53 između ove dve mašine, sve što unesete i pošaljete na jednoj mašini trebalo bi da bude vidljivo na drugom hostu kao dvosmerno ćaskanje. Ako to nije slučaj, neki zaštitni zid blokira vezu između ova dva sistema.
Model servera i klijenta koji koristi `nc` radi besprekorno za ove vrste jednostavnih provera povezivanja između hostova. Kao i gore prikazana UDP provera, `nc` takođe može da sluša TCP pakete na datom portu:
$ sudo nc -l <Port>
Na strani klijenta, možete normalno slati TCP pakete kako biste proverili povezanost:
$ nc <IP/DNS> <Port>
Gore navedeni `nc` server/klijent metod nije potreban u slučaju TCP veza (za razliku od UDP-a) jer je to protokol orijentisan na vezu i radi sa potvrdama. Svaki proces slušanja koji radi na TCP-u će direktno odgovoriti na `nc` TCP pakete.
Rezime
Ovaj članak je sumirao kako `nc` alat stoji kao direktna zamena za telnet u modernim Linux sistemima u smislu provere povezanosti portova i pruža mnogo više mogućnosti krajnjem korisniku u dijagnostici i rešavanju mrežnih problema.
Pomoći za `nc` se može pristupiti pomoću komande `nc -h`:
$ nc -h Ncat 7.70 ( https://nmap.org/ncat ) Usage: ncat [options] [hostname] [port] Options taking a time assume seconds. Append 'ms' for milliseconds, 's' for seconds, 'm' for minutes, or 'h' for hours (e.g. 500ms). -4 Use IPv4 only -6 Use IPv6 only -U, --unixsock Use Unix domain sockets only -C, --crlf Use CRLF for EOL sequence -c, --sh-exec <command> Executes the given command via /bin/sh -e, --exec <command> Executes the given command --lua-exec <filename> Executes the given Lua script -g hop1[,hop2,...] Loose source routing hop points (8 max) -G <n> Loose source routing hop pointer (4, 8, 12, ...) -m, --max-conns <n> Maximum <n> simultaneous connections -h, --help Display this help screen -d, --delay <time> Wait between read/writes -o, --output <filename> Dump session data to a file -x, --hex-dump <filename> Dump session data as hex to a file -i, --idle-timeout <time> Idle read/write timeout -p, --source-port port Specify source port to use -s, --source addr Specify source address to use (doesn't affect -l) -l, --listen Bind and listen for incoming connections -k, --keep-open Accept multiple connections in listen mode -n, --nodns Do not resolve hostnames via DNS -t, --telnet Answer Telnet negotiations -u, --udp Use UDP instead of default TCP --sctp Use SCTP instead of default TCP -v, --verbose Set verbosity level (can be used several times) -w, --wait <time> Connect timeout -z Zero-I/O mode, report connection status only --append-output Append rather than clobber specified output files --send-only Only send data, ignoring received; quit on EOF --recv-only Only receive data, never send anything --allow Allow only given hosts to connect to Ncat --allowfile A file of hosts allowed to connect to Ncat --deny Deny given hosts from connecting to Ncat --denyfile A file of hosts denied from connecting to Ncat --broker Enable Ncat's connection brokering mode --chat Start a simple Ncat chat server --proxy <addr[:port]> Specify address of host to proxy through --proxy-type <type> Specify proxy type ("http" or "socks4" or "socks5") --proxy-auth <auth> Authenticate with HTTP or SOCKS proxy server --ssl Connect or listen with SSL --ssl-cert Specify SSL certificate file (PEM) for listening --ssl-key Specify SSL private key (PEM) for listening --ssl-verify Verify trust and domain name of certificates --ssl-trustfile PEM file containing trusted SSL certificates --ssl-ciphers Cipherlist containing SSL ciphers to use --ssl-alpn ALPN protocol list to use. --version Display Ncat's version information and exit See the ncat(1) manpage for full options, descriptions and usage examples $
Za detaljnije informacije o `nc` komandi, pogledajte njenu stranicu priručnika.
$ man nc