우분투 실전 명령어 | nc(netcat)로 포트 연결 테스트

서비스가 살아 있는지 가장 빠르게 확인할 때 nc(netcat)만큼 손에 익혀두기 좋은 도구가 없습니다. 헬스체크가 애매할 때, 방화벽 때문에 막힌 건지 애플리케이션이 안 뜬 건지 구분할 때 특히 유용합니다. 운영 중 장애 초반에 원인 범위를 줄이는 데 바로 써먹을 수 있습니다.

바로 쓰는 명령어

# 1) 특정 호스트/포트 TCP 연결 확인
nc -zv 127.0.0.1 22

# 2) 여러 포트 한 번에 스캔
nc -zv 10.0.1.15 22 80 443 5432

# 3) 타임아웃 지정
nc -zvw 3 db.internal 3306

예시 출력:

$ nc -zv 127.0.0.1 22
Connection to 127.0.0.1 22 port [tcp/ssh] succeeded!

$ nc -zvw 3 db.internal 3306
nc: connect to db.internal port 3306 (tcp) failed: Connection timed out

핵심 옵션/패턴

  • -z: 데이터 전송 없이 포트 오픈 여부만 검사
  • -v: verbose 출력으로 성공/실패 원인 확인
  • -w <초>: 연결 타임아웃 지정

자동화에서 자주 쓰는 패턴:

# 성공 시 0, 실패 시 1 이상
nc -z -w 2 127.0.0.1 8080 >/dev/null 2>&1
if [ $? -eq 0 ]; then
  echo "port 8080 OK"
else
  echo "port 8080 FAIL"
fi

또는 더 짧게:

nc -z -w 2 127.0.0.1 8080 >/dev/null 2>&1 && echo "UP" || echo "DOWN"

자주 하는 실수

  • nc -v host port만 쓰고 멈춘 화면을 보고 장애로 오해하는 경우
    → 포트 체크 목적이면 -z를 같이 써야 빠르게 끝납니다.
  • 타임아웃 없이 원격 포트를 점검해서 스크립트가 오래 걸리는 경우
    → 운영 스크립트에는 -w 2 또는 -w 3를 습관적으로 넣는 게 안전합니다.
  • UDP 점검을 TCP 방식으로 착각하는 경우
    → UDP는 -u를 명시해야 합니다.

검증 방법

포트 점검 결과를 ss와 서비스 상태로 교차 확인하면 오판을 줄일 수 있습니다.

# 리스닝 포트 확인
ss -lntp | grep ':8080'

# systemd 서비스 상태 확인
systemctl status myapp --no-pager -l | sed -n '1,12p'

예시 출력:

$ ss -lntp | grep ':8080'
LISTEN 0      4096         0.0.0.0:8080       0.0.0.0:*    users:(("myapp",pid=2143,fd=12))

$ systemctl status myapp --no-pager -l | sed -n '1,12p'
● myapp.service - My App API
     Loaded: loaded (/etc/systemd/system/myapp.service; enabled)
     Active: active (running) since Wed 2026-02-18 21:31:42 KST; 14min ago

운영 팁

운영 환경에서는 nc 단독 결과만 믿지 말고, 애플리케이션 로그(journalctl -u <service>)까지 같이 확인하세요. 포트는 열려 있어도 내부 의존성(DB, Redis, 외부 API) 오류로 실제 요청이 실패하는 케이스가 자주 나옵니다.

출처

  • Ubuntu Manpages
  • OpenBSD netcat 매뉴얼
  • systemd 공식 문서