리눅스 ping 명령어 사용법 - 네트워크 상태 확인 옵션과 실전 예제
이 명령어를 언제 쓰는가
서비스 장애 연락을 받았을 때 가장 먼저 갈라야 할 것은 네트워크가 끊긴 것인가, 애플리케이션이 죽은 것인가이다. 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 / -6 | IPv4 / 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 으로 손실을 확인한 뒤 원인 구간을 찾을 때 쓴다.