Netcat을 활용한 간단한 네트워크 통신

LinuxBeginner
지금 연습하기

소개

이 실습에서는 네트워크의 "맥가이버 칼(Swiss Army knife)"이라고 불리는 다재다능한 네트워크 도구인 Netcat을 사용하여 네트워크 통신의 기초를 배웁니다. TCP 또는 UDP 프로토콜을 사용하여 네트워크 연결을 통해 데이터를 읽고 쓰는 강력한 유틸리티의 활용법을 익히게 됩니다.

실습을 통해 클라이언트-서버 통신의 기초를 탐구하고, 간단한 채팅 시스템을 구축하며, 포트와 같은 필수적인 네트워크 개념을 이해하게 됩니다. 또한, 안전한 데이터 전송을 위한 기본적인 암호화 기술도 함께 다룹니다.

Netcat 설치

비밀 요원처럼 통신을 시작하기 전에, 적절한 도구를 갖추어야 합니다. Netcat은 다양한 네트워크 작업을 처리할 수 있어 네트워크 도구의 "맥가이버 칼"로 불립니다. 단계별로 시스템에 Netcat을 설치해 보겠습니다.

  1. 먼저 터미널을 엽니다. 바탕 화면에서 Xfce Terminal을 찾아 실행하세요. 터미널은 Netcat과 관련된 모든 명령어를 입력할 공간입니다.

Xfce Terminal 실행 스크린샷

참고: 무료 사용자는 인터넷에 연결할 수 없으므로, 실습 환경에 Netcat이 이미 설치되어 있습니다. 목록의 4번 항목(Netcat 설치 확인)으로 바로 이동하세요. Pro 버전으로 업그레이드하면 직접 Netcat을 설치하는 실습을 진행할 수 있습니다.

Pro 사용자 전용
  1. 터미널이 열리면 패키지 목록을 업데이트해야 합니다. 이를 통해 최신 버전의 Netcat을 확보할 수 있습니다. 다음 명령어를 입력하고 Enter를 누르세요:
sudo apt update

시스템이 비밀번호를 물어볼 수 있습니다. 입력하세요(입력 시 문자는 표시되지 않습니다) 그리고 Enter를 누르세요. sudo는 관리자 권한으로 명령어를 실행한다는 의미입니다.

  1. 패키지 목록이 최신 상태가 되었으니, 이제 Netcat을 설치합니다. 패키지 관리자가 모든 의존성을 자동으로 처리합니다. 다음 명령어를 입력하세요:
sudo apt install netcat -y

-y 플래그는 모든 프롬프트에 자동으로 "yes"라고 응답하여 설치 과정을 원활하게 합니다. 패키지 설치를 확실히 진행하고자 할 때 유용합니다.

4. 설치가 완료되면 Netcat이 올바르게 설치되었는지 확인합니다. 버전을 확인하여 이를 수행할 수 있습니다. 다음을 입력하세요:
nc -h

"OpenBSD netcat"으로 시작하는 출력과 함께 옵션 목록이 표시되어야 합니다. 이는 Netcat이 설치되어 사용할 준비가 되었음을 의미합니다. -h 플래그는 도움말 정보를 보여주며, 프로그램이 정상 작동하는지 확인하는 좋은 방법입니다.

  1. 축하합니다! 강력한 네트워크 도구를 설치했습니다. Netcat은 간단한 파일 전송부터 네트워크 연결 생성까지 다양한 기능을 갖추고 있습니다. 이 실습에서는 Netcat의 기능을 이해할 수 있도록 기본적인 사용법에 집중할 것입니다. Netcat을 컴퓨터를 연결하고 정보를 주고받는 간단한 방법이라고 생각하세요.

포트 이해 및 리스너 생성

통신 도구가 준비되었으니, 이제 포트에 대해 알아보고 리스너(listener)를 설정해 보겠습니다. 네트워크에서 포트는 라디오의 채널과 같습니다. 포트를 통해 동일한 장치에서 여러 통신이 동시에 발생할 수 있습니다. 포트는 각 번호가 매겨진 문과 같으며, 각 문은 컴퓨터의 서로 다른 서비스나 애플리케이션으로 연결됩니다.

  1. 리스너를 생성해 보겠습니다. 통신을 위해 12345 포트를 사용합니다. 포트 번호는 0에서 65535까지 있으며, 12345는 기억하기 쉽고 일반적으로 시스템 서비스에서 사용하지 않기 때문에 선택했습니다. 터미널에 다음을 입력하세요:

    nc -l 12345
    

    이 명령어는 Netcat에게 12345 포트에서 리스닝(-l 플래그)하도록 지시합니다. -l은 "listen" 모드를 의미하며, 컴퓨터가 이 포트로 들어오는 연결을 기다리게 됩니다.

  2. 터미널이 멈춘 것처럼 보일 것입니다. 걱정하지 마세요! Netcat이 12345 포트에서 활발하게 연결을 기다리고 있기 때문에 발생하는 정상적인 동작입니다. 커서가 깜박이는 것은 프로그램이 리스닝 모드에서 올바르게 실행 중임을 의미합니다.

  3. 리스너를 테스트하려면 다른 터미널 창을 열어야 합니다. 터미널 아이콘을 마우스 오른쪽 버튼으로 클릭하고 "New Terminal"을 선택하거나 Ctrl+Shift+N 단축키를 사용하여 열 수 있습니다. 이 두 번째 터미널은 리스너에 연결하는 "클라이언트" 역할을 합니다.

  4. 이 새 터미널에서 리스너에 연결합니다. 다음을 입력하세요:

    nc localhost 12345
    

    이 명령어는 Netcat에게 localhost(자신의 컴퓨터를 의미)의 12345 포트에 연결하도록 지시합니다. localhost는 항상 현재 기기를 가리키는 특수한 호스트 이름입니다.

  5. 이제 두 번째 터미널에 "Hello"와 같은 간단한 메시지를 입력하고 Enter를 누르세요. 리스너가 실행 중인 첫 번째 터미널에 메시지가 나타나는 것을 볼 수 있습니다. 이는 데이터가 네트워크 포트를 통해 연결 터미널에서 리스닝 터미널로 어떻게 이동하는지 보여줍니다.

Netcat 리스너 및 연결

  1. 두 터미널 모두에서 메시지를 계속 입력할 수 있으며, 상대방 터미널에 나타납니다. 이는 Netcat의 전이중(full-duplex) 기능을 보여줍니다. 즉, 통신이 양방향으로 동시에 흐를 수 있습니다. 메시지를 몇 번 주고받으며 어떻게 작동하는지 확인해 보세요.

  2. 연결을 종료하려면 두 터미널에서 Ctrl+C를 누르세요. 이 키보드 단축키는 Netcat 세션을 깔끔하게 닫는 인터럽트 신호를 보냅니다. 테스트가 끝나면 연결을 올바르게 닫는 것이 중요합니다.

Netcat을 이용한 파일 전송

Netcat으로 기본적인 네트워크 통신을 설정하는 방법을 배웠으니, 이제 가장 실용적인 기능 중 하나인 시스템 간 파일 전송을 살펴보겠습니다. 이 간단하면서도 강력한 기능 덕분에 Netcat은 시스템 관리자와 네트워크 엔지니어에게 매우 유용한 도구가 됩니다.

  1. 먼저 전송할 샘플 파일을 생성합니다. 터미널에 다음을 입력하세요:

    cd ~/project
    echo "Top Secret: The cake recipe is actually a lie" > secret.txt
    

    이 명령어는 두 가지 작업을 수행합니다. 프로젝트 디렉토리로 이동하고, 예제 메시지가 포함된 secret.txt라는 새 파일을 생성합니다. > 기호는 echo 명령어의 출력을 파일로 리다이렉션합니다.

  2. 이제 파일 전송의 수신 측을 설정합니다. 터미널 창을 열고 다음을 실행하세요:

    cd ~/project
    nc -l 12345 > received_secret.txt
    

    여기서 nc -l 12345는 12345 포트에서 리스닝 모드로 Netcat을 시작합니다. >는 들어오는 모든 데이터를 received_secret.txt라는 새 파일로 리다이렉션합니다. 이 터미널은 이제 들어오는 연결을 조용히 기다립니다.

  3. 별도의 터미널 창에서(첫 번째 창은 그대로 둔 상태로) 파일을 전송합니다:

    cd ~/project
    nc localhost 12345 < secret.txt
    

    이 명령어는 Netcat을 사용하여 12345 포트의 리스너(localhost는 "같은 컴퓨터"를 의미)에 연결합니다. < 기호는 Netcat에게 secret.txt를 입력으로 사용하도록 지시하여, 파일 내용을 네트워크 연결을 통해 효과적으로 전송합니다.

  4. 양쪽 끝이 같은 기기에 있으므로 전송은 즉시 완료됩니다. 성공적인 전송을 확인하려면 수신된 파일의 내용을 확인하세요:

    cat received_secret.txt
    

    cat 명령어는 파일 내용을 표시하며, 원래의 비밀 메시지와 정확히 일치해야 합니다.

Netcat 파일 전송 스크린샷

  1. 축하합니다! Netcat을 사용하여 파일을 성공적으로 전송했습니다. 이 데모에서는 localhost를 사용했지만, 네트워크상의 다른 컴퓨터 간에도 동일한 과정이 적용됩니다. localhost를 수신 컴퓨터의 IP 주소로 바꾸기만 하면 됩니다. 이 간단한 방법은 더 복잡한 프로토콜을 사용할 수 없을 때 빠른 파일 전송에 매우 유용할 수 있습니다.

암호화된 통신 구현

마지막 단계에서는 OpenSSL을 사용하여 암호화를 구현하고 이를 Netcat과 통합하여 통신에 보안 계층을 추가해 보겠습니다. 암호화는 네트워크 전송 중에 권한이 없는 당사자가 민감한 정보를 가로채거나 읽지 못하도록 보호하는 데 필수적입니다.

이전 실습에서 OpenSSL을 사용하는 방법을 이미 배웠습니다. OpenSSL은 메시지를 보호하기 위해 활용할 강력한 암호화 기능을 제공합니다. 구체적으로 openssl enc 명령어를 사용하여 강력한 대칭 암호화 알고리즘인 AES-256-CBC 암호로 메시지를 암호화하고 복호화할 것입니다. 또한 암호화 키를 도출하기 위해 암호를 사용할 것입니다. 이는 송신자와 수신자 간의 공유 비밀로 생각하면 됩니다.

  1. 먼저 송신자 스크립트를 생성합니다. 이 스크립트는 메시지를 암호화하고 전송하는 역할을 합니다. secure_sender.sh라는 새 파일을 엽니다:

    nano secure_sender.sh
    
  2. 파일에 다음 내용을 추가합니다(내용을 복사하여 붙여넣을 수 있습니다):

    #!/bin/bash
    
    echo "Secure Sender - Enter messages to send. Press Ctrl+C to exit."
    
    while true; do
      echo "Enter message:"
      read message
      encrypted=$(echo "$message" | openssl enc -aes-256-cbc -salt -base64 -pbkdf2 -iter 10000 -pass pass:secretpassword 2> /dev/null)
      echo "$encrypted" | nc -N localhost 12345
    done
    

    이 스크립트의 작동 방식은 다음과 같습니다:

    • 루프 내에서 메시지를 계속 입력받습니다.
    • 입력을 받아 암호화를 위해 OpenSSL로 파이프합니다.
    • Netcat(nc)을 사용하여 암호화된 데이터를 localhost의 12345 포트로 전송합니다.
    • 암호화 매개변수에는 보안 강화를 위한 salt, 안전한 전송을 위한 base64 인코딩, 10,000회 반복의 PBKDF2 키 도출이 포함됩니다.

    보안 송신자 스크립트 예시

  3. Ctrl+X, Y, Enter를 눌러 파일을 저장하고 종료합니다. 스크립트를 실행 가능하게 만듭니다:

    chmod +x secure_sender.sh
    
  4. 이제 수신자 스크립트를 생성합니다. 이 스크립트는 들어오는 메시지를 리스닝하고 복호화합니다. secure_receiver.sh라는 새 파일을 엽니다:

    nano secure_receiver.sh
    
  5. 다음 내용을 추가합니다:

    #!/bin/bash
    
    echo "Secure Receiver - Waiting for messages. Press Ctrl+C to exit."
    
    while true; do
      encrypted=$(nc -l 12345)
      if [ ! -z "$encrypted" ]; then
        decrypted=$(echo "$encrypted" | openssl enc -aes-256-cbc -d -salt -base64 -pbkdf2 -iter 10000 -pass pass:secretpassword 2> /dev/null)
        echo "Received message: $decrypted"
      fi
    done
    

    이 실습에서 사용하는 Ubuntu 22.04 환경의 기본 OpenBSD Netcat 리스너 구문은 nc -l 12345입니다. 여기서 -l을 사용할 때 -p를 추가하지 마세요.

    이 스크립트의 작동 방식은 다음과 같습니다:

    • 12345 포트에서 들어오는 데이터를 계속 리스닝합니다.
    • 데이터가 수신되면 복호화를 위해 OpenSSL로 파이프합니다.
    • 송신자와 동일한 암호화 매개변수를 사용하여 메시지를 올바르게 복호화합니다.
    • 원래의 일반 텍스트 메시지를 표시합니다.
  6. Ctrl+X, Y, Enter를 눌러 파일을 저장하고 종료합니다. 스크립트를 실행 가능하게 만듭니다:

    chmod +x secure_receiver.sh
    
  7. 이제 암호화된 통신 시스템을 테스트해 보겠습니다. 수신자용과 송신자용으로 두 개의 터미널 창을 동시에 열어야 합니다.

  8. 첫 번째 터미널에서 수신자를 시작합니다:

    ./secure_receiver.sh
    

    수신자가 메시지를 기다리고 있다는 메시지가 표시됩니다. 이제 수신자가 12345 포트에서 활발하게 리스닝 중입니다.

  9. 두 번째 터미널에서 송신자를 시작합니다:

    ./secure_sender.sh
    

    메시지를 입력하라는 메시지가 표시됩니다. 여기에 입력하는 모든 내용은 네트워크를 통해 전송되기 전에 암호화됩니다.

  10. 송신자 터미널에 메시지를 입력하고 Enter를 누르세요. 암호화된 메시지가 전송되는 것을 볼 수 있습니다(전송되는 동안 암호화된 버전만 잠시 보게 됩니다).

암호화된 메시지

  1. 수신자 터미널에는 송신자 터미널에서 입력한 것과 정확히 일치하는 복호화된 메시지가 나타나야 합니다.

  2. 송신자 터미널에서 메시지를 계속 보낼 수 있으며, 메시지는 자동으로 암호화되어 전송되고 수신자 터미널에서 복호화됩니다. 이는 완전한 보안 통신 루프를 보여줍니다.

  3. 통신을 종료하려면 두 터미널에서 Ctrl+C를 누르세요. 이렇게 하면 두 스크립트가 안전하게 종료됩니다.

이 설정은 간단하면서도 효과적인 암호화 통신 시스템을 보여줍니다. 테스트를 위해 localhost를 사용했지만, 동일한 접근 방식이 네트워크 전반에 걸쳐 작동합니다. 메시지는 전송 전에 자동으로 암호화되고 수신 시 복호화되어 안전한 통신 채널을 제공합니다. 실제 애플리케이션에서는 하드코딩된 비밀번호보다 더 안전한 키 교환 방법을 사용해야 한다는 점을 기억하세요.

요약

이 실습에서는 Netcat을 사용한 네트워크 통신의 기초를 배우고, 안전한 데이터 전송을 위한 기본적인 암호화 기술을 살펴보았습니다. Netcat 설치, 특정 포트를 통한 연결 설정, 시스템 간 파일 전송을 실습했습니다.

이 실습 경험을 통해 OpenSSL을 활용한 실제 구현으로 네트워크 통신에서 암호화의 중요성을 확인했습니다. 이러한 기초 기술은 더 복잡한 사이버 보안 개념과 보안 통신 프로토콜을 이해하기 위한 탄탄한 출발점이 될 것입니다.