netcat nc 으로 서버 간 파일 전송과 포트 테스트하는 법

조회수: 1

netcat nc 이란 무엇인가

netcat 은 네트워크 연결을 만들고 다루기 위한 범용 도구다. 명령어 이름은 보통 nc 로 사용한다.
간단한 명령 몇 줄만으로 다음과 같은 일을 할 수 있다.

  • 특정 포트가 열려 있는지 확인
  • 포트를 열어 리스너로 대기
  • 서버와 서버 사이에 데이터 스트림을 직접 주고받기
  • 파일 전송과 간이 채팅까지 처리

복잡한 설정 없이도 표준 입출력 스트림과 네트워크 소켓을 연결해 주기 때문에 디버깅과 운영 모두에서 매우 유용하다.

netcat 설치 방법 요약

대부분의 리눅스 배포판에는 netcat 이 기본 패키지로 들어 있다. 배포판마다 패키지 이름이 조금씩 다를 수 있으니 아래 명령을 참고하면 된다.

Ubuntu Debian 계열

sudo apt update
sudo apt install netcat-openbsd

CentOS Rocky AlmaLinux 계열

sudo yum install nc

설치가 끝나면 다음 명령으로 버전과 경로를 확인해 볼 수 있다.

which nc
nc -h

도움말이 출력되면 준비가 끝난 것이다.

포트 테스트로 사용하는 기본 패턴

먼저 netcat 을 포트 테스트 도구로 사용하는 가장 단순한 예를 보자.
원격 서버에 특정 포트가 열려 있는지 확인하려면 아래처럼 실행한다.

nc -vz example com 22

여기서 옵션 의미는 다음과 같다.

  • v 상세 출력
  • z 실제 데이터를 보내지 않고 포트만 스캔
  • 마지막 숫자 테스트할 포트 번호

연속된 포트 범위를 확인하고 싶다면 다음처럼 쓸 수 있다.

nc -vz example com 20 25

이렇게 하면 20 에서 25 까지 순차적으로 연결을 시도하고 열려 있는 포트와 닫힌 포트를 구분해 보여 준다.
서버 방화벽 설정이나 보안 그룹을 수정한 뒤 빠르게 유효성을 검증할 때 특히 유용하다.

리스너를 열고 직접 연결 테스트하기

단순 포트 스캔만으로는 부족할 때가 있다. 예를 들어 내부망에서 특정 포트로 실제 데이터가 전달되는지 확인하고 싶을 때가 그렇다. 이때는 한쪽 서버는 리스너로 대기시키고 다른 서버에서 연결해 보는 방식으로 점검할 수 있다.

먼저 서버 A 에서 포트를 열어 둔다.

nc -lv 9000
  • l 리스닝 모드
  • v 상세 출력
  • 9000 대기할 포트 번호

이제 서버 B 에서 서버 A 로 접속을 시도한다. 서버 A 의 내부 주소가 192 점대라고 가정해 보자.

nc 192 168 0 10 9000

서버 B 에서 아무 글자나 입력하고 엔터를 치면 서버 A 의 터미널에 그대로 보인다. 반대로 서버 A 에서 입력하면 서버 B 에서 보인다. 이 과정을 통해

  • 포트포워딩이나 방화벽이 실제로 통과되는지
  • 특정 경로에서 패킷 손실이나 지연이 심하지 않은지

를 간단히 확인할 수 있다.

서버 간 텍스트 파일 전송 기본 예시

이제 실전으로 넘어가 파일 전송 예시를 살펴보자. netcat 의 가장 큰 장점은 별도 프로토콜 없이 순수한 TCP 연결만으로 파일을 보낼 수 있다는 점이다.

먼저 받을 쪽 서버에서 리스너를 열고 파일을 저장할 준비를 한다. 서버 A 가 받는 쪽이라고 가정하자.

nc -lv 9000 > backup tar gz

이 상태에서 서버 B 에서 파일을 전송한다.

cat backup tar gz | nc 192 168 0 10 9000

명령이 끝나면 서버 A 의 현재 디렉터리에 backup tar gz 파일이 생성된다. 파일 크기가 큰 경우 시간이 다소 걸릴 수 있으므로 전송 중에는 터미널을 닫지 않는 것이 중요하다.

이 방식의 특징은 다음과 같다.

  • 별도 서버 프로그램 설치가 필요 없다
  • scp 나 rsync 를 쓰기 어려운 제한된 환경에서도 활용 가능
  • VPN 환경 내부에서 임시 파일 전송 용도로 쓰기 좋다

반대로 인증과 암호화가 전혀 없기 때문에 인터넷 구간에서 그대로 쓰는 것은 권장되지 않는다. 가능하면 사설망이나 SSH 터널 안에서 사용하는 편이 좋다.

바이너리 파일 전송 시 주의점

텍스트뿐 아니라 실행 파일이나 이미지, 데이터베이스 덤프 같은 바이너리 파일도 같은 방식으로 전송할 수 있다. 다만 다음 사항을 꼭 지키는 것이 좋다.

  • 중간에 터미널에서 줄바꿈이나 문자를 입력하지 않는다
  • 전송 도중 세션이 끊어지면 파일이 손상되므로 다시 처음부터 전송한다
  • 전송 후 md5sum 혹은 sha256sum 으로 무결성을 확인한다

양쪽 서버에서 체크섬을 구해 비교하는 예시는 다음과 같다.

md5sum backup tar gz
sha256sum backup tar gz

출력되는 해시 값이 양쪽 서버에서 동일하다면 전송이 정상적으로 끝난 것이다.

특정 포트로 파일 스트림 전달하기

상황에 따라 netcat 을 중계처럼 사용할 수도 있다. 예를 들어 애플리케이션 서버에는 netcat 만 있고 scp 를 쓰기 어렵다면

  • DB 서버에서 덤프를 만들어 netcat 으로 내보내고
  • 중간 서버가 이 스트림을 받아 바로 파일로 쓰는 방식

으로 구성할 수 있다.

DB 서버에서

pg_dump mydb | nc -lv 9000

중간 서버에서

nc db 서버 주소 9000 > mydb sql

이렇게 하면 DB 서버에는 덤프 파일을 남기지 않고 바로 다른 서버로 데이터가 전송된다. 로그 디스크 용량이 부족하거나 임시 저장이 껄끄러운 환경에서 쓸 수 있는 패턴이다.

UDP 포트 테스트와 간단한 사용 예

지금까지는 TCP 중심이었지만 netcat 은 UDP 포트 테스트에도 활용할 수 있다. 옵션에 u 를 붙이면 된다.

서버에서 UDP 리스너 실행

nc -luv 9000

클라이언트에서 UDP 패킷 전송

echo "test" | nc -u 192 168 0 10 9000

UDP 는 연결 개념이 없기 때문에 그냥 데이터가 날아갈 뿐이다. 방화벽이나 로드 밸런서가 UDP 포트를 어떻게 처리하는지 확인할 때 가볍게 써 볼 수 있다.

보안 측면에서의 주의 사항

netcat 은 강력한 만큼 잘못 사용하면 보안상 위험을 만들기 쉽다. 몇 가지 핵심 주의 사항을 정리하면 다음과 같다.

  • 외부에서 접근 가능한 포트에서 쉘을 그대로 노출하지 않는다
    • 예를 들어 nc 로 리스너를 열고 /bin/sh 를 연결하는 패턴은 실험용으로만 사용하고 실제 서버에는 쓰지 않는 편이 좋다
  • 임시 파일 전송이라도 꼭 필요한 포트만 잠깐 열었다 닫는 습관을 들인다
  • 가능하다면 방화벽으로 허용된 IP 범위를 제한하고 사용한다
  • 중요한 데이터 전송에는 SSH 터널이나 VPN 안에서 netcat 을 사용하는 것을 고려한다

즉 netcat 은 어디까지나 저수준 도구라는 점을 기억해야 한다. 파일 전송이 편하다고 해서 인증과 암호화가 있는 상위 레벨 도구를 모두 대체할 수 있는 것은 아니다.

트러블슈팅과 체크 순서

netcat 으로 포트 테스트나 파일 전송을 할 때 동작하지 않는다면 다음 순서로 점검해 보면 된다.

1 리스너가 실제로 떠 있는지 확인
다른 터미널에서 ps 혹은 ss 명령으로 포트 리슨 여부를 확인한다

ss -tulpn | grep 9000

2 방화벽이 포트를 막고 있지 않은지 확인
UFW iptables 보안 그룹 등에서 포트 허용 여부를 점검한다

3 주소 오타와 포트 번호 확인
특히 내부망 주소를 입력할 때 한 자리만 틀려도 전혀 다른 장비로 연결된다

4 중간 장비의 영향 확인
로드 밸런서 프록시 장비 IPS 와 같이 패킷을 가로채는 장비의 규칙에 막히는 경우도 있다

이 정도만 체크해도 대부분의 문제는 원인을 찾을 수 있다.

마무리 netcat 을 실전 도구로 익히기

정리해 보면 netcat nc 은

  • 서버 간 포트가 실제로 열려 있는지 빠르게 확인하고
  • 간단한 파일 전송을 처리하며
  • TCP 와 UDP 모두를 다룰 수 있는

실용적인 네트워크 도구다.
처음에는 포트 테스트와 작은 텍스트 파일 전송부터 연습해 보고, 익숙해지면 백업 덤프 전송이나 중계 서버 구성 같은 패턴까지 확장해 볼 수 있다. 기본 원리와 위험 요소만 잘 이해해 두면 netcat 은 리눅스 서버 운영 환경에서 매우 든든한 만능 칼이 되어 준다.