리눅스 nc(netcat) 명령어 실용 예제

LinuxLinuxBeginner
지금 연습하기

소개

이 랩에서는 Linux 에서 TCP/IP 연결을 위한 "스위스 아미 나이프"라고 불리는 다재다능한 네트워킹 유틸리티인 nc (netcat) 명령에 대해 배우게 됩니다. Netcat 을 사용하면 연결을 설정하고, 포트를 리스닝하며, 네트워크 연결을 통해 데이터를 전송할 수 있습니다. 이는 네트워크 관리자와 보안 전문가에게 필수적인 도구입니다.

이 랩에서는 TCP 및 UDP 통신 프로토콜 모두에 netcat 을 사용하는 방법을 살펴봅니다. 간단한 서버 - 클라이언트 통신을 설정하고, netcat 을 포트 스캔 및 파일 전송과 같은 실용적인 네트워킹 작업에 어떻게 사용할 수 있는지 배웁니다.

이 랩을 마치면 다양한 네트워킹 시나리오에서 nc 명령을 사용하는 방법에 대한 확실한 이해를 갖게 되어 Linux 네트워킹 기술을 강화하고 네트워크 문제를 디버깅하기 위한 강력한 도구를 제공할 것입니다.

Linux 명령어 치트 시트

nc (netcat) 명령 이해하기

이 단계에서는 netcat 이 무엇인지, 설치 여부를 확인하는 방법, 그리고 기본 사용 옵션을 살펴보겠습니다.

Netcat 이란 무엇인가요?

Netcat (nc) 은 TCP 또는 UDP 프로토콜을 사용하여 네트워크 연결을 통해 데이터를 읽고 쓰는 명령줄 유틸리티입니다. 네트워크 디버깅, 포트 스캔, 파일 전송 등을 위해 사용될 수 있는 신뢰할 수 있는 백엔드 도구로 설계되었습니다.

설치 확인

먼저, netcat 이 시스템에 설치되어 있는지 버전을 확인하여 확인해 보겠습니다.

which nc

다음과 유사한 출력을 볼 수 있습니다.

/usr/bin/nc

netcat 이 설치되어 있지 않은 경우, 다음 명령으로 설치할 수 있습니다.

sudo apt-get update
sudo apt-get install -y netcat

기본 Netcat 옵션 이해하기

도움말 정보를 확인하여 nc 명령의 기본 옵션을 살펴보겠습니다.

nc -h

사용 가능한 옵션 목록이 표시됩니다. 가장 일반적인 옵션 중 일부는 다음과 같습니다.

  • -l: 리스닝 모드 (인바운드 연결용)
  • -p: 리스닝할 로컬 포트 지정
  • -u: TCP 대신 UDP 사용
  • -v: 상세 출력 (Verbose output)
  • -w: 연결 시간 초과 (Timeout)

특정 포트가 원격 서버에서 열려 있는지 확인하기 위한 간단한 테스트를 만들어 보겠습니다. 예를 들어, google.com 에서 포트 80 (HTTP) 이 열려 있는지 확인하려면 다음 명령을 사용합니다.

nc -zv google.com 80

-z 플래그는 netcat 에게 데이터를 전송하지 않고 리스닝 데몬을 스캔하도록 지시하고, -v는 상세 출력을 활성화합니다. 연결이 성공했는지 여부를 나타내는 출력을 볼 수 있습니다.

Connection to google.com 80 port [tcp/http] succeeded!

이는 google.com 에서 포트 80 이 열려 있고 연결을 허용하고 있음을 확인합니다.

다음 단계에서는 netcat 을 사용하여 TCP 및 UDP 프로토콜을 모두 사용하여 서버와 클라이언트 간의 실제 통신을 설정합니다.

Netcat 을 사용한 TCP 통신 설정

이 단계에서는 netcat 을 사용하여 TCP 서버와 클라이언트 통신을 설정하는 방법을 배웁니다. TCP (Transmission Control Protocol, 전송 제어 프로토콜) 는 신뢰할 수 있고 순서가 보장되는 데이터 전송을 제공하는 연결 지향 프로토콜입니다.

TCP 통신 이해하기

TCP 통신에는 연결을 리스닝하는 서버와 연결을 시작하는 클라이언트가 포함됩니다. 연결이 설정되면 양쪽 모두 데이터를 보내고 받을 수 있습니다. TCP 는 모든 데이터가 올바르게, 그리고 올바른 순서로 전달되도록 보장합니다.

TCP 서버 설정

포트 8080 에서 리스닝하는 TCP 서버를 생성하려면 터미널을 열고 다음을 실행합니다.

nc -l -p 8080

각 옵션의 기능은 다음과 같습니다.

  • -l: netcat 에게 인바운드 연결을 리스닝하도록 지시합니다 (서버 모드)
  • -p 8080: 서버가 리스닝할 포트 8080 을 지정합니다

이제 서버는 클라이언트가 연결되기를 기다리고 있습니다. 터미널은 출력이 없이 멈춘 것처럼 보일 것입니다. 이는 정상입니다.

TCP 클라이언트로 연결하기

방금 생성한 서버에 연결하려면 새 터미널을 열고 다음을 실행합니다.

nc localhost 8080

이 명령은 로컬 머신 (localhost) 의 포트 8080에서 실행 중인 서버에 연결을 시도합니다.

TCP 연결 테스트

이제 서버와 클라이언트가 모두 실행 중이므로, 두 시스템 간에 메시지를 보낼 수 있습니다.

  1. 클라이언트 터미널에서 메시지를 입력하고 Enter 키를 누릅니다. 예를 들어:

    Hello from the client!
  2. 이 메시지가 서버 터미널에 나타나는 것을 볼 수 있습니다.

  3. 서버 터미널에서 응답을 입력하고 Enter 키를 누릅니다. 예를 들어:

    Hello from the server!
  4. 이 메시지가 클라이언트 터미널에 나타나는 것을 볼 수 있습니다.

이는 TCP 를 통한 양방향 통신을 보여줍니다. 양쪽 모두 데이터를 보내고 받을 수 있습니다.

연결 종료

연결을 닫으려면:

  • 어느 터미널에서든 Ctrl+C를 누릅니다.
  • 또는 Ctrl+D를 입력하여 EOF (End of File, 파일 끝) 신호를 보냅니다.

연결이 종료되고 서버와 클라이언트 프로세스 모두 종료됩니다.

이 간단한 예제는 TCP 통신을 위한 netcat 의 기본 사용법을 보여줍니다. 실제 시나리오에서는 이 기능을 원격 관리, 시스템 간 데이터 전송 또는 네트워크 애플리케이션 테스트와 같은 작업에 사용할 수 있습니다.

Netcat 을 사용한 UDP 통신

이 단계에서는 데이터 전송 처리 방식에서 TCP 와 크게 다른 UDP (User Datagram Protocol, 사용자 데이터그램 프로토콜) 통신을 위해 netcat 을 사용하는 방법을 배웁니다.

UDP vs TCP 이해하기

TCP 와 달리 UDP 는 다음과 같습니다.

  • 비연결형 (connectionless) - 데이터 전송 전에 공식적인 연결이 설정되지 않습니다.
  • 패킷의 전달 또는 올바른 순서를 보장하지 않습니다.
  • 오버헤드와 지연 시간이 낮아 게임이나 비디오 스트리밍과 같은 시간 민감적인 애플리케이션에 유용합니다.

UDP 서버 설정

포트 9090 에서 리스닝하는 UDP 서버를 생성하려면 터미널을 열고 다음을 실행합니다.

nc -u -l -p 9090

각 옵션의 기능은 다음과 같습니다.

  • -u: 기본 TCP 대신 UDP 를 사용하도록 지정합니다.
  • -l: netcat 에게 인바운드 데이터그램을 리스닝하도록 지시합니다 (서버 모드).
  • -p 9090: 서버가 리스닝할 포트 9090 을 지정합니다.

이제 서버는 UDP 데이터그램이 도착하기를 기다리고 있습니다. TCP 서버와 마찬가지로, 데이터가 도착할 때까지 터미널은 출력이 없이 멈춘 것처럼 보일 것입니다.

UDP 클라이언트로 데이터 전송

UDP 서버로 데이터를 보내려면 새 터미널을 열고 다음을 실행합니다.

nc -u localhost 9090

이 명령을 사용하면 로컬 머신 (localhost) 의 포트 9090에서 실행 중인 서버로 UDP 데이터그램을 보낼 수 있습니다.

UDP 통신 테스트

이제 UDP 서버와 클라이언트가 모두 실행 중이므로 메시지를 보낼 수 있습니다.

  1. 클라이언트 터미널에서 메시지를 입력하고 Enter 키를 누릅니다. 예를 들어:

    This is a UDP message
  2. 이 메시지가 서버 터미널에 나타나는 것을 볼 수 있습니다.

  3. 서버 터미널에서 응답을 입력하고 Enter 키를 누릅니다. 예를 들어:

    UDP response received
  4. 이 메시지가 클라이언트 터미널에 나타나는 것을 볼 수 있습니다.

UDP 동작 이해하기

TCP 와 달리 UDP 에서는 다음과 같습니다.

  • 서버는 연결을 추적하지 않습니다.
  • 각 메시지는 독립적입니다.
  • 기본적으로 수신 확인이 없습니다.
  • 실제 네트워크 환경에서는 메시지가 손실되거나 순서대로 도착하지 않을 수 있습니다.

이로 인해 UDP 는 속도가 신뢰성보다 더 중요하거나, 가끔 패킷 손실이 허용되는 애플리케이션에 유용합니다.

UDP 세션 종료

UDP 세션을 닫으려면:

  • 프로세스를 종료하려면 어느 터미널에서든 Ctrl+C를 누릅니다.

UDP 는 비연결형이므로, 공식적인 "연결 닫기"는 없습니다. 단순히 더 많은 데이터그램을 보내거나 받는 것을 중단하는 것입니다.

UDP 는 DNS 조회, 비디오 스트리밍, 온라인 게임 및 낮은 지연 시간이 완벽한 신뢰성보다 더 중요한 다른 시나리오에서 일반적으로 사용됩니다.

Netcat 을 사용한 파일 전송

이 단계에서는 netcat 을 사용하여 시스템 간에 파일을 전송하는 방법을 배웁니다. 이는 간단한 텍스트 통신을 넘어 netcat 의 다재다능함을 보여주는 실용적인 응용 프로그램입니다.

파일 전송을 위한 Netcat 이해하기

Netcat 은 다음을 통해 컴퓨터 간에 파일을 전송하는 데 사용할 수 있습니다.

  1. 보낸 쪽에서 파일의 입력을 리디렉션합니다.
  2. 받는 쪽에서 파일의 출력을 리디렉션합니다.

이 접근 방식은 FTP 또는 SCP 와 같은 추가 프로토콜이 필요하지 않으므로 해당 도구를 사용할 수 없는 시나리오에서 유용합니다.

수신자 설정

먼저 파일을 수락할 수신 측을 설정해 보겠습니다. 터미널을 열고 다음을 실행합니다.

nc -l -p 7000 > received_file.txt

이 명령은 다음을 수행합니다.

  • 포트 7000 에서 리스닝 서버를 설정합니다.
  • 수신된 모든 데이터를 received_file.txt라는 파일로 리디렉션합니다.

전송할 테스트 파일 생성

전송하기 전에 전송할 샘플 파일을 만들어 보겠습니다. 새 터미널에서 다음을 실행합니다.

echo "This is a test file that will be transferred using netcat." > original_file.txt
echo "Netcat can be used for simple file transfers between systems." >> original_file.txt
echo "This demonstrates a practical use case of the nc command." >> original_file.txt

## View the file contents to confirm
cat original_file.txt

터미널에 파일 내용이 표시되어야 합니다.

파일 전송

이제 파일을 수신자에게 보내 보겠습니다. 파일을 만든 동일한 터미널에서 다음을 실행합니다.

cat original_file.txt | nc localhost 7000

이 명령은 다음을 수행합니다.

  • cat을 사용하여 original_file.txt의 내용을 읽습니다.
  • 이 내용을 netcat 으로 파이프 (|) 합니다.
  • Netcat 은 데이터를 포트 7000 의 localhost 로 보냅니다.

전송은 즉시 발생합니다. 전송이 완료되면 보낸 쪽의 netcat 프로세스가 자동으로 종료되지만 받는 쪽은 더 많은 데이터를 계속 기다립니다.

전송 확인

파일이 전송되면 수신자 터미널에서 Ctrl+C를 눌러 연결을 닫습니다. 이제 파일이 올바르게 전송되었는지 확인해 보겠습니다.

cat received_file.txt

원래 파일과 동일한 내용이 표시되어야 하며, 이는 성공적인 전송을 확인합니다.

파일 비교

전송이 완벽했는지 확인하려면 두 파일을 비교할 수 있습니다.

diff original_file.txt received_file.txt

출력이 없으면 파일이 동일하고 전송이 성공했음을 의미합니다.

이 파일 전송 방법은 로컬 머신뿐만 아니라 네트워크의 다른 컴퓨터 간에도 작동합니다. localhost를 원격 머신의 IP 주소 또는 호스트 이름으로 바꾸면 됩니다.

이 기술은 기존 파일 전송 도구를 사용할 수 없거나 제한된 환경에서 특히 유용할 수 있으며, netcat 을 시스템 관리자의 도구 상자에서 가치 있는 도구로 만듭니다.

요약

이 랩에서는 네트워크 통신 및 문제 해결을 위한 강력한 기능을 제공하는 Linux 의 기본적인 네트워킹 도구인 다재다능한 nc (netcat) 명령을 탐구했습니다.

다음 내용을 배웠습니다.

  • netcat 의 기본 개념과 시스템에서 설치를 확인하는 방법
  • netcat 을 사용하여 TCP 서버 - 클라이언트 통신을 설정하는 방법 (신뢰할 수 있는 연결 지향적 데이터 전송 허용)
  • netcat 을 사용하여 UDP 통신을 설정하는 방법 (비연결형 UDP 와 연결 지향형 TCP 프로토콜 간의 차이점 시연)
  • 추가 파일 전송 프로토콜 없이 시스템 간의 실용적인 파일 전송을 위해 netcat 을 활용하는 방법

이러한 기술은 다음과 같은 보다 고급 네트워킹 작업의 기반을 제공합니다.

  • 네트워크 연결 문제 디버깅
  • 방화벽 구성 테스트
  • 간단한 네트워크 서비스 생성
  • 기본적인 보안 테스트 수행

Netcat 의 단순성과 다재다능함은 시스템 관리자, 네트워크 엔지니어 및 보안 전문가에게 필수적인 도구입니다. 이 네트워킹의 "스위스 아미 나이프"를 마스터함으로써 이제 Linux 툴킷에 추가할 강력한 유틸리티를 갖게 되었습니다.

추가 탐색을 위해 연결 프록싱, 영구 리스너 생성 또는 자동화된 네트워크 테스트를 위해 netcat 을 스크립트와 통합하는 등 netcat 의 고급 기능을 조사해 보십시오.

Linux 명령어 치트 시트