간단한 네트워크 통신에 Netcat 사용하기

LinuxBeginner
지금 연습하기

소개

이 실습에서는 네트워크의 “스위스 군용 칼”이라고도 불리는 다목적 네트워크 도구 Netcat을 사용해 네트워크 통신의 기초를 배웁니다. 이 강력한 도구를 이용하면 TCP 또는 UDP 프로토콜을 통해 네트워크 연결상의 데이터를 읽고 쓸 수 있습니다.

직접 실습하면서 클라이언트-서버 통신의 기본 원리를 익히고, 간단한 채팅 시스템을 구축하며, 포트와 같은 핵심 네트워크 개념을 이해하게 됩니다. 또한 안전한 데이터 전송을 위한 기본적인 암호화 기법도 살펴봅니다.

Netcat 설치

이 단계에서는 비밀 요원처럼 통신을 시작하기 전에 필요한 도구를 준비합니다. Netcat은 다양한 네트워크 작업을 처리할 수 있어 네트워크 도구의 “스위스 군용 칼”이라고 자주 불립니다. 이제 시스템에 Netcat을 단계별로 설치해 보겠습니다.

먼저 터미널을 엽니다. 데스크톱에서 Xfce Terminal을 찾아 실행하세요. 터미널은 Netcat을 사용하기 위한 명령을 입력하는 곳입니다.

Xfce Terminal opening screenshot

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

Pro 사용자 전용

터미널을 열었으면 먼저 패키지 목록을 업데이트합니다. 이렇게 하면 최신 버전의 Netcat을 설치할 수 있습니다. 다음 명령을 입력하고 Enter를 누르세요.

sudo apt update

시스템에서 비밀번호를 요구할 수 있습니다. 비밀번호를 입력한 뒤 Enter를 누르세요. 입력하는 동안 문자가 화면에 표시되지 않습니다. sudo는 관리자 권한으로 명령을 실행한다는 의미입니다.

패키지 목록이 최신 상태가 되었으므로 이제 Netcat을 설치합니다. 패키지 관리자가 필요한 모든 종속성을 자동으로 처리합니다. 다음 명령을 입력하세요.

sudo apt install netcat -y

-y 옵션은 설치 과정에서 나타나는 확인 질문에 자동으로 “yes”라고 응답합니다. 설치할 패키지가 확실할 때 유용합니다.

설치가 완료되면 Netcat이 제대로 설치되었는지 확인합니다. 버전을 확인하면 됩니다. 다음 명령을 입력하세요.
nc -h

OpenBSD netcat으로 시작하는 출력과 함께 여러 옵션 목록이 표시되어야 합니다. 이는 Netcat이 설치되어 사용할 준비가 되었다는 뜻입니다. -h 옵션은 도움말 정보를 표시하므로 프로그램이 정상적으로 작동하는지 확인하는 데 유용합니다.

축하합니다! 이제 강력한 네트워크 도구를 설치했습니다. Netcat은 간단한 파일 전송부터 네트워크 연결 생성까지 다양한 기능을 제공합니다. 이 실습에서는 Netcat의 기본 사용법에 집중하여 기능을 이해해 보겠습니다. Netcat을 컴퓨터를 연결하고 서로 정보를 주고받는 간단한 도구라고 생각하면 됩니다.

포트 이해 및 수신 대기 설정

이제 통신 도구를 준비했으니 포트의 개념을 배우고 수신 대기를 설정해 보겠습니다. 네트워크에서 포트는 라디오의 서로 다른 채널과 같습니다. 하나의 장치에서 여러 통신이 동시에 이루어지도록 해 줍니다. 컴퓨터에서 각기 다른 서비스나 애플리케이션으로 연결되는 번호가 붙은 문이라고 생각할 수 있습니다.

수신 대기를 설정해 보겠습니다. 통신에는 12345번 포트를 사용합니다. 포트 번호는 0부터 65535까지이며, 12345는 기억하기 쉽고 일반적으로 시스템 서비스가 사용하지 않기 때문에 선택했습니다. 터미널에 다음을 입력하세요.

nc -l 12345

이 명령은 Netcat이 12345번 포트에서 수신 대기하도록 합니다(-l 옵션). -l은 “listen” 모드를 의미하며, 컴퓨터가 해당 포트로 들어오는 연결을 기다리게 합니다.

터미널이 멈춘 것처럼 보일 수 있습니다. 걱정하지 마세요! Netcat이 현재 실제로 수신 대기하면서 12345번 포트에 연결할 상대를 기다리고 있기 때문에 나타나는 정상적인 동작입니다. 커서가 깜박이는 것은 프로그램이 수신 대기 모드에서 정상적으로 실행 중이라는 뜻입니다.

수신 대기를 테스트하려면 다른 터미널 창을 열어야 합니다. 터미널 아이콘을 마우스 오른쪽 버튼으로 클릭한 뒤 “New Terminal”을 선택하거나 Ctrl+Shift+N 단축키를 사용하면 됩니다. 두 번째 터미널은 수신 대기 중인 터미널에 연결하는 “클라이언트” 역할을 합니다.

새 터미널에서 수신 대기 중인 터미널에 연결합니다. 다음을 입력하세요.

nc localhost 12345

이 명령은 Netcat이 localhost(현재 사용 중인 자신의 컴퓨터를 의미)의 12345번 포트에 연결하도록 합니다. localhost는 항상 현재 컴퓨터를 가리키는 특수한 호스트 이름입니다.

이제 두 번째 터미널에 "Hello"와 같은 간단한 메시지를 입력하고 Enter를 누르세요. 수신 대기 중인 첫 번째 터미널에 메시지가 표시되어야 합니다. 이는 네트워크 포트를 통해 연결을 시도한 터미널에서 수신 대기 중인 터미널로 데이터가 전달되는 과정을 보여 줍니다.

Netcat listener and connection

어느 터미널에서든 계속 메시지를 입력할 수 있으며, 입력한 내용은 다른 터미널에 나타납니다. 이는 Netcat이 전이중 통신을 지원한다는 뜻입니다. 즉, 양방향으로 동시에 통신할 수 있습니다. 몇 개의 메시지를 서로 주고받으며 동작을 확인해 보세요.

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

Netcat을 이용한 파일 전송

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

먼저 전송할 예제 파일을 만듭니다. 터미널에 다음을 입력하세요.

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

이 명령은 두 가지 작업을 수행합니다. 프로젝트 디렉터리로 이동하고, 예제 메시지가 담긴 secret.txt라는 새 파일을 만듭니다. > 기호는 echo 명령의 출력을 파일로 리디렉션합니다.

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

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

여기서 nc -l 12345는 Netcat을 12345번 포트의 수신 대기 모드로 실행합니다. >는 들어오는 데이터를 received_secret.txt라는 새 파일에 저장하도록 합니다. 이 터미널은 이제 들어오는 연결을 조용히 기다립니다.

첫 번째 터미널을 계속 실행한 상태에서 별도의 터미널 창을 열고 파일을 전송합니다.

cd ~/project
nc localhost 12345 < secret.txt

이 명령은 Netcat을 사용해 localhost(“동일한 컴퓨터”라는 뜻)의 12345번 포트에 연결합니다. < 기호는 secret.txt를 입력으로 사용하도록 하며, 결과적으로 파일 내용이 네트워크 연결을 통해 전송됩니다.

양쪽이 같은 컴퓨터에서 실행 중이므로 전송은 즉시 완료됩니다. 전송이 성공했는지 확인하려면 수신된 파일의 내용을 확인하세요.

cat received_secret.txt

cat 명령은 파일 내용을 표시합니다. 원본 비밀 메시지와 정확히 일치해야 합니다.

Netcat file transfer screenshot

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

암호화된 통신 구현

이 단계에서는 OpenSSL을 사용해 통신에 암호화 계층을 추가하고 Netcat과 연동해 보겠습니다. 네트워크를 통해 데이터가 전송되는 동안 민감한 정보가 가로채지거나 권한이 없는 사람에게 읽히지 않도록 암호화는 필수적입니다.

이전 실습에서 OpenSSL 사용법을 이미 배웠습니다. OpenSSL은 메시지를 안전하게 보호하는 데 활용할 수 있는 강력한 암호화 기능을 제공합니다. 여기서는 openssl enc 명령을 사용해 AES-256-CBC 암호로 메시지를 암호화하고 복호화합니다. AES-256-CBC는 강력한 대칭키 암호화 알고리즘입니다. 또한 암호화 키를 생성하기 위한 암호문을 사용합니다. 이는 송신자와 수신자가 공유하는 비밀이라고 생각하면 됩니다.

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

nano secure_sender.sh

다음 내용을 파일에 추가하세요(내용을 복사하여 붙여넣어도 됩니다).

#!/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번 포트로 전송합니다.
  • 암호화 매개변수에는 보안 강화를 위한 솔트, 안전한 전송을 위한 base64 인코딩, 10,000회 반복하는 PBKDF2 키 파생 방식이 포함됩니다.

Secure sender script example

파일을 저장하고 종료하려면 Ctrl+X를 누른 다음 Y, Enter를 차례로 누르세요. 이제 스크립트를 실행 가능하게 만듭니다.

chmod +x secure_sender.sh

이제 수신자 스크립트를 작성합니다. 이 스크립트는 들어오는 메시지를 수신하고 복호화합니다. secure_receiver.sh라는 새 파일을 엽니다.

nano secure_receiver.sh

다음 내용을 추가하세요.

#!/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로 전달하여 복호화합니다.
  • 송신자와 동일한 암호화 매개변수를 사용해 메시지를 올바르게 복호화합니다.
  • 원래의 평문 메시지를 표시합니다.

파일을 저장하고 종료하려면 Ctrl+X를 누른 다음 Y, Enter를 차례로 누르세요. 스크립트를 실행 가능하게 만듭니다.

chmod +x secure_receiver.sh

이제 암호화된 통신 시스템을 테스트해 보겠습니다. 수신자용 터미널과 송신자용 터미널, 총 두 개의 터미널 창을 동시에 열어야 합니다.

첫 번째 터미널에서 수신자 스크립트를 시작합니다.

./secure_receiver.sh

수신자가 메시지를 기다리고 있다는 안내가 표시됩니다. 이제 수신자는 12345번 포트에서 실제로 수신 대기 중입니다.

두 번째 터미널에서 송신자 스크립트를 시작합니다.

./secure_sender.sh

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

송신자 터미널에 메시지를 입력하고 Enter를 누르세요. 암호화된 메시지가 전송되는 것을 확인할 수 있습니다. 다만 전송되는 동안 암호화된 형태가 잠시 표시될 뿐입니다.

Encrypted Message

수신자 터미널에는 송신자 터미널에서 입력한 메시지가 복호화되어 원문 그대로 표시됩니다.

송신자 터미널에서 계속 메시지를 보낼 수 있으며, 메시지는 자동으로 암호화되어 전송되고 수신된 후 수신자 터미널에서 복호화됩니다. 이를 통해 완전한 보안 통신 흐름을 확인할 수 있습니다.

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

이 구성은 간단하지만 효과적인 암호화 통신 시스템의 예입니다. 여기서는 테스트를 위해 localhost를 사용했지만, 같은 방식은 네트워크를 통해서도 적용할 수 있습니다. 메시지는 전송 전에 자동으로 암호화되고 수신 후 복호화되므로 안전한 통신 채널이 제공됩니다. 실제 환경에서는 하드코딩된 비밀번호보다 더 안전한 키 교환 방식을 사용해야 한다는 점을 기억하세요.

요약

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

또한 OpenSSL을 실제로 활용해 네트워크 통신에서 암호화가 왜 중요한지 확인했습니다. 이러한 기초 역량은 더욱 복잡한 사이버 보안 개념과 안전한 통신 프로토콜을 이해하기 위한 탄탄한 출발점이 됩니다.