Тражите телнет на РХЕЛ 8? Покушајте нц

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