텔넷의 한계와 nc의 등장
텔넷은 네트워크를 통해 원격 컴퓨터에 접속하는 데 사용되는 프로토콜로, 양방향 텍스트 기반 통신을 지원합니다. 텔넷을 사용하려면 텔넷 서버와 클라이언트가 모두 필요합니다.
오랜 기간 동안 텔넷은 리눅스 및 윈도우 환경에서 중요한 역할을 해왔지만, 시간이 흐르면서 보안상의 취약점이 드러났습니다.
텔넷 통신은 암호화되지 않은 일반 텍스트로 이루어지므로, 네트워크 트래픽을 감시하는 공격자에게 쉽게 노출될 수 있습니다. 이러한 이유로 최신 리눅스 운영 체제에서는 텔넷을 기본적으로 제공하지 않으며, 다른 운영 체제에서도 텔넷 사용을 권장하지 않습니다.
보안 셸(SSH) 프로토콜이 등장하면서 텔넷의 사용은 점차 줄어들었지만, 시스템 관리자와 기술 전문가들은 여전히 원격 TCP 포트 연결을 확인하는 용도로 텔넷을 활용하고 있습니다.
텔넷 명령어를 사용하면 원격 TCP 포트가 정상적으로 작동하는지 여부를 간단하게 확인할 수 있습니다. 아래 예시는 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 google.com 22 Trying 142.250.193.174... ^C $
이처럼 텔넷은 ping, traceroute, netstat 등의 다른 네트워크 진단 명령어와 함께 네트워크 연결 문제를 해결하는 데 유용하게 사용될 수 있습니다.
RHEL 8 또는 이전 버전의 RHEL/CentOS를 사용하는 경우, 다양한 네트워크 진단 기능을 제공하는 nc(Ncat 또는 네트워크 커넥터)를 사용할 수 있습니다. 이제 RHEL 8 및 유사한 시스템에서 nc를 설치하고 사용하는 방법에 대해 알아보겠습니다.
nc (Ncat)란 무엇인가?
nc 또는 Ncat은 네트워크에서 데이터를 읽고, 쓰고, 리디렉션하고, 암호화하는 데 사용되는 다목적 명령줄 도구입니다. 원래 nmap 프로젝트를 위해 개발되었지만, 현재는 다양한 Netcat 구현체를 사용할 수 있습니다. IPv4 및 IPv6를 지원하며, TCP 및 UDP 프로토콜과 함께 작동하여 다양한 활용 가능성을 제공합니다.
nc 유틸리티의 주요 기능은 다음과 같습니다.
- 다수의 ncat 연결을 묶는 기능
- TCP, UDP, SCTP 포트를 다른 사이트로 리디렉션
- SSL 지원을 통한 통신 암호화
- SOCK4/5 또는 HTTP 프록시를 통한 프록시 지원 (인증 포함)
- Windows, Linux, macOS 등 다양한 플랫폼 지원
nc 설치
nc는 RHEL 시스템의 기본 저장소에서 사용할 수 있습니다. RHEL 7 시스템에 nc를 설치하려면 터미널에서 다음 명령어를 실행하십시오.
$ sudo yum install -y nc
RHEL 8 시스템에서는 dnf를 사용하여 다음과 같이 설치할 수 있습니다.
$ sudo dnf install -y nc
TCP 연결 확인
nc는 다양한 기능을 제공하지만, 가장 일반적인 사용 사례 중 하나는 텔넷 대신 네트워크 문제 해결에 사용하는 것입니다. nc를 사용하면 TCP 포트 연결 가능 여부를 확인할 수 있습니다.
nc 명령어의 기본 구문은 다음과 같습니다.
$ nc -vz <IP/DNS> <Port>
예를 들어 koreantech.org에 HTTP 또는 HTTPS를 통해 연결할 수 있는지 확인하려면 다음과 같이 nc 명령어를 사용할 수 있습니다. (포트 80은 HTTP, 443은 HTTPS입니다.)
$ nc -vz koreantech.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 koreantech.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. $
연결할 수 없거나 차단된 포트는 다음과 같은 출력을 표시합니다. (koreantech.org DNS가 여러 IP 주소를 가리키는 것을 확인할 수 있습니다.)
$ nc -vz koreantech.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 koreantech.org.com +short 104.26.10.88 172.67.70.213 104.26.11.88 $
UDP 연결 확인
텔넷은 원격 TCP 포트 연결만 확인할 수 있지만, nc는 TCP 및 UDP 연결을 모두 확인할 수 있습니다.
nc를 사용하여 UDP 패킷을 보내려면 다음과 같이 명령어를 사용합니다.
$ nc -vzu <IP/DNS> <Port>
UDP는 TCP와 달리 비연결형 프로토콜이기 때문에, 패킷을 보내는 것만으로는 종단 간 UDP 연결을 완벽하게 확인할 수 없습니다. 서버 측에서 응답이 있어야 연결을 확인할 수 있습니다. 따라서 nc는 원격 서버에서 UDP 수신기를 시작하여 연결을 확인하는 방법을 제공합니다.
예를 들어 두 리눅스 호스트 간의 DNS UDP 연결을 확인하려면 다음과 같은 단계를 따를 수 있습니다.
먼저, 대상 호스트에서 특정 포트(예: 53)에서 UDP 패킷을 수신하는 nc 서버를 시작합니다.
$ sudo nc -ul 53
그런 다음, 클라이언트 호스트에서 UDP 패킷을 서버로 전송합니다.
$ nc -u <IP/DNS> 53
두 호스트 사이에 포트 53에 대한 UDP 트래픽을 차단하는 방화벽이 없다면, 한쪽에서 입력한 내용이 다른 쪽에서 표시되어야 합니다. 그렇지 않다면 방화벽이 연결을 차단하고 있는 것입니다.
위와 같은 nc 서버/클라이언트 모델은 호스트 간의 간단한 연결을 확인하는 데 유용합니다. UDP 연결 확인과 마찬가지로 nc는 특정 포트에서 TCP 패킷을 수신할 수도 있습니다.
$ sudo nc -l <Port>
클라이언트 측에서는 다음과 같이 TCP 패킷을 전송하여 연결을 확인할 수 있습니다.
$ nc <IP/DNS> <Port>
TCP 연결의 경우 위와 같은 서버/클라이언트 방식이 필수는 아닙니다. TCP는 연결 지향 프로토콜이며, 수신 프로세스가 nc TCP 패킷에 직접 응답하기 때문입니다.
결론
이 글에서는 nc 유틸리티가 현대 리눅스 시스템에서 텔넷을 대체하여 포트 연결을 확인하고, 네트워크 문제를 진단하고 해결하는 데 사용자에게 더 많은 기능을 제공하는 방법에 대해 알아보았습니다.
nc 명령어에 대한 도움말은 다음 명령어를 통해 확인할 수 있습니다.
$ 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