Ψάχνετε για telnet στο RHEL 8; Δοκιμάστε το nc

Το Telnet είναι ένα πρωτόκολλο δικτύου που χρησιμοποιείται για την απομακρυσμένη πρόσβαση σε έναν υπολογιστή και παρέχει αμφίδρομη επικοινωνία που βασίζεται σε κείμενο. Χρειάζεστε λοιπόν έναν διακομιστή telnet και έναν πελάτη για να συνομιλούν μεταξύ τους.

Το Telnet είναι ένα από τα δημοφιλή βοηθητικά προγράμματα Linux/Windows που έχει από καιρό εξυπηρετήσει το σκοπό του.

Ένα σημαντικό πρόβλημα με το telnet στα σύγχρονα συστήματα είναι ότι δεν είναι ασφαλές. Όλη η επικοινωνία στο telnet γίνεται σε απλό κείμενο και όλη η κίνηση δικτύου είναι μη κρυπτογραφημένη. Ουσιαστικά οποιοσδήποτε έχει σωστή πρόσβαση και εργαλεία μπορεί να παρακολουθεί την κυκλοφορία του δικτύου για να διαβάσει αυτήν την κίνηση. Ως εκ τούτου, τα περισσότερα σύγχρονα λειτουργικά συστήματα Linux δεν διαθέτουν προεγκατεστημένο telnet και άλλοι συνιστούν να μην το χρησιμοποιήσετε.

Με την έλευση του πρωτοκόλλου SSH ή Secure Shell, το οποίο είναι κάτι περισσότερο από μια κρυπτογραφημένη αντικατάσταση του telnet, η χρήση του telnet για τον προορισμό του είναι από καιρό ξεπερασμένη. Αλλά υπάρχει μια εναλλακτική χρήση του telnet που εξακολουθούν να χρησιμοποιούν πολλοί διαχειριστές συστήματος και λάτρεις της τεχνολογίας, η οποία είναι να ελέγχουν τη συνδεσιμότητα απομακρυσμένων θυρών TCP.

Κάποιος μπορεί απλά να ελέγξει εάν η απομακρυσμένη θύρα TCP ακούει και ανταποκρίνεται σωστά χρησιμοποιώντας την εντολή telnet. Το παρακάτω απόσπασμα δείχνει πώς μπορούμε να ελέγξουμε εάν το google.com λειτουργεί και λειτουργεί ελέγχοντας τη συνδεσιμότητα HTTP/HTTPS.

$ 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 που δεν είναι ανοιχτή ή προσβάσιμη θα συμπεριφέρεται όπως παρακάτω όταν ελέγχεται με telnet:

$ telnet google.com 22
Trying 142.250.193.174...
^C
$

Αυτό καθιστά εύκολη την αντιμετώπιση προβλημάτων με απλά ζητήματα συνδεσιμότητας δικτύου σε συνδυασμό με εντολές ping, traceroute ή tracepath, netstat κ.λπ.

Εάν χρησιμοποιείτε RHEL 8 (ή ακόμα και παλαιότερες εκδόσεις του RHEL/CentOS), έχετε την επιλογή να χρησιμοποιήσετε nc (ή Ncat ή Network Connector), το οποίο υποστηρίζει πολλές επιλογές που σχετίζονται με διαγνωστικά δικτύου. Θα συζητήσουμε πώς να εγκαταστήσετε και να χρησιμοποιήσετε αυτό το εργαλείο σε RHEL8 και παρόμοια συστήματα.

Τι είναι το nc;

Το nc (ή Ncat) είναι ένα δημοφιλές εργαλείο γραμμής εντολών γενικής χρήσης για ανάγνωση, εγγραφή, ανακατεύθυνση και κρυπτογράφηση δεδομένων σε ένα δίκτυο. Αρχικά γραμμένο για έργο nmap, υπάρχουν πλέον διαθέσιμες πολλές υλοποιήσεις Netcat. Λειτουργεί τόσο με TCP όσο και με UDP σε IPv4 και IPv6 και παρέχει απεριόριστες πιθανές περιπτώσεις χρήσης.

  9 καλύτερα εργαλεία παρακολούθησης πραγματικών χρηστών για τη βελτίωση της εμπειρίας χρήστη

Παρακάτω είναι μερικά από τα κύρια χαρακτηριστικά του βοηθητικού προγράμματος nc:

  • Δυνατότητα να αλυσοδένει ncats μαζί
  • Ανακατεύθυνση των θυρών TCP, UDP και SCTP σε άλλους ιστότοπους
  • Κρυπτογράφηση επικοινωνίας με υποστήριξη SSL
  • Υποστήριξη διακομιστή μεσολάβησης μέσω διακομιστή μεσολάβησης SOCK4/5 ή HTTP (συμπεριλαμβανομένου του ελέγχου ταυτότητας)
  • Υποστηρίζει πολλές πλατφόρμες, συμπεριλαμβανομένων των Windows, Linux και macOS

Εγκατάσταση nc

Το nc είναι διαθέσιμο ως μέρος των προεπιλεγμένων αποθετηρίων στα συστήματα RHEL. Για να το εγκαταστήσετε στο σύστημα RHEL 7, απλώς εκδώστε την παρακάτω εντολή στο τερματικό:

$ sudo yum install -y nc

Για το σύστημα RHEL 8, μπορείτε να χρησιμοποιήσετε το dnf ως:

$ sudo dnf install -y nc

Ελέγξτε τη Συνδεσιμότητα TCP

Αν και το nc προσφέρει μια σειρά από λειτουργίες που υποστηρίζουν έναν αριθμό περιπτώσεων χρήσης σε εφαρμογές, μία από τις συνηθισμένες είναι κατά την αντιμετώπιση προβλημάτων δικτύου στη θέση του telnet.

Το nc μπορεί να δείξει εάν μπορείτε να φτάσετε σε μια θύρα TCP. Εδώ είναι η σύνταξη:

$ nc -vz <IP/DNS> <Port>

Για παράδειγμα, εάν θέλω να ελέγξω αν μπορώ να φτάσω στο grtechpc.org μέσω http ή https. Μπορώ να ελέγξω ότι χρησιμοποιώντας το nc όπως φαίνεται παρακάτω (η θύρα 80 είναι για http ενώ η 443 για https):

$ nc -vz grtechpc.org.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 grtechpc.org.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.
$

Ομοίως, μια μη προσβάσιμη ή αποκλεισμένη θύρα θα εμφανίζει έξοδο όπως (πολλές διευθύνσεις ελέγχονται καθώς το grtechpc.org DNS οδηγεί σε πολλαπλές IP):

$ nc -vz grtechpc.org.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 grtechpc.org.com +short
104.26.10.88
172.67.70.213
104.26.11.88
$

Ελέγξτε τη συνδεσιμότητα UDP

Το telnet μπορεί να ελέγξει την επικοινωνία μόνο με μια απομακρυσμένη θύρα TCP, ενώ το nc σας επιτρέπει να ελέγξετε τη συνδεσιμότητα TCP καθώς και UDP.

Το nc μπορεί απλώς να στείλει πακέτα UDP αντί για προεπιλεγμένα πακέτα TCP χρησιμοποιώντας:

$ nc -vzu <IP/DNS> <Port>

Αλλά το UDP είναι πρωτόκολλο χωρίς συνεδρία, σε αντίθεση με το TCP, επομένως, ως εκ τούτου, δεν μπορείτε να επιβεβαιώσετε τη συνδεσιμότητα UDP από άκρο σε άκρο σε όλα τα πιθανά σενάρια απλώς στέλνοντας πακέτα UDP στο ένα άκρο, εκτός εάν η διαδικασία ακρόασης στο απομακρυσμένο άκρο στέλνει κάποια απόκριση, η nc δεν θα μπορεί να κρίνει αν το απεσταλμένο πακέτο έφτασε στον προορισμό ή όχι. Αλλά το nc προσφέρει μια εναλλακτική λύση για τον προσδιορισμό της συνδεσιμότητας UDP από άκρο σε άκρο εκκινώντας μια συσκευή ακρόασης UDP, με την προϋπόθεση ότι έχετε σωστή πρόσβαση στο CLI στον απομακρυσμένο διακομιστή.

  Πώς να προγραμματίσετε ένα μήνυμα κειμένου για αποστολή αργότερα

Υποθέτοντας λοιπόν ότι πρέπει να ελέγξετε τη συνδεσιμότητα UDP μεταξύ δύο κεντρικών υπολογιστών Linux για DNS χρησιμοποιώντας nc, ένας απλός τρόπος για να το κάνετε αυτό θα ήταν να ξεκινήσετε την ακρόαση διακομιστή nc στην απαιτούμενη θύρα:

$ sudo nc -ul <Port>

Για DNS, πρέπει να ελέγξουμε τη θύρα 53 που θα έκανε την παραπάνω εντολή ως εξής:

$ nc -ul 53

Στο τέλος του πελάτη, θα χρειαστεί να ξεκινήσετε μια άλλη διαδικασία nc που στέλνει πακέτα UDP στον διακομιστή:

$ nc -u <IP/DNS> <Port>

Που θα έκανε την εντολή μας:

$ nc -u <IP/DNS> 53

Λαμβάνοντας υπόψη ότι τίποτα δεν εμποδίζει την κυκλοφορία UDP για τη θύρα 53 μεταξύ αυτών των δύο μηχανημάτων, ό,τι πληκτρολογήσετε και εισαγάγετε σε ένα μηχάνημα θα πρέπει να είναι ορατό στους άλλους κεντρικούς υπολογιστές, όπως η αμφίδρομη συνομιλία. Εάν όχι, κάποιο τείχος προστασίας εμποδίζει τη συνδεσιμότητα μεταξύ αυτών των δύο συστημάτων.

Το μοντέλο διακομιστή και πελάτη που χρησιμοποιεί nc λειτουργεί άψογα για τέτοιου είδους απλούς ελέγχους συνδεσιμότητας μεταξύ κεντρικών υπολογιστών. Όπως ο παραπάνω έλεγχος UDP, το nc μπορεί επίσης να ακούσει πακέτα TCP σε μια δεδομένη θύρα:

$ sudo nc -l <Port>

Στο τέλος του πελάτη, μπορείτε κανονικά να στείλετε πακέτα TCP για να ελέγξετε τη συνδεσιμότητα:

$ nc <IP/DNS> <Port>

Η παραπάνω μέθοδος nc διακομιστή/πελάτη δεν απαιτείται στην περίπτωση συνδέσεων TCP (σε αντίθεση με το UDP), καθώς είναι πρωτόκολλο προσανατολισμένο στη σύνδεση και λειτουργεί με επιβεβαιώσεις. Οποιαδήποτε διαδικασία ακρόασης που λειτουργεί στο TCP θα ανταποκρίνεται άμεσα στα πακέτα nc TCP.

Περίληψη

Αυτό το άρθρο συνοψίζει πώς το nc utility αντικαθιστά απευθείας το telnet στα σύγχρονα συστήματα Linux, όσον αφορά τον έλεγχο της συνδεσιμότητας των θυρών και παρέχει πολύ περισσότερη ισχύ στον τελικό χρήστη για τη διάγνωση και την επίλυση προβλημάτων δικτύου.

Μπορείτε να προσπελάσετε τη βοήθεια nc χρησιμοποιώντας την εντολή 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
$

Για πιο λεπτομερείς πληροφορίες σχετικά με την εντολή nc, ανατρέξτε στη σελίδα του εγχειριδίου.

$ man nc