กำลังมองหา telnet บน RHEL 8 หรือไม่? ลอง nc

เผยแพร่แล้ว: 2022-05-02

Telnet เป็นโปรโตคอลเครือข่ายที่ใช้ในการเข้าถึงคอมพิวเตอร์จากระยะไกลและให้การสื่อสารแบบข้อความสองทาง ดังนั้นคุณต้องมีเซิร์ฟเวอร์ Telnet และไคลเอนต์เพื่อพูดคุยกัน

Telnet เป็นหนึ่งในยูทิลิตี Linux/Windows ยอดนิยมที่มีจุดประสงค์มายาวนาน

ปัญหาสำคัญกับ telnet ในระบบสมัยใหม่คือไม่ปลอดภัย การสื่อสารทั้งหมดใน telnet เกิดขึ้นในข้อความธรรมดา และการรับส่งข้อมูลเครือข่ายทั้งหมดจะไม่ได้รับการเข้ารหัส โดยพื้นฐานแล้วใครก็ตามที่มีการเข้าถึงและเครื่องมือที่เหมาะสมสามารถสอดแนมการรับส่งข้อมูลเครือข่ายเพื่ออ่านการรับส่งข้อมูลนี้ ด้วยเหตุนี้ ระบบปฏิบัติการลีนุกซ์ที่ทันสมัยส่วนใหญ่จึงไม่ได้ติดตั้ง 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 (หรือ Ncat) เป็นเครื่องมือบรรทัดคำสั่งสำหรับวัตถุประสงค์ทั่วไปที่เป็นที่นิยมสำหรับการอ่าน เขียน เปลี่ยนเส้นทาง และเข้ารหัสข้อมูลในเครือข่าย เดิมทีเขียนขึ้นสำหรับโปรเจ็กต์ nmap ขณะนี้มีการใช้งาน Netcat หลายรายการ ทำงานร่วมกับทั้ง TCP และ UDP ใน IPv4 และ IPv6 และมอบกรณีการใช้งานที่เป็นไปได้ที่ไร้ขีดจำกัด

ด้านล่างนี้เป็นคุณสมบัติหลักบางประการของยูทิลิตี้ 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>

ตัวอย่างเช่น ถ้าฉันต้องการตรวจสอบว่าฉันสามารถเข้าถึง Geekflare ผ่าน http หรือ https ได้หรือไม่ ฉันสามารถตรวจสอบว่าการใช้ nc ดังที่แสดงด้านล่าง (พอร์ต 80 สำหรับ http ในขณะที่ 443 สำหรับ https ):

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

ในทำนองเดียวกัน พอร์ตที่ไม่สามารถเข้าถึงได้หรือถูกบล็อกจะแสดงเอาต์พุตเช่น (ที่อยู่หลายรายการถูกตรวจสอบเนื่องจาก Geekflare DNS ชี้ไปยัง IP หลายรายการ):

 $ nc -vz geekflare.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 geekflare.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 แบบ end-to-end ได้ในทุกสถานการณ์ที่เป็นไปได้ เพียงแค่ส่งแพ็กเก็ต UDP ที่ปลายด้านหนึ่ง เว้นแต่ว่ากระบวนการรับฟังที่ปลายทางระยะไกลจะส่ง การตอบสนองบางอย่าง nc จะไม่สามารถตัดสินได้ว่าแพ็กเก็ตที่ส่งไปถึงปลายทางหรือไม่ แต่ nc เสนอทางเลือกอื่นในการพิจารณาการเชื่อมต่อ UDP แบบ end-to-end โดยการเปิดตัวฟัง 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 ทำหน้าที่เป็นตัวทดแทนโดยตรงสำหรับ 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 (eg 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