💻 Netstat 명령어: 네트워크 통계 분석 완전 정복하기 😎
+------------------+ +------------------+
| CLIENT | | SERVER |
| 192.168.0.10 | | (Your Machine) |
| :54321 | | Port:8080 |
+------------------+ +------------------+
"분명 서비스를 껐는데 왜 포트가 아직도 사용 중이지?" 개발자라면 한 번쯤 이런 에러 메시지를 마주한 경험이 있을 겁니다. 혹은 내 서버에 어떤 IP들이 접속해 있는지 궁금할 때도 있죠. 이 모든 질문에 대한 해답이 바로 netstat
명령어에 있습니다.
⚡ TL;DRnetstat
은 현재 내 컴퓨터의 네트워크 연결 상태를 한눈에 보여주는 강력한 도구입니다. 이 글을 통해 어떤 프로세스가 특정 포트를 점유하고 있는지 확인하고, 네트워크 문제를 해결하는 핵심 사용법을 확실히 익힐 수 있습니다.
목차
- 배경: Netstat, 왜 필요한가?
- 핵심 개념: Netstat 출력 결과 완벽 분석
- 실습: 상황별 Netstat 명령어 사용법
- 모범 사례: 전문가처럼 Netstat 활용하기
- 마치며 & 참고자료
1. 배경: Netstat, 왜 필요한가?
netstat
은 'Network Statistics'의 약자로, 이름 그대로 네트워크 연결 상태, 라우팅 테이블, 인터페이스 통계 등 시스템의 전반적인 네트워크 정보를 보여주는 명령줄 도구입니다[5][6]. 리눅스와 윈도우 등 대부분의 운영체제에서 기본으로 제공되죠[3][7].
이 명령어가 특히 유용한 순간은 바로 네트워크 관련 문제를 진단할 때입니다[6][8].
✅ 주요 용어 정리
- 포트 (Port): 컴퓨터 내에서 특정 프로세스를 식별하기 위한 번호.
- 소켓 (Socket): 네트워크 통신을 위한 출입구. IP 주소와 포트 번호의 조합으로 구성됩니다.
- PID (Process ID): 운영체제에서 실행 중인 각 프로세스를 고유하게 식별하는 번호.
- 라우팅 테이블 (Routing Table): 데이터 패킷을 목적지까지 보낼 경로 정보가 담긴 표[1][6].
2. 핵심 개념: Netstat 출력 결과 완벽 분석
netstat
은 현재 시스템에서 활성화된 모든 네트워크 연결과 대기 중인 포트 목록을 상세히 표시하는 유틸리티입니다[1][3].
명령어를 실행하면 여러 칼럼으로 구성된 결과가 출력됩니다. 각 칼럼의 의미는 다음과 같습니다[5].
# netstat -antp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/httpd
tcp 0 0 192.168.1.5:80 10.20.30.40:51234 ESTABLISHED 1235/httpd
- Proto: 사용된 프로토콜 (TCP, UDP 등)[5].
- Recv-Q / Send-Q: 수신/송신 큐에 쌓여있는 데이터 바이트[5]. 0이 아니면 병목 현상을 의심할 수 있습니다.
- Local Address: 로컬 컴퓨터의 IP 주소와 포트 번호[4][5].
- Foreign Address: 연결된 원격 컴퓨터의 IP 주소와 포트 번호[4][5].
- State: 연결 상태를 나타내며, 문제 해결의 핵심 단서가 됩니다[3][4][5].
- PID/Program name: 해당 소켓을 사용하고 있는 프로세스의 ID와 이름[1][5]. (이 옵션을 보려면
-p
가 필요합니다)
✅ 주요 연결 상태(State) 값
상태 | 내용 |
---|---|
LISTEN | 외부로부터의 연결 요청을 기다리는 상태. 서버 데몬이 정상적으로 실행 중임을 의미합니다. |
ESTABLISHED | 클라이언트와 서버 간에 연결이 성공적으로 수립되어 데이터를 주고받는 상태입니다. |
SYN_RECEIVED | 서버가 클라이언트의 연결 요청(SYN)을 받고 응답(SYN/ACK)했지만, 아직 클라이언트의 최종 확인(ACK)을 받지 못한 상태입니다. 이 상태가 비정상적으로 많다면 SYN Flooding 공격을 의심해볼 수 있습니다. |
TIME_WAIT | 연결은 종료되었지만, 만약의 사태를 대비해 잠시 소켓을 열어두고 대기하는 상태입니다. 보통 시간이 지나면 자동으로 사라집니다. |
CLOSE_WAIT | 원격(상대방)에서 연결 종료를 요청했고, 로컬 애플리케이션이 연결을 종료하기를 기다리는 상태입니다. 이 상태가 계속 쌓인다면 애플리케이션에 문제가 있을 수 있습니다. |
CLOSED | 연결이 완전히 종료된 상태입니다. |
3. 실습: 상황별 Netstat 명령어 사용법
① 모든 연결 상태와 열린 포트 확인하기
가장 기본적이면서도 중요한 사용법입니다. -a
(all) 옵션은 모든 연결과 리스닝 포트를, -n
(numeric) 옵션은 호스트 이름 대신 IP 주소를 숫자로 바로 보여줘 속도를 높입니다[1][6][7].
# 모든 TCP/UDP 연결과 리스닝 포트를 숫자 형태로 표시
# -a: 모든 소켓 표시
# -n: 호스트, 포트 등을 이름 대신 숫자로 표시
$ netstat -an
# 출력 예시
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp6 0 0 :::80 :::* LISTEN
tcp6 0 0 192.168.0.5:22 192.168.0.10:54321 ESTABLISHED
② "포트 충돌" 원인인 프로세스 찾아내기
8080 포트가 이미 사용 중입니다(Port 8080 is already in use)
에러를 해결하는 필살기입니다. -p
(program) 옵션을 사용하면 어떤 프로세스가 해당 포트를 사용 중인지 PID를 알 수 있습니다[1][3][6].
# 리눅스에서 8080 포트를 사용하는 프로세스 찾기
# -t: TCP 프로토콜만
# -p: PID와 프로그램 이름 표시
$ netstat -antp | grep 8080
# 출력 예시
# 8080 포트를 PID 9876인 java 프로세스가 사용 중임을 알 수 있다.
tcp6 0 0 :::8080 :::* LISTEN 9876/java
# 윈도우에서는 -o 옵션으로 PID를 확인하고 findstr로 검색합니다.
> netstat -ano | findstr "8080"
③ 리스닝(LISTEN) 상태인 포트만 확인하기
서버가 정상적으로 떠서 클라이언트의 요청을 받을 준비가 되었는지 확인할 때 유용합니다. -l
(listen) 옵션을 사용하면 대기 중인 포트만 깔끔하게 볼 수 있습니다[1][3][6].
# TCP 프로토콜의 리스닝 포트와 관련 프로그램만 확인
# -l: 리스닝 상태의 소켓만 표시
$ netstat -nlpt
# 출력 예시
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1122/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 987/cupsd
tcp6 0 0 :::80 :::* LISTEN 5678/nginx: master
4. 모범 사례: 전문가처럼 Netstat 활용하기
상황에 따라 가장 효율적인 옵션 조합이 있습니다. 다음 표를 참고해 필요할 때마다 꺼내 쓰세요.
패턴 (Pattern) | 장점 | 주의점 |
---|---|---|
netstat -anp (Linux) netstat -ano (Windows) |
가장 범용적이고 강력한 조합. 모든 연결(-a ), 빠른 숫자 주소(-n ), 프로세스 ID(-p /-o )까지 한 번에 파악 가능[3][4]. |
정보가 너무 많아 한눈에 보기 어려울 수 있습니다. grep 이나 findstr 로 필터링하는 것이 거의 필수입니다[3]. |
netstat -nlpt |
TCP 리스닝 포트만 확인하여 서버 데몬의 상태를 점검하는 데 최적화되어 있습니다[3]. | UDP나 이미 연결된(ESTABLISHED) 상태는 보여주지 않으므로 전체 연결 현황 파악에는 부적합합니다. |
netstat -s |
프로토콜별(IP, TCP, UDP 등) 통계 정보를 보여줘 네트워크 전반의 건강 상태를 진단하는 데 유용합니다[1][3][6]. | 실시간 개별 연결이 아닌 누적 통계이므로 특정 시점의 문제를 찾는 데는 한계가 있습니다. |
netstat -r |
커널 라우팅 테이블을 직접 보여주어 네트워크 경로(Routing) 문제를 진단할 때 필수적입니다[1][4][6]. | 일반적인 포트 확인 목적과는 거리가 멀고, 네트워크 전문 지식이 필요할 수 있습니다. |
5. 마치며 & 참고자료
netstat
은 단순해 보이지만, 옵션 조합에 따라 무궁무진하게 활용할 수 있는 네트워크 관리의 맥가이버 칼입니다.
- 오늘 배운 점 3줄 요약
netstat
은 내 컴퓨터의 모든 네트워크 연결 상태를 보여주는 기본 명령어다.-a
(모두),-n
(숫자),-p
(프로세스) 옵션의 조합은 문제 해결의 첫걸음이다.LISTEN
,ESTABLISHED
,TIME_WAIT
등 연결 상태(State)를 이해하면 문제의 원인을 더 깊이 파악할 수 있다.
- 실제 프로젝트 적용 팁
- 새로 개발한 API 서버를 배포했다면, 터미널을 열고
netstat -nlpt | grep [포트번호]
를 입력해 서비스가 의도한 포트에서 정상적으로 LISTEN 하고 있는지 가장 먼저 확인하세요.
이 글이 도움이 되셨다면 ❤️ 하트와 댓글 부탁드립니다! 궁금한 점이 있다면 언제든지 질문해주세요.
참고자료
- Microsoft Docs: netstat [9]
- 샘플 레포지토리
- 추가 읽을거리
[1] https://cafe24.zendesk.com/hc/ko/articles/9801441063449-LINUX-netstat-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%83%81%EC%84%B8-%EC%84%A4%EB%AA%85
[2] https://blog.naver.com/ncloud24/221388026417
[3] https://blog.skills.kro.kr/9
[4] https://okhyeon.tistory.com/20
[5] https://kkang-joo.tistory.com/91
[6] https://gbminnote.com/entry/Linux-command-netstat-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%82%AC%EC%9A%A9%EB%B2%95-%EB%B0%8F-%EC%98%88%EC%A0%9C
[7] https://chunsubyeong.tistory.com/144
[8] https://velog.io/@rbdus96/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%AA%85%EB%A0%B9%EC%96%B4-netstat
[9] https://learn.microsoft.com/ko-kr/windows-server/administration/windows-commands/netstat
[10] https://rondeveloper.tistory.com/63