infra
Platform

모듈 맵

[Network] ping과 ICMP 프로토콜을 이용한 초동 경로 진단

0 / 35 완료

펼치기
0 / 35 완료0%

Networking · 11 / 35

[Network] ping과 ICMP 프로토콜을 이용한 초동 경로 진단

ICMP 원리를 이해하고 ping으로 RTT와 Packet Loss를 분석합니다

🚨INCIDENT ALERT
HIGH

서버가 죽었다는 신고가 들어왔지만 HTTP만 실패하는지 네트워크 자체가 끊긴 건지 아직 모릅니다. 가장 먼저 ICMP로 왕복 가능성과 지연, 손실을 확인해야 합니다.

ping은 만능 진단 도구는 아니지만 첫 번째 분기점입니다. 성공과 실패가 의미하는 범위를 정확히 알아야 합니다.

ping과 ICMP — 네트워크 생사 확인

네트워크 문제가 발생했을 때 가장 먼저 실행하는 명령어는 ping입니다. 단 한 줄로 "저쪽 서버가 살아 있나?" 를 확인할 수 있기 때문입니다. 하지만 ping이 실패했다고 해서 서버가 죽은 것이 아닐 수 있고, ping이 성공했다고 해서 서비스가 정상인 것도 아닙니다. 이 챕터에서는 ICMP 프로토콜의 원리를 이해하고, ping 결과를 정확하게 해석하는 방법을 배웁니다.


ICMP 프로토콜 원리

이번 챕터에서 배울 것
  • 1ICMP 프로토콜의 역할과 OSI 3계층(네트워크 계층) 위치
  • 2Echo Request(Type 8)와 Echo Reply(Type 0)의 ping 동작 원리
  • 3RTT(왕복 지연 시간) 수치 해석 및 기준치
  • 4Packet Loss와 mdev(지터) 분석 방법
  • 5ping 한계 — ICMP 차단 케이스와 L4/L7 확인 도구
  • 6클라우드 환경에서 ICMP 방화벽 정책 처리
실습 환경 준비
기본 ping 테스트 (4회)
ping -c 4 8.8.8.8
도메인 이름으로 ping (DNS 확인 포함)
ping -c 4 google.com
패킷 크기 지정 ping (MTU 테스트)
ping -c 4 -s 1400 8.8.8.8

클라우드 환경(AWS 등)은 보안 그룹에서 ICMP를 명시적으로 허용해야 ping 응답이 가능

💡개념

ICMP란 무엇인가 — L3 진단 메시지 프로토콜

ping google.com이 안 됩니다. 그런데 curl https://google.com은 됩니다. AWS에서는 ping이 아무 응답도 없습니다. 네트워크가 문제인지, 보안 그룹이 문제인지, 프로토콜이 막힌 건지 알 수 없습니다. ICMP가 어떤 프로토콜이고 TCP/UDP와 어떻게 다른지 알아야 이런 상황에서 "ping 실패 = 네트워크 단절"이 아니라는 판단을 할 수 있습니다.

ICMP란 무엇인가 — L3 진단 메시지 프로토콜

**ICMP(Internet Control Message Protocol)**는 IP 네트워크에서 오류 보고와 진단 정보를 전달하기 위한 프로토콜입니다. TCP나 UDP처럼 애플리케이션 데이터를 운반하는 것이 아니라, 네트워크 계층의 상태를 알리는 제어 메시지를 전달합니다.

OSI 모델에서 ICMP의 위치

┌─────────────────────────────────────┐
│   7계층 (응용)     HTTP, FTP, DNS   │
│   6계층 (표현)     TLS, MIME        │
│   5계층 (세션)     세션 관리        │
│   4계층 (전송)     TCP, UDP         │
├─────────────────────────────────────┤
│   3계층 (네트워크) IP, ICMP  ◀ 여기 │
│   2계층 (데이터링크) Ethernet, ARP  │
│   1계층 (물리)     전기 신호        │
└─────────────────────────────────────┘

ICMP는 IP와 동일한 3계층에서 동작하며, IP 패킷 안에 캡슐화되어 전송됩니다. IP 헤더의 프로토콜 번호는 1입니다.

ICMP 주요 메시지 타입

타입 번호이름용도
0Echo Replyping 응답
3Destination Unreachable목적지 도달 불가
8Echo Requestping 요청
11Time ExceededTTL 초과 (traceroute에서 활용)

Echo Request / Echo Reply 흐름

내 컴퓨터 (192.168.1.10)          구글 DNS (8.8.8.8)
        │                                  │
        │── ICMP Type 8 (Echo Request) ──▶ │
        │   Sequence: 1, TTL: 64           │
        │                                  │
        │ ◀── ICMP Type 0 (Echo Reply) ─── │
        │   Sequence: 1, TTL: 118          │
        │                                  │
        │── ICMP Type 8 (Echo Request) ──▶ │
        │   Sequence: 2                    │
        │ ◀── ICMP Type 0 (Echo Reply) ─── │
        │   Sequence: 2                    │

ping을 실행하면 내 컴퓨터는 **Echo Request(Type 8)**를 보내고, 상대방은 **Echo Reply(Type 0)**로 응답합니다. 이 한 쌍의 교환에서 RTT(Round-Trip Time)를 측정합니다.

💡개념

RTT와 Packet Loss — ping 결과 수치 해석

ping google.com을 쳤더니 응답이 오긴 하는데 가끔 느립니다. 평균 RTT가 200ms인데 이게 정상인지 이상한지 모르겠습니다. Packet Loss 5%가 나왔는데 심각한 건지 일시적인 건지도 판단이 안 됩니다. ping 수치를 해석할 줄 알아야 "네트워크 느리다"는 막연한 증상을 구체적인 문제로 좁힐 수 있습니다.

RTT와 Packet Loss — ping 결과 수치 해석

RTT (Round-Trip Time)

RTT는 패킷이 출발지에서 목적지까지 갔다가 돌아오는 데 걸린 시간입니다. 단위는 **밀리초(ms)**입니다.

ping -c 4 8.8.8.8

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=118 time=31.4 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=118 time=30.8 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=118 time=32.1 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=118 time=31.0 ms

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 30.8/31.3/32.1/0.5 ms

각 항목의 의미:

항목의미
icmp_seq1, 2, 3, 4순서 번호 (빠지면 유실)
ttl118남은 홉 수 (64 또는 128로 시작)
time31.4 ms이 패킷의 RTT
rtt min/avg/max/mdev30.8/31.3/32.1/0.5최소/평균/최대/표준편차

RTT 기준치 해석

< 1ms    : 같은 L2 네트워크 (스위치 내부)
1~5ms    : 같은 데이터센터 내
10~30ms  : 국내 인터넷 (서울 ↔ 부산)
100ms~   : 해외 인터넷 (한국 ↔ 미국)
500ms~   : 심각한 지연, 사용자 체감 불편

Packet Loss

패킷 손실률은 전체 전송 패킷 대비 응답이 없는 패킷의 비율입니다.

4 packets transmitted, 3 received, 25% packet loss
  • 0%: 정상
  • 1~5%: 경미한 네트워크 불안정 (무선 환경에서 간헐적으로 발생)
  • 5% 이상: 의미 있는 네트워크 품질 문제
  • 100%: ICMP 차단 또는 목적지 완전 단절

mdev (평균 편차)가 중요한 이유

mdev가 크면 RTT가 불규칙하게 변동한다는 의미입니다. 평균 RTT가 낮아도 mdev가 크면 **네트워크 지터(jitter)**가 심한 것으로, 실시간 통신(VoIP, 게임) 품질에 문제를 일으킬 수 있습니다.


실습 — ping 분석

기본 ping 실행 및 결과 해석

가장 기본적인 ping 명령어로 외부 DNS 서버에 연결을 테스트합니다.

로컬 터미널
# 실습 디렉토리 준비
mkdir -p /tmp/networking/part3/exam_11 && cd /tmp/networking/part3/exam_11

# -c 4: 4개 패킷만 보내고 종료 (무한 루프 방지)
ping -c 4 8.8.8.8
🔍실행 후 확인할 것
  • packet loss손실률이 0%인지, 간헐 손실이 있는지 확인합니다
  • rttmin/avg/max 값으로 지연과 변동 폭을 봅니다
  • DNS 분리IP ping과 도메인 ping 결과를 비교해 DNS 문제를 구분합니다

예상 출력: 정상 응답 시 이런 형태로 출력됩니다.

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=118 time=31.2 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=118 time=30.9 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=118 time=31.5 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=118 time=31.1 ms

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 30.9/31.1/31.5/0.2 ms

결과 체크리스트:

  • 0% packet loss 확인
  • time 값이 예상 범위인지 확인
  • icmp_seq 번호에 빈 칸이 없는지 확인 (순서 유실)

추가 옵션 실습: -c, -i, -s 옵션으로 ping 동작을 제어합니다.

로컬 터미널
# -i 0.2: 0.2초 간격으로 전송 (기본 1초)
ping -c 10 -i 0.2 8.8.8.8

# -s 1400: 패킷 크기 1400바이트 (MTU 테스트용)
ping -c 4 -s 1400 8.8.8.8

# -W 1: 응답 대기 시간 1초로 제한
ping -c 4 -W 1 192.168.1.1
도메인 이름으로 ping — DNS 해석 포함

IP 주소 대신 도메인 이름으로 ping을 실행하면 DNS 해석이 선행됩니다.

로컬 터미널
ping -c 4 google.com

예상 출력:

PING google.com (142.250.196.110) 56(84) bytes of data.
64 bytes from kix07s05-in-f14.1e100.net (142.250.196.110): icmp_seq=1 ttl=118 time=32.1 ms
...

중요 관찰 포인트: TTL과 응답 시간(ms)으로 네트워크 상태를 판단합니다.

ping google.com      → 성공 (DNS + ICMP 모두 정상)
ping 8.8.8.8         → 성공 / ping google.com 실패 → DNS 문제
ping 8.8.8.8         → 실패                         → L3 네트워크 문제

진단 흐름 정리: ping 결과 유형별로 다음 조치가 달라집니다.

IP ping 실패?
    YES → 라우팅/물리 연결 문제 (L1~L3 확인)
    NO  → 도메인 ping 실패?
              YES → DNS 설정 문제 (/etc/resolv.conf 확인)
              NO  → 서비스 포트 문제 가능성 (telnet/curl로 L4 확인)
ping으로 할 수 없는 것 — L4/L7 확인 방법

ping이 성공해도 서비스가 동작하지 않을 수 있습니다. 각 계층별 확인 도구를 사용해야 합니다.

로컬 터미널
# ping: L3 도달 가능성 확인
ping -c 2 192.168.1.100
# → 성공해도 HTTP 서비스가 죽어있을 수 있음

# telnet: TCP 포트 열려있는지 확인 (L4)
telnet 192.168.1.100 80
# → "Connected" 나오면 80 포트 열려있음
# → "Connection refused" 나오면 포트 닫힘

# curl: HTTP 응답 확인 (L7)
curl -v http://192.168.1.100/
# → HTTP 상태 코드 확인 (200, 404, 500 등)

# nc (netcat): 포트 스캔
nc -zv 192.168.1.100 80 443

계층별 진단 도구 정리: 문제 계층에 맞는 도구를 선택하면 진단 속도가 빨라집니다.

L3 (네트워크): ping, traceroute, mtr
L4 (전송):     telnet, nc, nmap
L7 (응용):     curl, wget, httpie

트러블슈팅

증상

웹 브라우저로 서버에 접속되고 SSH도 되는데, ping만 응답이 없습니다.

로컬 터미널
ping -c 4 my-server.example.com
# PING my-server.example.com (203.0.113.10): 56 data bytes
# Request timeout for icmp_seq 0
# Request timeout for icmp_seq 1
# Request timeout for icmp_seq 2
# Request timeout for icmp_seq 3
# --- my-server.example.com ping statistics ---
# 4 packets transmitted, 0 packets received, 100.0% packet loss

하지만 서비스는 살아있습니다:

로컬 또는 서버
curl -I http://my-server.example.com
# HTTP/1.1 200 OK
# ...

원인

ICMP 패킷이 방화벽이나 보안 정책에 의해 차단되고 있습니다.

클라우드 환경 (AWS 예시): AWS Security Group에서 ICMP를 명시적으로 허용해야 합니다.

AWS 보안 그룹 인바운드 규칙 확인:
- HTTP (80): 0.0.0.0/0 허용 ← 웹은 됨
- SSH (22): 내 IP 허용       ← SSH는 됨
- ICMP: (규칙 없음)          ← ping 안 됨!

리눅스 OS 방화벽 (iptables/firewalld): 호스트 자체 방화벽이 ICMP를 차단하는 경우입니다.

로컬 터미널
# 현재 iptables 규칙 확인
sudo iptables -L -n | grep icmp

# firewalld 확인
sudo firewall-cmd --list-all | grep icmp

해결책

AWS 보안 그룹에서 ICMP 허용: 보안 그룹 인바운드 규칙에 다음을 추가합니다:

  • 유형: All ICMP - IPv4
  • 소스: 0.0.0.0/0 (또는 특정 IP)

리눅스 iptables에서 ICMP 허용: 인바운드 ICMP echo-request를 허용하는 규칙입니다.

위험 명령어

이 명령은 방화벽 정책을 변경해 현재 접속 중인 세션이나 운영 트래픽에 즉시 영향을 줄 수 있습니다. 적용 전 허용 대상 IP·포트와 롤백 명령을 확인하세요.

로컬 터미널
# ICMP Echo Request 허용
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

firewalld에서 ICMP 허용: firewalld를 사용하는 RHEL 계열 설정 방법입니다.

위험 명령어

이 명령은 방화벽 정책을 변경해 현재 접속 중인 세션이나 운영 트래픽에 즉시 영향을 줄 수 있습니다. 적용 전 허용 대상 IP·포트와 롤백 명령을 확인하세요.

로컬 터미널
sudo firewall-cmd --add-icmp-block-inversion --permanent
sudo firewall-cmd --reload
# 또는 특정 존에만 허용
sudo firewall-cmd --zone=public --remove-icmp-block=echo-request --permanent

중요 원칙

ping 실패 ≠ 서버 다운
ping 성공 ≠ 서비스 정상

ping은 ICMP(L3) 도달 가능성만 확인합니다.
서비스 가용성은 해당 프로토콜(L4~L7)로 직접 확인해야 합니다.

증상

대부분의 ping은 성공하지만 간헐적으로 유실됩니다.

로컬 터미널
ping -c 20 192.168.1.1
# ...
# 20 packets transmitted, 17 received, 15% packet loss
# rtt min/avg/max/mdev = 0.5/2.3/45.2/9.8 ms

mdev가 9.8ms로 크고 최대 RTT가 45.2ms로 튀었습니다.

원인 분석

로컬 터미널
# 더 긴 시간 동안 모니터링
ping -c 100 -i 0.5 192.168.1.1

# mtr로 각 홉별 패킷 손실 위치 특정
mtr --report --report-cycles 20 8.8.8.8

mtr 출력 예시: 각 홉의 패킷 손실률과 지연 시간을 한 번에 볼 수 있습니다.

HOST: myserver              Loss%   Snt   Last   Avg  Best  Wrst StDev
  1. 192.168.1.1             0.0%    20    0.6   0.7   0.5   1.1   0.2
  2. 10.0.0.1               0.0%    20    5.2   5.1   4.8   5.9   0.3
  3. 203.0.113.1            15.0%   20    8.3  12.4   7.1  45.2   9.8  ← 여기서 손실!
  4. 8.8.8.8                 0.0%    20   31.2  31.1  30.8  31.6   0.2

3번 홉에서 15% 손실이 발생하고 있습니다. 이 구간의 라우터나 링크에 문제가 있습니다.

해결 방향

  • ISP 구간 문제: 인터넷 서비스 제공업체에 장애 신고
  • 스위치/라우터 문제: 해당 장비의 인터페이스 에러 카운터 확인
  • 무선 환경: 채널 간섭, 신호 약화 확인 (iwconfig, iwlist)

실무 맥락

💼
실무 맥락
현업 패턴

장애 대응 시 첫 번째 확인

서버 모니터링 알람이 울렸을 때 인프라 엔지니어의 첫 번째 행동은 ping입니다.

로컬 터미널
# 1단계: 네트워크 도달 가능성 확인
ping -c 4 prod-web-01.internal
# → 실패하면 네트워크/전원 문제
# → 성공하면 서비스 레이어 문제

# 2단계: 서비스 포트 확인
curl -s -o /dev/null -w "%{http_code}" http://prod-web-01.internal/health
# → 200이면 서비스 정상
# → 타임아웃이면 애플리케이션 문제

# 3단계: 여러 서버 동시 확인 (배시 루프)
for host in web-01 web-02 web-03; do
    ping -c 1 -W 1 ${host}.internal > /dev/null 2>&1 \
        && echo "${host}: UP" \
        || echo "${host}: DOWN"
done

SLA 모니터링에서의 RTT

클라우드 서비스에서는 리전 간 레이턴시가 SLA에 영향을 줍니다.

로컬 터미널
# 서울 → 도쿄 리전 레이턴시
ping -c 10 ap-northeast-1.aws.example.com
# 약 30~35ms가 정상

# 서울 → 버지니아 리전 레이턴시
ping -c 10 us-east-1.aws.example.com
# 약 180~200ms가 정상

모니터링 시스템에서의 ICMP 활용

Prometheus + Blackbox Exporter를 사용하면 ping을 지속적으로 모니터링하고 알람을 설정할 수 있습니다.

YAML
# blackbox.yml 예시
modules:
  icmp_check:
    prober: icmp
    timeout: 5s
    icmp:
      preferred_ip_protocol: ip4

현업에서 알아두면 좋은 것들

  1. 클라우드 환경에서 ICMP는 기본 차단: AWS, GCP, Azure 모두 보안 그룹에서 명시적으로 허용해야 ping이 됩니다.
  2. ping 성공 = 서비스 가용성이 아님: 장애 원인 파악은 L4~L7까지 계층별로 내려가야 합니다.
  3. 대용량 트래픽 경고: 프로덕션 서버에 ping -f(flood ping)는 절대 사용하지 마세요. 네트워크 부하를 유발합니다.
  4. 방화벽 정책 문서화: ICMP 허용/차단 정책을 팀 Wiki에 명확히 기록해두면 장애 시 빠른 판단이 가능합니다.

정리

이 챕터에서 배운 핵심 내용입니다.

ICMP (L3 프로토콜)
├── Echo Request (Type 8): ping 보내기
├── Echo Reply (Type 0): ping 응답
└── 기타: Destination Unreachable, Time Exceeded

ping 결과 해석
├── RTT: 왕복 지연 시간 (낮을수록 좋음)
├── Packet Loss: 유실률 (0%가 정상)
└── mdev: 지터 (낮을수록 안정적)

ping 한계
├── ICMP 차단 = ping 실패 ≠ 서버 다운
└── ping 성공 ≠ L4/L7 서비스 정상

계층별 진단 도구
├── L3: ping, traceroute, mtr
├── L4: telnet, nc, nmap
└── L7: curl, wget

다음 챕터에서는 traceroute를 사용하여 패킷이 목적지까지 어떤 경로를 거치는지 추적하는 방법을 배웁니다.

지식 확인

퀴즈 — 5문제

Q1

웹 서버(port 443)에 접속이 안 된다는 장애 신고가 들어왔습니다. `ping <서버IP>`는 정상 응답합니다. 이 결과로 확인된 것과 아직 확인되지 않은 것은 무엇입니까?

Q2

ping 명령어를 실행했을 때 'Request timeout'이 발생했습니다. 이 결과만으로 확실하게 알 수 있는 사실은 무엇입니까?

Q3

`ping -c 4 8.8.8.8` 결과에서 '4 packets transmitted, 3 received, 25% packet loss'가 표시되었습니다. 이 상황을 올바르게 해석한 것은?

Q4

클라우드 AWS EC2 인스턴스에서 웹 서비스가 정상 동작 중인데도 ping이 응답하지 않습니다. 가장 먼저 확인해야 할 것은?

Q5

ping으로 확인할 수 없는 것은 무엇입니까?

0 / 5 답변

🧪 실습으로 확인하기

포트는 열렸다는데 왜 안 되지? — ss/netstat/telnet으로 TCP 진단

초급

"포트 8080 열었는데요?"와 "왜 안 돼요?" 사이의 간극을 메우는 실습. ss로 바인딩 상태를 확인하고, telnet/nc으로 원격 연결을 테스트하고, iptables 방화벽을 진단하고, 바인딩 주소(0.0.0.0 vs 127.0.0.1)까지 수정하는 4단계 TCP 포트 진단 플로우를 완성한다.

35📋 4단계💻 직접 환경
실습 시작하기 →

이것도 배워보세요

networking입문 · 30
[Network] ss/lsof로 포트를 점유한 좀비 프로세스 찾아 강제 종료하기
Networking 트랙 계속
docker입문 · 30
[Docker] 백엔드 개발자에게 Docker와 컨테이너 가상화가 필수인 이유
Docker 트랙 시작점