서버 네트워크 문제는 다양한 원인으로 발생합니다. 당황하지 않고 단계별로 접근하면 대부분의 문제를 빠르게 찾을 수 있습니다.

1단계: 기본 연결 확인

# 인터넷 연결 확인
ping -c 4 8.8.8.8

# DNS 해석 확인
nslookup google.com
dig google.com

# 특정 도메인 확인
ping -c 4 example.com

# 내 서버 IP 확인
curl ifconfig.me
ip addr show

2단계: 네트워크 인터페이스 상태 확인

# 인터페이스 목록 및 IP 확인
ip addr show
ip link show

# 인터페이스 통계 (에러, 드롭 확인)
ip -s link show eth0

# 라우팅 테이블 확인
ip route show
route -n

# 기본 게이트웨이 확인
ip route | grep default

3단계: 포트 및 서비스 확인

# 특정 포트가 열려 있는지 확인
# 서버에서 실행
sudo ss -tlnp | grep :80
sudo ss -tlnp | grep :443

# 외부에서 포트 확인 (다른 서버에서)
nc -zv server-ip 80
telnet server-ip 80

# nmap으로 포트 스캔
nmap -p 22,80,443 server-ip

# curl로 HTTP 응답 확인
curl -I http://server-ip
curl -I https://example.com
curl -v https://example.com 2>&1 | head -30

4단계: DNS 문제 진단

# DNS 응답 확인
dig example.com
dig example.com @8.8.8.8  # Google DNS 사용
dig +short example.com

# 역방향 DNS (PTR 레코드)
dig -x 203.0.113.10

# DNS 전파 확인 (여러 네임서버에서)
dig example.com @8.8.8.8     # Google
dig example.com @1.1.1.1     # Cloudflare
dig example.com @168.126.63.1 # KT DNS

# /etc/resolv.conf 확인
cat /etc/resolv.conf

# hosts 파일 확인
cat /etc/hosts

5단계: 응답 속도 문제 진단

# 경로별 지연시간 추적
traceroute example.com
traceroute -n example.com   # DNS 역방향 없이 (빠름)
mtr example.com              # 실시간 traceroute

# HTTP 응답 시간 측정
curl -o /dev/null -s -w "응답코드: %{http_code}\n연결시간: %{time_connect}s\nTTFB: %{time_starttransfer}s\n전체: %{time_total}s\n" https://example.com

# 네트워크 대역폭 테스트 (iperf3)
# 서버에서
iperf3 -s
# 클라이언트에서
iperf3 -c server-ip

6단계: 방화벽 확인

# UFW 규칙 확인
sudo ufw status numbered

# iptables 규칙 확인
sudo iptables -L -n -v

# 차단된 패킷 로그 확인
sudo grep "UFW BLOCK\|IPT DROP" /var/log/kern.log | tail -20

# 임시로 방화벽 비활성화 (테스트 후 반드시 재활성화!)
sudo ufw disable
# 테스트...
sudo ufw enable

7단계: 서비스 상태 확인

# Nginx 상태 확인
sudo systemctl status nginx
sudo nginx -t              # 설정 파일 검사

# 서비스 재시작
sudo systemctl restart nginx
sudo systemctl restart php8.2-fpm

# 실시간 에러 로그 확인
sudo tail -f /var/log/nginx/error.log
sudo journalctl -u nginx -f

8단계: 연결 수 및 리소스 확인

# 현재 TCP 연결 수
ss -s
ss -tn | grep ESTABLISHED | wc -l

# TIME_WAIT 상태 연결 (많으면 문제)
ss -tn | grep TIME_WAIT | wc -l

# 연결 상태별 집계
ss -tan | awk 'NR>1{print $1}' | sort | uniq -c | sort -rn

# CPU/메모리 사용률
top -bn1 | head -15
free -h

# 디스크 용량 (가득 차면 서비스 장애)
df -h

자주 발생하는 문제와 해결법

“Connection refused” (포트가 닫혀 있음)

# 서비스가 실행 중인지 확인
systemctl status nginx

# 해당 포트를 누가 사용하는지
sudo ss -tlnp | grep :80

# 방화벽이 차단하는지
sudo ufw status

“Connection timed out” (패킷이 도달하지 않음)

# 방화벽에서 차단 중인지 확인
sudo iptables -L -n | grep -i drop
sudo ufw status

# 네트워크 경로 문제
traceroute server-ip
mtr server-ip

“502 Bad Gateway” (Nginx → 백엔드 연결 실패)

# Nginx 에러 로그 확인
sudo tail -20 /var/log/nginx/error.log

# PHP-FPM 소켓 확인
sudo ls -la /run/php/php8.2-fpm.sock
sudo systemctl status php8.2-fpm

“Too many open files” (파일 디스크립터 한도 초과)

# 현재 한도 확인
ulimit -n
cat /proc/sys/fs/file-max

# 한도 늘리기
sudo sh -c 'echo "fs.file-max = 1000000" >> /etc/sysctl.conf'
sudo sysctl -p

# Nginx 한도 설정
# /etc/nginx/nginx.conf
# worker_rlimit_nofile 65535;

패킷 캡처 (고급 진단)

# 특정 포트의 패킷 캡처
sudo tcpdump -i eth0 port 80 -n

# 특정 IP와의 통신 캡처
sudo tcpdump -i eth0 host 203.0.113.10 -n

# 파일로 저장 (Wireshark로 분석)
sudo tcpdump -i eth0 port 80 -w /tmp/capture.pcap

네트워크 문제는 단계적으로 접근하는 것이 핵심입니다. 인터넷 연결 → DNS → 라우팅 → 방화벽 → 서비스 순서로 확인하면 대부분의 문제를 빠르게 찾을 수 있습니다. TCP-80.NET 서버 관련 네트워크 문제는 텔레그램 @tcp80net으로 언제든지 문의하세요.