리눅스 기초 시리즈의 25번째 주제에 오신 것을 환영합니다! 지난 시간에는 자동화의 심장인 crontab을 배웠습니다. 이제 우리는 파일 시스템과 자동화를 넘어, 리눅스 서버가 외부 세상과 소통하는 통로인 **'네트워크(Network)'**를 들여다볼 차례입니다.
개발을 하다 보면 가장 짜증 나는 순간 중 하나가 바로 "Address already in use (이미 사용 중인 주소)" 에러를 만날 때입니다. 분명히 프로그램을 껐는데, 포트는 여전히 누군가 점유하고 있어 새 서버를 띄울 수 없는 상황이죠. 오늘은 내 서버의 열린 문(Port)을 감시하고 범인을 찾아내는 두 자루의 돋보기, **netstat**와 ss 활용기를 공유합니다.
1. 나의 경험담: "유령 포트와의 전쟁"
최근 Flutter 웹 프로젝트를 로컬 리눅스 환경에서 테스트하고 있었습니다. 포트 8080에서 서버를 돌리다가 코드를 수정하고 다시 실행했는데, 갑자기 포트가 사용 중이라며 실행이 거부되었습니다.
터미널을 다 뒤져봐도 실행 중인 프로세스는 없었죠. 윈도우였다면 "컴퓨터 껐다 켜기"라는 최후의 수단을 썼겠지만, 이제 저는 리눅스 사용자입니다. 저는 침착하게 오늘 소개할 명령어를 입력했고, 백그라운드에서 죽지 않고 좀비처럼 살아있던 프로세스를 단 3초 만에 찾아내 '처단'할 수 있었습니다. 네트워크의 흐름을 볼 줄 안다는 것이 얼마나 큰 무기인지 실감한 순간이었습니다.
2. netstat: 클래식한 네트워크 탐지기
**netstat (Network Statistics)**는 리눅스 네트워크 모니터링의 조상님 격인 명령어입니다. 현재 내 컴퓨터에 연결된 모든 네트워크 연결 상태, 라우팅 테이블, 인터페이스 통계 등을 보여줍니다.
실험 코드: 열려 있는 포트 싹 다 보기
가장 많이 쓰이는 옵션 조합인 -tuln을 기억하세요.
# -t: TCP, -u: UDP, -l: Listening(대기 중), -n: 숫자로 표시(도메인 대신 IP)
netstat -tuln
결과 해석:
- Local Address: 0.0.0.0:80이라면 외부의 모든 IP로부터 80번 포트 접속을 기다리고 있다는 뜻입니다.
- State: LISTEN은 현재 연결을 기다리고 있는 '열린 문' 상태임을 의미합니다.
3. ss: 더 빠르고 똑똑한 차세대 수사관
최근 리눅스 배포판에서는 netstat 대신 **ss (Socket Statistics)**를 권장합니다. ss는 netstat보다 훨씬 빠르고 더 상세한 정보를 제공합니다. 특히 서버에 연결이 수만 개씩 몰리는 상황에서 ss의 진가가 드러납니다.
실험 코드: 프로세스 정보까지 한눈에 보기
-antp 조합을 사용하면 어떤 프로그램이 포트를 쓰고 있는지까지 알려줍니다.
# -a: 모두, -n: 숫자 표시, -t: TCP, -p: 프로세스 정보(PID/이름) 표시
sudo ss -antp
4. 실전 필살기: "8080 포트 점유자 검거하기"
에러 메시지 Address already in use: 8080을 만났을 때 사용하는 범인 검거 프로세스입니다.
검거 코드:
# 1. 8080 포트를 사용하는 프로세스 ID(PID) 찾기
# (sudo를 붙여야 다른 사용자의 프로세스 이름까지 보입니다)
sudo ss -tlnp | grep :8080
# 출력 예시:
# LISTEN 0 128 *:8080 *:* users:(("node",pid=1234,fd=18))
# 2. 범인(PID: 1234) 확인 후 종료하기 (주제 #16 복습!)
sudo kill -9 1234
(▲ Action: 포트를 점유하던 프로세스를 정확히 찾아 종료하고 나면, 다시 평화롭게 서버를 실행할 수 있습니다. grep과의 조합은 여기서도 빛을 발합니다.)
5. netstat vs ss 비교 가이드
두 명령어는 비슷해 보이지만 쓰임새가 약간 다릅니다.
| 비교 항목 | netstat | ss |
| 속도 | 보통 (연결이 많으면 느려짐) | 매우 빠름 (커널에서 직접 정보 호출) |
| 권장 여부 | 구형 시스템/습관적 사용 | 최신 리눅스 표준 |
| 정보 상세도 | 요약 정보 위주 | TCP 상태 등 매우 상세한 정보 제공 |
| 비유 | 돋보기 | 고해상도 현미경 |
6. 마치며: 서버의 문단속은 개발자의 기본
리눅스 기초 25단계를 거치며 우리는 이제 시스템의 내부 연산뿐만 아니라, 외부와 소통하는 통로까지 통제할 수 있게 되었습니다. 네트워크 포트를 관리하는 것은 단순히 에러를 해결하는 것을 넘어, 보안의 첫걸음이기도 합니다. 내가 열지 않은 낯선 포트가 LISTEN 상태라면 즉시 조사해야 하니까요.
오늘의 인사이트: "내 서버가 어디로 소통하고 있는지 모르는 것은, 내 집 문을 열어두고 누가 들어오는지 모르는 것과 같다."
25번째 이야기를 마칩니다. 이제 여러분은 네트워크 트러블슈팅의 전문가로 한 발짝 더 다가섰습니다. 다음 시간에는 이렇게 열려 있는 네트워크 통로를 지키는 파수꾼, **'방화벽(UFW) 설정으로 내 서버 보안 강화하기'**에 대해 다뤄보겠습니다.
오늘 확인한 포트 목록 중에 낯선 번호가 있어서 당황하셨나요? 그 포트가 어떤 서비스인지 구글링하기 전에 서비스 이름을 바로 확인하는 grep -w 포트번호 /etc/services 팁을 다음 포스팅에서 알려드릴까요?
'IT' 카테고리의 다른 글
| [리눅스 기초 #27] WSL2 버전 확인과 업그레이드: 성능 향상의 숨은 열쇠 (0) | 2026.02.03 |
|---|---|
| [리눅스 기초 #26] 2026년에도 여전히 WSL2인가? 설치부터 초기 최적화까지 (0) | 2026.02.03 |
| [리눅스 기초 #24] 잠들지 않는 성실한 조수: crontab으로 24시간 자동화 완성하기 (0) | 2026.02.02 |
| 리눅스 기초 #23] 틀린 그림 찾기의 달인: diff와 patch로 코드의 변화 추적하기 (1) | 2026.02.02 |
| [리눅스 기초 #22] 터미널의 엑셀과 메모장: sed와 awk로 텍스트 데이터 주무르기 (0) | 2026.02.01 |