리눅스 시스템을 관리하다 보면 어떤 프로세스가 어떤 포트를 사용하고 있는지, 네트워크 연결 상태는 어떤지 확인해야 할 때가 있습니다. 갑자기 서버가 느려지거나 특정 포트가 막혔을 때, 어디서부터 문제를 찾아야 할지 막막하셨던 경험이 있으실 텐데요.
오늘은 시스템 관리자와 개발자들이 반드시 알아야 할 네트워크 진단 도구인 lsof와 ss 명령어를 완전정복해보겠습니다. 이 글 하나로 네트워크 트러블슈팅 실력이 한 단계 업그레이드될 것을 약속드립니다!
🔍 lsof란? 열린 파일의 모든 것을 보여주는 마법의 도구
lsof(List Open Files)는 현재 시스템에서 열려 있는 모든 파일과 네트워크 연결을 보여주는 강력한 명령어입니다. 리눅스에서는 모든 것이 파일로 취급되기 때문에, 네트워크 소켓도 파일의 한 형태로 관리됩니다.
기본 사용법과 핵심 옵션들
# 시스템의 모든 열린 파일 나열
lsof
# 특정 포트로 필터링 (80번 포트)
lsof -i :80
# HTTPS 포트 확인 (443번 포트)
lsof -i :443
# 특정 프로세스가 사용하는 파일들
lsof -p [프로세스ID]
# 특정 사용자가 열고 있는 파일들
lsof -u [사용자명]
lsof 출력 결과 해석하기
lsof를 실행하면 다음과 같은 컬럼들이 표시됩니다:
- COMMAND: 프로세스 이름
- PID: 프로세스 ID
- USER: 파일을 연 사용자
- FD: 파일 디스크립터 (File Descriptor)
- TYPE: 파일 타입 (REG, DIR, IPv4, IPv6 등)
- DEVICE: 장치 번호
- SIZE/OFF: 파일 크기 또는 오프셋
- NODE: 아이노드 번호
- NAME: 파일명 또는 연결 정보
💡 실전 활용 예시: 웹서버 포트 점검하기
HTTP 포트 (80번) 모니터링
lsof -i :80
이 명령어로 다음과 같은 정보를 확인할 수 있습니다:
- 어떤 웹서버가 80번 포트를 사용하고 있는지
- 현재 연결된 클라이언트들의 IP 주소
- 연결 상태 (LISTEN, ESTABLISHED, TIME_WAIT 등)
HTTPS 포트 (443번) 보안 점검
lsof -i :443
SSL/TLS 연결을 처리하는 프로세스들을 확인하여:
- 보안 연결이 정상적으로 설정되어 있는지
- 예상치 못한 프로세스가 443 포트를 사용하고 있지는 않은지
- 인증서 관련 프로세스들의 상태는 어떤지 점검할 수 있습니다.
⚡ ss 명령어: 현대적인 네트워크 소켓 분석 도구
ss(Socket Statistics)는 netstat의 현대적인 대안으로, 더 빠르고 상세한 네트워크 연결 정보를 제공합니다. 특히 대용량 트래픽을 처리하는 서버에서는 netstat보다 월등한 성능을 보여줍니다.
ss의 핵심 옵션들
# 포트 80에서 리스닝 중인 소켓 표시
ss -lnt 'sport = :80'
# 모든 TCP 소켓 정보
ss -t
# 모든 리스닝 포트 표시
ss -ln
# 연결된 소켓들의 상세 정보
ss -i
# 프로세스 정보와 함께 표시
ss -lntp
ss 옵션 상세 설명
- l: 리스닝 상태인 소켓만 표시
- n: 호스트명과 포트를 숫자로 표시 (DNS 조회 안함)
- t: TCP 소켓만 표시
- u: UDP 소켓만 표시
- p: 프로세스 정보 표시
- i: 내부 TCP 정보 표시
- s: 소켓 통계 요약 정보
🚀 고급 활용: 트러블슈팅 시나리오별 대응법
시나리오 1: “웹사이트가 안 열려요!”
# 1단계: 웹서버가 정상적으로 리스닝하고 있는지 확인
lsof -i :80
ss -lnt 'sport = :80'
# 2단계: 프로세스 상태 확인
ps aux | grep apache2 # 또는 nginx
# 3단계: 연결 상태 점검
ss -tn 'sport = :80'
시나리오 2: “서버 성능이 갑자기 느려졌어요!”
# 1단계: 전체 연결 수 확인
ss -s
# 2단계: TIME_WAIT 상태 소켓 개수 확인
ss -tan | grep TIME_WAIT | wc -l
# 3단계: 가장 많이 연결된 IP 찾기
ss -tn | awk '{print $4}' | cut -d: -f1 | sort | uniq -c | sort -nr
시나리오 3: “보안 이슈 의심 상황”
# 1단계: 예상치 못한 포트가 열려있는지 확인
ss -lntp | grep -v ":22\\\\|:80\\\\|:443"
# 2단계: 외부 연결 점검
lsof -i -P | grep ESTABLISHED
# 3단계: 특정 포트 범위 스캔
lsof -i :1000-2000
📊 성능 비교: lsof vs ss vs netstat
도구 | 속도 | 메모리 사용량 | 기능성 | 추천 상황 |
---|---|---|---|---|
lsof | 보통 | 높음 | ★★★★★ | 파일 시스템 분석 |
ss | 빠름 | 낮음 | ★★★★☆ | 네트워크 소켓 분석 |
netstat | 느림 | 보통 | ★★★☆☆ | 레거시 시스템 |
🛡️ 보안 관점에서의 활용 팁
1. 무단 접근 탐지
# 현재 연결된 외부 IP들 모니터링
lsof -i | grep ESTABLISHED | awk '{print $9}' | cut -d'>' -f2
2. 포트 스캐닝 공격 탐지
# SYN_RECV 상태가 비정상적으로 많은지 확인
ss -tan | grep SYN_RECV | wc -l
3. 백도어 프로세스 탐지
# 예상치 못한 리스닝 포트 확인
ss -lntp | grep -E ":[0-9]{5}" # 5자리 포트 번호들
🔧 실무에서 자주 사용하는 원라이너 명령어들
# TOP 10 포트별 연결 수
ss -tan | awk 'NR>1{print $4}' | cut -d: -f2 | sort | uniq -c | sort -nr | head -10
# 특정 IP에서 오는 모든 연결
lsof -i | grep "192.168.1.100"
# 메모리 사용량이 높은 네트워크 프로세스 찾기
lsof -i | awk '{print $2}' | sort | uniq | xargs ps -o pid,vsz,comm -p
# 포트별 프로세스 매핑
ss -lntp | awk '{print $4, $7}' | column -t
⚙️ 모니터링 스크립트 만들기
다음은 주기적으로 네트워크 상태를 점검하는 간단한 스크립트입니다:
#!/bin/bash
# network_monitor.sh
echo "=== Network Status Report ==="
echo "Date: $(date)"
echo ""
echo "Top 5 ports by connection count:"
ss -tan | awk 'NR>1{print $4}' | cut -d: -f2 | sort | uniq -c | sort -nr | head -5
echo ""
echo "Web server status:"
lsof -i :80 -i :443
echo ""
echo "Unusual listening ports (>10000):"
ss -lnt | awk '$4 ~ /:1[0-9]{4}$/ {print $4}'
🎯 마무리: 효과적인 네트워크 진단을 위한 체크리스트
네트워크 문제 발생 시 다음 순서로 진단하세요:
- 기본 상태 확인:
ss -s
로 전체 소켓 통계 파악 - 포트 상태 점검:
lsof -i :[포트번호]
로 특정 포트 확인 - 프로세스 연관성:
ss -lntp
로 프로세스와 포트 매핑 - 연결 품질 분석:
ss -i
로 TCP 내부 정보 확인 - 보안 검증: 예상치 못한 연결이나 프로세스 탐지
lsof와 ss 명령어는 시스템 관리자와 개발자에게 없어서는 안 될 필수 도구입니다. 이 글에서 소개한 기법들을 실제 업무에 적용해보시고, 여러분만의 노하우도 댓글로 공유해주세요!
더 궁금한 점이 있으시거나, 특별한 상황에서의 활용법을 알고 싶으시다면 언제든 댓글 남겨주시기 바랍니다. 함께 배우고 성장하는 개발자 커뮤니티를 만들어가요! 🚀
참고 자료: