Devin.KR
로그인

리눅스 ping 명령어 사용법 - 네트워크 상태 확인 옵션과 실전 예제

개발자 조회 1

이 명령어를 언제 쓰는가

서비스 장애 연락을 받았을 때 가장 먼저 갈라야 할 것은 네트워크가 끊긴 것인가, 애플리케이션이 죽은 것인가이다. ping은 ICMP Echo 요청을 보내 상대 호스트가 IP 계층에서 살아 있는지, 왕복 지연(RTT)과 패킷 손실이 얼마인지 알려준다.

웹 서버에서 DB 서버로 ping 을 걸어 손실률 0%, RTT 가 평소와 같다면 네트워크는 용의선상에서 빼도 된다. 반대로 손실이 몇 %씩 잡히면 애플리케이션 로그를 뒤질 시간이 아니라 스위치와 회선을 볼 시간이다. 판단을 빨리 갈라주는 것이 ping 의 진짜 값어치다.

기본 형식

ping [옵션] 대상호스트
  • 대상호스트 — 도메인 또는 IP. 도메인을 쓰면 DNS 조회가 먼저 일어나므로, 순수 네트워크 상태만 보려면 IP 를 쓴다.
  • 옵션 — 횟수, 간격, 패킷 크기 등. 옵션 없이 실행하면 Ctrl+C 로 멈출 때까지 계속 보낸다.

자주 쓰는 옵션

아래는 리눅스 기본인 iputils 판 ping 기준이다.

옵션의미예시
-c 횟수지정한 횟수만 보내고 종료한다ping -c 5 8.8.8.8
-i 초전송 간격(기본 1초). 0.2 같은 소수도 가능하다ping -i 0.2 -c 20 8.8.8.8
-W 초응답 하나를 기다리는 시간ping -W 1 -c 3 10.0.1.20
-w 초전체 실행 시간 상한(deadline)ping -w 3 10.0.1.20
-q개별 응답은 감추고 통계만 출력한다ping -q -c 100 8.8.8.8
-s 바이트보낼 데이터 크기(기본 56바이트)ping -s 1472 8.8.8.8
-M do분할 금지. MTU 확인용(리눅스 전용)ping -M do -s 1472 -c 1 8.8.8.8
-D각 줄 앞에 유닉스 타임스탬프를 붙인다ping -D 10.0.1.20
-O응답이 오지 않은 순번도 한 줄로 남긴다ping -D -O 10.0.1.20
-n역방향 DNS 조회를 생략해 출력이 빨라진다ping -n -c 3 8.8.8.8
-4 / -6IPv4 / IPv6 강제ping -4 -c 2 google.com

실전 예제

1. 손실률과 지연만 30초 안에 확인한다. 개별 줄은 필요 없고 통계만 보면 될 때 쓴다.

ping -q -c 20 -i 0.2 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

--- 8.8.8.8 ping statistics ---
20 packets transmitted, 20 received, 0% packet loss, time 3807ms
rtt min/avg/max/mdev = 32.104/33.221/35.998/0.881 ms

mdev(편차)가 평균 대비 크면 회선이 흔들리고 있다는 뜻이다. 평균만 보지 말고 이 값을 같이 본다.

2. 스크립트에서 살아 있는지 판단한다. 감시 스크립트나 배포 전 점검에 넣는 형태다. -c-W가 없으면 스크립트가 영원히 멈춘다.

if ping -c 1 -W 1 10.0.1.20 > /dev/null 2>&1; then
  echo "alive"
else
  echo "down"
fi

3. 경로의 MTU 를 찾는다. VPN 이나 터널 구간에서 접속은 되는데 큰 응답만 멈춘다는 증상이 나올 때 쓴다.

ping -M do -s 1472 -c 1 8.8.8.8

1472 + IP 헤더 20 + ICMP 헤더 8 = 1500 이다. 이게 실패하고 다음처럼 나오면 경로 MTU 가 1500 보다 작다는 뜻이므로, 크기를 줄여가며 통과하는 지점을 찾는다.

ping: local error: message too long, mtu=1400

4. 간헐적으로 튀는 지연을 기록으로 남긴다. 하루에 몇 번 끊긴다는 신고는 그 순간을 잡아야 증명이 된다.

ping -D -O 10.0.1.20 | tee -a /tmp/ping-10.0.1.20.log
[1756089600.123456] 64 bytes from 10.0.1.20: icmp_seq=1 ttl=64 time=0.312 ms
[1756089601.128012] no answer yet for icmp_seq=2
[1756089602.130455] 64 bytes from 10.0.1.20: icmp_seq=3 ttl=64 time=0.298 ms

-O는 응답이 오지 않은 순번도 한 줄로 남겨준다. 이게 없으면 빠진 구간이 로그에서 그냥 사라진다.

5. 내부망인지 외부망인지 가른다. 기본 게이트웨이까지만 먼저 때려보고, 되면 밖으로 나간다.

ping -c 3 $(ip route | awk '/^default/ {print $3}')

함정과 주의점

ping 이 안 된다고 서버가 죽은 것이 아니다. 실무에서 가장 자주 나오는 오판이다. 클라우드 보안그룹과 방화벽은 ICMP 를 기본 차단하는 경우가 많고, 그런 서버는 웹이 멀쩡히 서비스되고 있어도 ping 에 답하지 않는다. 반대도 성립한다. ping 은 IP 계층까지만 확인하므로 포트가 열려 있는지, 애플리케이션이 응답하는지는 전혀 알려주지 않는다. 서비스 확인은 curl이나 ss로 해야 한다.

-c 없는 ping 을 스크립트나 cron 에 넣지 않는다. 터미널에서야 Ctrl+C 로 끝내지만, 배치에 들어가면 프로세스가 남아 쌓인다. 몇 달 뒤 ping 프로세스가 수백 개 떠 있는 서버를 발견하게 된다.

macOS/BSD 는 옵션 의미가 다르다. macOS 의 -W는 초가 아니라 밀리초이고, -D는 타임스탬프가 아니라 분할 금지(DF 비트) 옵션이다. -M do는 없다. 맥에서 짜서 리눅스 서버에 올린 스크립트가 조용히 다르게 동작하는 원인이 여기다.

사내 정책상 대량 ping 은 스캔으로 잡힌다. -i 0.01 같은 짧은 간격으로 다수 호스트를 돌리면 IDS 경보가 뜬다. 간격을 줄일 때는 대상 하나로 한정한다.

함께 보면 좋은 명령어

  • curl — 포트와 애플리케이션까지 실제로 응답하는지 확인한다. ping 다음 단계다.
  • ss — 대상 포트가 LISTEN 상태인지, 연결이 맺혔는지 서버 쪽에서 본다.
  • mtr — 어느 홉에서 손실이 생기는지 경로별로 보여준다. ping 으로 손실을 확인한 뒤 원인 구간을 찾을 때 쓴다.