Telnet je síťový protokol používaný pro vzdálený přístup k počítači a poskytuje obousměrnou textovou komunikaci. Ke vzájemné komunikaci tedy potřebujete telnet server a klienta.
Telnet je jednou z populárních utilit pro Linux/Windows, která dlouho sloužila svému účelu.
Hlavním problémem telnetu na moderních systémech je, že není bezpečný. Veškerá komunikace v telnetu probíhá v prostém textu a veškerý síťový provoz je nešifrovaný. V podstatě kdokoli se správným přístupem a nástroji může sledovat síťový provoz a číst tento provoz. Většina moderních operačních systémů Linux jako taková nemá předinstalovaný telnet a jiní jej nedoporučují používat.
S příchodem protokolu SSH nebo Secure Shell, který je více než šifrovanou náhradou za telnet, je použití telnetu pro zamýšlený účel již dávno zastaralé. Existuje však alternativní použití telnetu, které mnoho systémových administrátorů a technických nadšenců stále používá, a to kontrola připojení vzdálených portů TCP.
Pomocí příkazu telnet lze jednoduše zkontrolovat, zda vzdálený port TCP naslouchá a správně odpovídá. Níže uvedený úryvek ukazuje, jak můžeme zkontrolovat, zda je google.com aktivní a funguje kontrolou připojení 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 port, který není otevřený nebo přístupný, se bude při kontrole pomocí telnetu chovat jako níže:
$ telnet google.com 22 Trying 142.250.193.174... ^C $
To usnadňuje odstraňování jednoduchých problémů s připojením k síti v kombinaci s příkazy ping, traceroute nebo tracepath, netstat atd.
Pokud používáte RHEL 8 (nebo dokonce starší verze RHEL/CentOS), máte možnost použít nc (nebo Ncat nebo Network Connector), který podporuje mnoho možností souvisejících s diagnostikou sítě. Budeme diskutovat o tom, jak nainstalovat a používat tento nástroj na RHEL8 a podobných systémech.
Table of Contents
Co je nc?
nc (nebo Ncat) je populární univerzální nástroj příkazového řádku pro čtení, zápis, přesměrování a šifrování dat v síti. Původně byl napsán pro projekt nmap, nyní je k dispozici několik implementací Netcat. Pracuje s TCP i UDP přes IPv4 a IPv6 a poskytuje neomezené potenciální případy použití.
Níže jsou uvedeny některé z hlavních funkcí nástroje nc:
- Schopnost řetězit ncats dohromady
- Přesměrování portů TCP, UDP a SCTP na jiné stránky
- Šifrování komunikace s podporou SSL
- Podpora proxy přes SOCK4/5 nebo HTTP proxy (včetně autentizace)
- Podporuje více platforem, včetně Windows, Linux a macOS
Instalace nc
nc je k dispozici jako součást výchozích úložišť v systémech RHEL. Chcete-li jej nainstalovat do systému RHEL 7, jednoduše zadejte níže uvedený příkaz na terminálu:
$ sudo yum install -y nc
Pro systém RHEL 8 můžete použít dnf jako:
$ sudo dnf install -y nc
Zkontrolujte připojení TCP
Ačkoli nc nabízí řadu funkcí, které podporují řadu případů použití napříč aplikacemi, jedním z běžných je řešení problémů se sítí namísto telnetu.
nc může ukázat, zda můžete dosáhnout portu TCP. Zde je syntaxe:
$ nc -vz <IP/DNS> <Port>
Jako příklad, pokud chci zkontrolovat, zda mohu dosáhnout etechblog.cz přes http nebo https. Mohu zkontrolovat, že pomocí nc, jak je uvedeno níže (port 80 je pro http, zatímco 443 je pro https):
$ nc -vz etechblog.cz.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 etechblog.cz.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. $
Podobně nedosažitelný nebo blokovaný port zobrazí výstup jako (více adres je kontrolováno, protože etechblog.cz DNS ukazuje na více IP adres):
$ nc -vz etechblog.cz.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 etechblog.cz.com +short 104.26.10.88 172.67.70.213 104.26.11.88 $
Zkontrolujte připojení UDP
telnet může kontrolovat pouze komunikaci se vzdáleným TCP portem, zatímco nc umožňuje kontrolovat TCP i UDP konektivitu.
nc může jednoduše odesílat UDP pakety namísto výchozích TCP pomocí:
$ nc -vzu <IP/DNS> <Port>
Ale UDP je protokol bez relace, na rozdíl od TCP, takže jako takový nemůžete potvrdit end-to-end UDP konektivitu ve všech možných scénářích pouhým odesláním UDP paketů na jednom konci, pokud proces naslouchání na vzdáleném konci neodesílá nějakou odezvu, nc nebude schopen posoudit, zda jeho odeslaný paket dosáhl cíle nebo ne. Ale nc nabízí alternativu k určení end-to-end UDP konektivity spuštěním UDP listeneru, za předpokladu, že máte správný přístup k CLI na vzdáleném serveru.
Za předpokladu, že potřebujete zkontrolovat konektivitu UDP mezi dvěma hostiteli Linuxu pro DNS pomocí nc, jednoduchým způsobem by bylo spustit nc server naslouchající na požadovaném portu:
$ sudo nc -ul <Port>
Pro DNS musíme zkontrolovat port 53, který by z výše uvedeného příkazu udělal:
$ nc -ul 53
Na straně klienta byste museli spustit další nc proces, který odesílá pakety UDP na server:
$ nc -u <IP/DNS> <Port>
Což by znamenalo náš příkaz:
$ nc -u <IP/DNS> 53
Vzhledem k tomu, že nic neblokuje provoz UDP pro port 53 mezi těmito dvěma počítači, cokoliv napíšete a zadáte na jednom počítači, mělo by být viditelné na ostatních hostitelích jako obousměrný chat. Pokud ne, nějaký firewall blokuje konektivitu mezi těmito dvěma systémy.
Model serveru a klienta využívající nc funguje bezchybně pro tyto druhy jednoduchých kontrol připojení mezi hostiteli. Stejně jako výše uvedená kontrola UDP může nc také naslouchat paketům TCP na daném portu:
$ sudo nc -l <Port>
Na straně klienta můžete normálně odesílat pakety TCP pro kontrolu připojení:
$ nc <IP/DNS> <Port>
Výše uvedená metoda server/client nc není vyžadována v případě připojení TCP (na rozdíl od UDP), protože jde o protokol orientovaný na připojení a pracuje s potvrzením. Jakýkoli proces naslouchání pracující na TCP bude přímo reagovat na nc TCP pakety.
souhrn
Tento článek shrnuje, jak obslužný program nc obstojí jako přímá náhrada za telnet v moderních systémech Linux, pokud jde o kontrolu konektivity portů, a poskytuje koncovému uživateli mnohem více výkonu při diagnostice a řešení síťových problémů.
Nápovědu nc lze získat pomocí příkazu 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 $
Podrobnější informace o příkazu nc najdete na jeho manuálové stránce.
$ man nc