[태그:] 트러블슈팅

  • 네트워크 관리와 트러블슈팅 실전 노하우: 현장에서 바로 써먹는 문제 해결법

    안녕하세요, 성장하는 개발자 여러분!

    서버가 갑자기 응답하지 않을 때, 배포한 애플리케이션에 접속이 안 될 때, 데이터베이스 연결이 끊어질 때… 이런 상황에서 여러분은 어떻게 하시나요? 당황해서 “인터넷이 안 돼요!”라고 외치기보다는, 체계적으로 문제를 진단하고 해결할 수 있는 능력이 필요합니다.

    오늘은 제가 실무에서 수없이 겪었던 네트워크 문제들과 그 해결 과정을 통해 얻은 실전 트러블슈팅 노하우를 공유해 드리겠습니다. 이론보다는 “지금 당장 문제를 해결해야 하는” 상황에 초점을 맞춰 설명하겠습니다!

    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 응답 시간 확인
    • [ ] 방화벽 로그 검토

    주간 체크리스트

    • [ ] 네트워크 성능 지표 분석
    • [ ] 보안 이벤트 로그 검토
    • [ ] 백업 네트워크 경로 테스트
    • [ ] 모니터링 스크립트 업데이트

    기억해야 할 황금률

    1. 체계적 접근: 물리 → 데이터링크 → 네트워크 → 전송 → 응용 계층 순으로
    2. 로그가 답: 모든 문제의 단서는 로그에 있다
    3. 기본부터: ping, telnet, nslookup 등 기본 도구를 완벽히 활용하자
    4. 예방이 최고: 모니터링과 알림 체계를 구축하자
    5. 문서화: 해결 과정을 기록하여 다음에 활용하자

    네트워크 문제는 때로는 복잡해 보이지만, 체계적으로 접근하면 대부분 해결할 수 있습니다. 오늘 배운 내용들을 실제 환경에서 하나씩 연습해보시고, 여러분만의 트러블슈팅 노하우를 쌓아가시길 바랍니다!

    기억하세요: 좋은 네트워크 관리자는 문제가 발생하기 전에 미리 대비하는 사람입니다. 🔧