소개
이 실습에서는 네트워크 도구 중에서도 다재다능하여 '맥가이버 칼'이라는 별명을 가진 Netcat 의 기초를 배웁니다. 이 강력한 유틸리티를 사용하여 TCP 또는 UDP 프로토콜을 통해 네트워크 연결 간에 데이터를 읽고 쓰는 방법을 알아보겠습니다.
직접적인 실습을 통해 클라이언트 - 서버 통신의 기본을 탐구하고, 간단한 채팅 시스템을 만들어보며 포트와 같은 필수적인 네트워크 개념을 이해하게 됩니다. 또한, 안전한 데이터 전송을 위한 기초적인 암호화 기술도 함께 살펴볼 예정입니다.
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.txtcat명령어는 파일의 내용을 화면에 출력합니다. 원본 비밀 메시지와 정확히 일치하는지 확인해 보세요.

- 축하합니다! 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 을 실제 통신에 적용해 봄으로써 네트워크 보안에서 암호화가 얼마나 중요한지 체감할 수 있었습니다. 오늘 배운 기초 기술은 더 복잡한 사이버 보안 개념과 보안 통신 프로토콜을 이해하는 데 튼튼한 밑거름이 될 것입니다.



