안녕하세요, 성장하는 개발자 여러분!
서버가 갑자기 응답하지 않을 때, 배포한 애플리케이션에 접속이 안 될 때, 데이터베이스 연결이 끊어질 때… 이런 상황에서 여러분은 어떻게 하시나요? 당황해서 “인터넷이 안 돼요!”라고 외치기보다는, 체계적으로 문제를 진단하고 해결할 수 있는 능력이 필요합니다.
오늘은 제가 실무에서 수없이 겪었던 네트워크 문제들과 그 해결 과정을 통해 얻은 실전 트러블슈팅 노하우를 공유해 드리겠습니다. 이론보다는 “지금 당장 문제를 해결해야 하는” 상황에 초점을 맞춰 설명하겠습니다!
1. 네트워크 진단의 기본: 단계별 접근법
🚨 긴급 상황 대응 체크리스트
문제가 발생했을 때 가장 먼저 해야 할 일들입니다:
# 1. 기본 네트워크 인터페이스 상태 확인
ip addr show
# 또는
ifconfig
# 2. 기본 게이트웨이 연결 확인
ping -c 3 $(ip route | grep default | awk '{print $3}')
# 3. DNS 서버 연결 확인
ping -c 3 8.8.8.8
# 4. 외부 연결 확인
ping -c 3 google.com
# 5. 포트 리스닝 상태 확인
netstat -tuln
# 또는 (최신 시스템)
ss -tuln
📊 네트워크 정보 수집 원라이너
# 종합 네트워크 상태 확인 스크립트
echo "=== 네트워크 인터페이스 ===" && ip addr show &&
echo "=== 라우팅 테이블 ===" && ip route show &&
echo "=== DNS 설정 ===" && cat /etc/resolv.conf &&
echo "=== 활성 연결 ===" && ss -tuln | head -10
2. NetworkManager vs Legacy Network: 현대적 네트워크 관리
NetworkManager 활용하기
최신 리눅스 시스템에서는 NetworkManager가 기본입니다. 동적으로 네트워크 설정을 변경할 수 있어 매우 유용합니다.
nmcli로 빠른 네트워크 설정
# 현재 연결 상태 확인
nmcli connection show
# 활성 연결만 확인
nmcli connection show --active
# 새로운 정적 IP 연결 생성
nmcli connection add type ethernet con-name "static-conn"
ifname eth0 ipv4.addresses 192.168.1.100/24
ipv4.gateway 192.168.1.1 ipv4.dns 8.8.8.8
ipv4.method manual
# 연결 활성화
nmcli connection up "static-conn"
# DHCP 연결로 변경
nmcli connection modify "static-conn" ipv4.method auto
nmcli connection up "static-conn"
nmtui: 텍스트 기반 GUI
# 직관적인 네트워크 설정 도구 실행
nmtui
실무 팁: 빠른 IP 변경
# 임시로 IP 주소 추가 (재부팅 시 사라짐)
sudo ip addr add 192.168.1.200/24 dev eth0
# IP 주소 제거
sudo ip addr del 192.168.1.200/24 dev eth0
# 인터페이스 활성화/비활성화
sudo ip link set eth0 down
sudo ip link set eth0 up
3. 실전 트러블슈팅 시나리오
시나리오 1: “웹 서버에 접속이 안 됩니다!”
증상: 웹 애플리케이션에 접속할 수 없음
진단 과정:
# 1단계: 서비스 상태 확인
sudo systemctl status nginx
sudo systemctl status apache2
# 2단계: 포트 리스닝 확인
ss -tuln | grep :80
ss -tuln | grep :443
# 3단계: 방화벽 확인
sudo firewall-cmd --list-all
sudo iptables -L
# 4단계: 로그 확인
sudo tail -f /var/log/nginx/error.log
sudo journalctl -u nginx -f
해결 과정:
# 서비스 재시작
sudo systemctl restart nginx
# 방화벽 포트 열기
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
# 포트 직접 열기
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
시나리오 2: “데이터베이스 연결이 끊어집니다!”
증상: 애플리케이션에서 DB 연결 타임아웃
진단 과정:
# 1단계: DB 서버 연결 테스트
telnet db-server 3306 # MySQL
telnet db-server 5432 # PostgreSQL
# 2단계: 네트워크 경로 확인
traceroute db-server
mtr db-server # 실시간 경로 추적
# 3단계: DNS 해석 확인
nslookup db-server
dig db-server
# 4단계: 연결 풀 상태 확인
ss -tuln | grep :3306
해결 과정:
# /etc/hosts에 DB 서버 추가 (DNS 문제 임시 해결)
echo "192.168.1.10 db-server" | sudo tee -a /etc/hosts
# MySQL 연결 테스트
mysql -h db-server -u username -p
# 애플리케이션 재시작으로 연결 풀 초기화
sudo systemctl restart your-app
시나리오 3: “인터넷은 되는데 특정 사이트만 안 됩니다!”
증상: 일반적인 웹사이트는 접속되지만 특정 서비스만 안 됨
진단 과정:
# 1단계: DNS 문제 확인
nslookup problematic-site.com
nslookup problematic-site.com 8.8.8.8
# 2단계: 다른 DNS 서버로 테스트
ping problematic-site.com
ping $(nslookup problematic-site.com 1.1.1.1 | grep Address | tail -1 | cut -d' ' -f2)
# 3단계: 경로 추적으로 어디서 막히는지 확인
traceroute problematic-site.com
# 4단계: 특정 포트 접속 테스트
telnet problematic-site.com 80
telnet problematic-site.com 443
4. 네트워크 성능 모니터링과 최적화
실시간 네트워크 모니터링
# 1. 대역폭 사용량 모니터링
iftop # 실시간 대역폭 사용량
nethogs # 프로세스별 네트워크 사용량
nload # 간단한 대역폭 모니터링
# 2. 연결 상태 모니터링
watch -n 1 'ss -tuln | wc -l' # 연결 수 변화 추적
watch -n 1 'netstat -an | grep ESTABLISHED | wc -l'
# 3. 패킷 손실 확인
ping -c 100 google.com | tail -2
네트워크 성능 최적화
# TCP 버퍼 크기 조정
echo 'net.core.rmem_max = 16777216' | sudo tee -a /etc/sysctl.conf
echo 'net.core.wmem_max = 16777216' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 네트워크 인터페이스 큐 크기 확인
ethtool -g eth0
# MTU 크기 최적화
sudo ip link set dev eth0 mtu 9000 # Jumbo Frame (가능한 경우)
5. 고급 트러블슈팅 도구와 기법
tcpdump와 Wireshark를 활용한 패킷 분석
# 특정 포트 트래픽 캡처
sudo tcpdump -i eth0 port 80 -w web_traffic.pcap
# 특정 호스트와의 통신 캡처
sudo tcpdump -i eth0 host 192.168.1.100
# HTTP 요청/응답 내용 확인
sudo tcpdump -i eth0 -A port 80
# SSL/TLS 핸드셰이크 문제 진단
sudo tcpdump -i eth0 port 443 -v
네트워크 연결 문제 자동 진단 스크립트
#!/bin/bash
# network_diagnostic.sh
echo "=== 네트워크 진단 시작 ==="
# 기본 정보 수집
GATEWAY=$(ip route | grep default | awk '{print $3}')
INTERFACE=$(ip route | grep default | awk '{print $5}')
echo "네트워크 인터페이스: $INTERFACE"
echo "기본 게이트웨이: $GATEWAY"
# 1. 인터페이스 상태 확인
echo "1. 인터페이스 상태:"
ip link show $INTERFACE | grep -E "(state|mtu)"
# 2. IP 주소 확인
echo "2. IP 주소 설정:"
ip addr show $INTERFACE | grep inet
# 3. 게이트웨이 연결 확인
echo "3. 게이트웨이 연결 테스트:"
if ping -c 3 $GATEWAY > /dev/null 2>&1; then
echo "✅ 게이트웨이 연결 정상"
else
echo "❌ 게이트웨이 연결 실패"
fi
# 4. DNS 확인
echo "4. DNS 연결 테스트:"
if ping -c 3 8.8.8.8 > /dev/null 2>&1; then
echo "✅ DNS 서버 연결 정상"
else
echo "❌ DNS 서버 연결 실패"
fi
# 5. 외부 연결 확인
echo "5. 외부 연결 테스트:"
if ping -c 3 google.com > /dev/null 2>&1; then
echo "✅ 외부 연결 정상"
else
echo "❌ 외부 연결 실패"
fi
# 6. 서비스 포트 확인
echo "6. 주요 서비스 포트 상태:"
for port in 22 80 443 3306; do
if ss -tuln | grep ":$port " > /dev/null; then
echo "✅ 포트 $port 리스닝 중"
else
echo "ℹ️ 포트 $port 비활성"
fi
done
echo "=== 진단 완료 ==="
지속적인 모니터링 설정
# crontab에 추가할 모니터링 스크립트
*/5 * * * * /usr/local/bin/network_check.sh >> /var/log/network_monitor.log 2>&1
# network_check.sh 예시
#!/bin/bash
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
if ! ping -c 1 8.8.8.8 > /dev/null 2>&1; then
echo "$TIMESTAMP - 네트워크 연결 실패!" | logger -t network_monitor
# 알림 발송 (슬랙, 이메일 등)
curl -X POST -H 'Content-type: application/json'
--data '{"text":"🚨 서버 네트워크 연결 장애 발생!"}'
YOUR_SLACK_WEBHOOK_URL
fi
6. 자주 발생하는 문제와 즉시 해결법
DNS 캐시 문제
# DNS 캐시 플러시 (시스템별)
sudo systemctl restart systemd-resolved # Ubuntu 18.04+
sudo /etc/init.d/nscd restart # 기타 Linux
sudo systemctl restart NetworkManager # 네트워크 재시작
# 임시 DNS 서버 변경
echo "nameserver 1.1.1.1" | sudo tee /etc/resolv.conf
MTU 문제 (패킷 크기 문제)
# MTU 크기 확인
ip link show eth0 | grep mtu
# 최적 MTU 크기 찾기
ping -M do -s 1472 google.com # 1500 - 28 = 1472
# MTU 조정
sudo ip link set dev eth0 mtu 1450
ARP 테이블 문제
# ARP 테이블 확인
ip neigh show
# ARP 캐시 삭제
sudo ip neigh flush all
# 특정 항목 삭제
sudo ip neigh del 192.168.1.1 dev eth0
7. 보안을 고려한 네트워크 관리
포트 스캔 감지 및 대응
# 현재 열린 포트 확인
sudo ss -tuln
# 불필요한 서비스 중지
sudo systemctl disable telnet
sudo systemctl disable ftp
# 방화벽 강화
sudo firewall-cmd --set-default-zone=drop
sudo firewall-cmd --zone=trusted --add-source=192.168.1.0/24
sudo firewall-cmd --runtime-to-permanent
네트워크 접근 로그 모니터링
# SSH 접근 로그 확인
sudo grep "Failed password" /var/log/secure
# 실시간 접근 모니터링
sudo tail -f /var/log/secure | grep ssh
# 네트워크 연결 로깅
ss -tuln > /tmp/connections_$(date +%Y%m%d_%H%M%S).log
마치며: 네트워크 트러블슈팅 마스터가 되는 길
일일 체크리스트
- [ ] 서버별 네트워크 연결 상태 확인
- [ ] 주요 서비스 포트 리스닝 상태 확인
- [ ] DNS 응답 시간 확인
- [ ] 방화벽 로그 검토
주간 체크리스트
- [ ] 네트워크 성능 지표 분석
- [ ] 보안 이벤트 로그 검토
- [ ] 백업 네트워크 경로 테스트
- [ ] 모니터링 스크립트 업데이트
기억해야 할 황금률
- 체계적 접근: 물리 → 데이터링크 → 네트워크 → 전송 → 응용 계층 순으로
- 로그가 답: 모든 문제의 단서는 로그에 있다
- 기본부터: ping, telnet, nslookup 등 기본 도구를 완벽히 활용하자
- 예방이 최고: 모니터링과 알림 체계를 구축하자
- 문서화: 해결 과정을 기록하여 다음에 활용하자
네트워크 문제는 때로는 복잡해 보이지만, 체계적으로 접근하면 대부분 해결할 수 있습니다. 오늘 배운 내용들을 실제 환경에서 하나씩 연습해보시고, 여러분만의 트러블슈팅 노하우를 쌓아가시길 바랍니다!
기억하세요: 좋은 네트워크 관리자는 문제가 발생하기 전에 미리 대비하는 사람입니다. 🔧
답글 남기기