이 실습에서는 네트워크 도구 중에서도 다재다능하여 '맥가이버 칼'이라는 별명을 가진 Netcat 의 기초를 배웁니다. 이 강력한 유틸리티를 사용하여 TCP 또는 UDP 프로토콜을 통해 네트워크 연결 간에 데이터를 읽고 쓰는 방법을 알아보겠습니다.
직접적인 실습을 통해 클라이언트 - 서버 통신의 기본을 탐구하고, 간단한 채팅 시스템을 만들어보며 포트와 같은 필수적인 네트워크 개념을 이해하게 됩니다. 또한, 안전한 데이터 전송을 위한 기초적인 암호화 기술도 함께 살펴볼 예정입니다.
이 과정은 학습과 실습을 돕기 위해 단계별 지침을 제공하는 가이드형 실습입니다. 각 단계를 주의 깊게 따라가며 실무 경험을 쌓아보세요. 통계에 따르면 이 실습은 초급 수준이며, 완수율은 87%, 학습자 만족도는 98%에 달합니다.
Netcat 설치하기
비밀 요원처럼 통신을 시작하기 전에 먼저 적절한 도구를 갖춰야 합니다. Netcat 은 수많은 네트워크 작업을 처리할 수 있어 네트워크 도구계의 '맥가이버 칼'로 불립니다. 시스템에 Netcat 을 설치하는 과정을 단계별로 진행해 보겠습니다.
먼저 터미널을 엽니다. 바탕화면에서 Xfce Terminal 을 찾아 실행하세요. 터미널은 Netcat 을 조작하기 위한 모든 명령어를 입력하는 장소입니다.
참고: 무료 사용자는 외부 인터넷 연결이 제한되므로, 실습 환경에 Netcat 이 이미 사전 설치되어 있습니다. 목록의 4 번 항목 (설치 여부 확인) 으로 바로 넘어가셔도 됩니다. 직접 설치 과정을 연습해보고 싶다면 Pro 플랜으로 업그레이드하세요.
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 을 컴퓨터 간에 정보를 주고받는 가장 간편한 연결 통로라고 생각하면 쉽습니다.
포트의 이해와 리스너 생성
통신 도구가 준비되었으니 이제 포트 (Port) 의 개념을 배우고 리스너 (Listener) 를 설정해 보겠습니다. 네트워크에서 포트는 라디오의 채널과 같습니다. 하나의 장치에서 여러 통신이 동시에 일어날 수 있게 해줍니다. 컴퓨터에 있는 번호가 매겨진 문들이라고 생각하면 되는데, 각 문은 서로 다른 서비스나 애플리케이션으로 연결됩니다.
리스너를 만들어 봅시다. 통신을 위해 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 의 전이중 (Full-duplex) 통신 능력을 보여주는 것으로, 양방향으로 동시에 데이터를 주고받을 수 있음을 의미합니다. 메시지를 몇 번 더 주고받으며 어떻게 작동하는지 확인해 보세요.
통신을 종료하려면 두 터미널 모두에서 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는 12345 번 포트에서 리스닝 모드로 Netcat 을 시작합니다. > 기호는 들어오는 모든 데이터를 received_secret.txt라는 새 파일로 저장합니다. 이 터미널은 이제 연결이 들어올 때까지 조용히 기다립니다.
첫 번째 터미널을 그대로 둔 상태에서, 별도의 터미널 창을 열어 파일을 보냅니다.
cd ~/project
nc localhost 12345 < secret.txt
이 명령어는 Netcat 을 사용하여 12345 번 포트의 리스너 (localhost) 에 접속합니다. < 기호는 Netcat 에게 secret.txt의 내용을 입력값으로 사용하라고 지시하며, 결과적으로 파일의 내용이 네트워크 연결을 통해 전송됩니다.
두 터미널이 같은 컴퓨터에 있으므로 전송은 순식간에 끝납니다. 전송이 성공했는지 확인하기 위해 받은 파일의 내용을 확인해 봅시다.
cat received_secret.txt
cat 명령어는 파일의 내용을 화면에 출력합니다. 원본 비밀 메시지와 정확히 일치하는지 확인해 보세요.
축하합니다! Netcat 을 사용하여 파일을 성공적으로 전송했습니다. 이번 시연에서는 localhost를 사용했지만, 네트워크상의 다른 컴퓨터 간에도 동일한 과정이 적용됩니다. localhost 대신 받는 쪽 컴퓨터의 IP 주소를 입력하기만 하면 됩니다. 이 간단한 방법은 복잡한 프로토콜을 사용할 수 없는 환경에서 빠른 파일 전송이 필요할 때 매우 유용합니다.
암호화 통신 구현하기
마지막 단계로, OpenSSL 을 활용하여 Netcat 통신에 암호화 계층을 추가해 보겠습니다. 암호화는 네트워크 전송 중에 권한이 없는 제 3 자가 민감한 정보를 가로채거나 읽지 못하도록 보호하는 데 필수적입니다.
이전 실습에서 배운 OpenSSL 은 강력한 암호화 기능을 제공합니다. 우리는 openssl enc 명령어를 사용하여 메시지를 암호화하고 복호화할 것입니다. 구체적으로는 강력한 대칭 키 암호화 알고리즘인 AES-256-CBC 를 사용하며, 송신자와 수신자 사이의 공유 비밀번호 (Passphrase) 를 통해 암호화 키를 생성할 것입니다.
먼저 메시지를 암호화하여 보내는 송신용 스크립트를 만듭니다. 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
이 스크립트의 작동 방식은 다음과 같습니다:
반복문 (loop) 을 통해 계속해서 메시지 입력을 요청합니다.
입력받은 메시지를 OpenSSL 로 전달하여 암호화합니다.
Netcat(nc) 을 사용하여 암호화된 데이터를 localhost 의 12345 번 포트로 보냅니다.
암호화 설정에는 보안을 위한 솔트 (salt), 안전한 전송을 위한 base64 인코딩, 그리고 10,000 번의 반복 횟수를 가진 PBKDF2 키 유도 방식이 포함되어 있습니다.
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 -p 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
이 스크립트의 작동 방식은 다음과 같습니다:
12345 번 포트에서 데이터가 들어오기를 계속 기다립니다.
데이터가 수신되면 OpenSSL 을 통해 복호화 과정을 거칩니다.
송신 측과 동일한 암호화 파라미터를 사용하여 원래의 메시지를 복원합니다.
복원된 평문 (Plaintext) 메시지를 화면에 출력합니다.
Ctrl+X, Y, Enter를 눌러 저장하고 나옵니다. 마찬가지로 실행 권한을 부여합니다.
chmod +x secure_receiver.sh
이제 암호화 통신 시스템을 테스트해 봅시다. 수신용과 송신용을 위해 두 개의 터미널 창이 동시에 필요합니다.
첫 번째 터미널에서 수신 스크립트를 실행합니다.
./secure_receiver.sh
수신기가 메시지를 기다리고 있다는 문구가 뜹니다. 이제 12345 번 포트가 활성화되었습니다.
두 번째 터미널에서 송신 스크립트를 실행합니다.
./secure_sender.sh
메시지를 입력하라는 프롬프트가 나타납니다. 여기서 입력하는 모든 내용은 네트워크로 전송되기 전에 암호화됩니다.
송신 터미널에 메시지를 입력하고 Enter 를 누르세요. 암호화된 메시지가 전송되는 것을 확인할 수 있습니다 (전송 시점에 암호화된 형태가 아주 잠깐 보일 수 있습니다).
수신 터미널을 확인하면, 송신 터미널에서 입력한 메시지가 원래의 모습 그대로 복호화되어 나타나는 것을 볼 수 있습니다.
송신 터미널에서 계속 메시지를 보내보세요. 모든 메시지가 자동으로 암호화되어 전송되고, 수신 측에서 복호화되는 전체 과정을 확인할 수 있습니다. 이것이 바로 완벽한 보안 통신 루프입니다.
통신을 마치려면 두 터미널 모두에서 Ctrl+C 를 눌러 스크립트를 안전하게 종료합니다.
이 구성은 단순하지만 효과적인 암호화 통신 시스템을 보여줍니다. 테스트를 위해 localhost 를 사용했지만, 실제 네트워크 환경에서도 동일하게 작동합니다. 메시지는 전송 직전에 암호화되고 수신 직후에 복호화되므로 안전한 통신 채널이 형성됩니다. 실제 서비스 환경에서는 코드에 비밀번호를 직접 적는 방식보다 더 안전한 키 교환 방식을 사용해야 한다는 점을 유의하세요.
요약
이 실습을 통해 Netcat 을 활용한 네트워크 통신의 기초를 배우고, 안전한 데이터 전송을 위한 기본적인 암호화 기술을 탐구했습니다. Netcat 설치부터 특정 포트를 통한 연결 설정, 그리고 시스템 간 파일 전송까지 직접 실습해 보았습니다.
또한 OpenSSL 을 실제 통신에 적용해 봄으로써 네트워크 보안에서 암호화가 얼마나 중요한지 체감할 수 있었습니다. 오늘 배운 기초 기술은 더 복잡한 사이버 보안 개념과 보안 통신 프로토콜을 이해하는 데 튼튼한 밑거름이 될 것입니다.