<목차> ping 개요 ping at Work
ping 개요
Ping은 네트워크로 연결된 두 호스트 사이에서 연결할 수 있는지 점검하는 진단도구이다. 우리가 Ping명령을 실행하면 ICMP Echo Request 패킷을 원격 IP 주소에 송신하고 ICMP 응답을 기다린다. 요즘 우리가 사용하는 ping 프로그램의 첫 버전을 만든 이는 Mike Muss이다. 그 후로 다른 많은 이들이 성능을 향상시키고, 고쳐 작성하고, 다양한 곳에 함부로 사용해왔다.
ping이라는 이름이 무엇을 뜻하는지에 대해서는 많은 의견들이 있다. 어떤 사람들은 Packet INternet Groper 라는 구문의 머릿글자를 따온 것이라 말한다. 그럴 듯 해 보이기는 하지만 맞는 말은 아니다. 사실 Ping은 소나(sonar: 수중 음파 탐지기) 추적 시스템의 소리를 흉내 내어 붙여진 이름이다.
심지어 어떤 시스템 관리자가 네트워크상의 호스트에 되풀이해서 핑을 날리고 성공할 때마다 “핑” 하는 소리가 나도록 설정한 스크립트를 만들었다는 이야기까지 있다. 그 시스템 관리자는 네트워크를 괴롭혀 온 불안정한 커넥터를 찾을 때까지 규칙적으로 그의 네트워크에 설치된 BNC 커넥터들을 점검한다 -- 소리가 멈추었을 때, 그 나쁜 놈이 걸렸다는 것을 알아냈다는 것이다.
Ping은 일반적으로 어떤 머신이 데이터를 수신하고 IP 패킷을 보낼 수 있는지 점검하는 매우 유용한 도구이다. 여러분이 호스트에 핑을 보낼 수 있다면 ftp나 http 연결도 할 수 있을 것이다. 하지만, 보안을 위해 패킷 필터링을(packet filtering) 적용하는 호스트들이 많아지면서 인터넷에서 ping은 신뢰성을 잃어간다.
많은 방화벽들이 아래에 소개한 두 가지 이유로 ICMP 패킷을 걸러내도록 규정한다.
1) 여러분의 내부 네트워크가 어떻게 생겼는지 다른 사람들이 알 필요는 없다. 2) 그리고, 모든 프로토콜이 시스템을 공격하는데 이용될 수 있다. ICMP라 해서 예외는 아니다.
여러분의 방화벽에 ICMP를 허용하도록 결정했다면 고생길을 자청한 것이다. 이 경우 ICMP가 항상 좋은 의도로 사용된다고 가정해야 하지만, 어떻게 ICMP 기반 공격들이 없을 수 있겠는가. (예를 들어 “죽음의 핑”은 버퍼 크기를 초과하는 핑 패킷으로 공격대상의 IP 스택을 넘치게 한다 -- 때에 따라 매우 극적인 결과를 맞기도 한다). 여러분의 네트워크에서 ICMP를 허용한다면 그 틈을 타고 누군가 공격할 것은 뻔하다.
다른 목적으로 쓰기 위해 ping 명령에 특별한 기능을 추가한 도구들이 있다. 가장 일반적인 것 하나는 fping 명령이다. 이 명령은 일정한 주소 범위에 ping을 보내기 위한 명령인데 일반적으로 네트워크 스캐너로 쓰이고, 또 saint와 mon처럼 네트워크 모니터로도 쓰인다. 또 다른 변종은 외부 프로그램을 소환하지 않고 스크립트 안에서 쉽게 사용할 수 있도록 Ping 기능을 perl로 구현한 Net::Ping 모듈이다. 아래 예문에서처럼 스크립트를 사용할 수 있다:
Example 1. Using Net::Perl
#!/usr/bin/perl -w
use strict; use Net::Ping;
my $host = $ARGV[0];
my $p = Net::Ping->new(“icmp”);
if ($p->ping($host)) { print “$host is alive.\n”; } else { print “$host is not reachable.\n”; } |
ping at Work
Ping은 인수를 덧붙이지 않고 사용하는 것이 일반적인데 프로그램 실행을 마칠 때에는 Ctrl-c 키를 누른다. 아마 아래 예문처럼 보일 것이다:
[pate@cherry pate]$ ping mango PING mango (192.168.1.1) from 192.168.1.10 : 56(84) bytes of data. 64 bytes from mango (192.168.1.1): icmp_seq=0 ttl=255 time=0.5 ms 64 bytes from mango (192.168.1.1): icmp_seq=1 ttl=255 time=0.3 ms 64 bytes from mango (192.168.1.1): icmp_seq=2 ttl=255 time=0.3 ms 64 bytes from mango (192.168.1.1): icmp_seq=3 ttl=255 time=0.3 ms 64 bytes from mango (192.168.1.1): icmp_seq=4 ttl=255 time=0.3 ms 64 bytes from mango (192.168.1.1): icmp_seq=5 ttl=255 time=0.3 ms --- mango ping statistics --- 6 packets transmitted, 6 packets received, 0% packet loss round-trip min/avg/max = 0.3/0.3/0.5 ms [pate@cherry pate]$ |
이 화면은 세 개의 섹션으로 나눌 수 있다. 첫 번째 섹션은, “PING”이라는 글자로 시작하는 한 줄인데 여러분의 명령에 대한 결과를 미리 보여준다. “64 bytes”라는 문자열로 시작하는 두 번 째 섹션은 응답시간을 계산해서 보여준다. 세 번 째, “--- mango ping statistics ---”이라는 줄로 시작하는 마지막 섹션에서는 결과를 요약해서 보여준다. 위 예문에서 결과가 꽤 좋은데 잃어버린 패킷도 없고 응답시간도 빠른 편이어서 결과가 좋은 모습이다.
여러분의 네트워크를 점검하는데 싱글 패킷에 의존할 필요는 없다. 싱글 패킷보다는 다섯이나 열로 짝지어진 패킷이 훨씬 좋다. 네트워크가 혼잡한 곳에서 특히 싱글 패킷보다 더 유용한 정보를 얻을 수 있다.
ping 명령에는 몇 가지 유용한 옵션들이 있다. 이 옵션들을 아래 표에 정리했다:
< 표 1. Ping 명령의 옵션들 >
스위치 |
기능 |
-c count |
지정한 숫자만큼 패킷을 주고 받으면 프로그램을 멈춘다. |
-d |
소켓에 사용되는 SO_DEBUG 기능을 켠다. |
-f |
할 수 있는 한 가장 빠른 속도로 패킷을 보낸다. (flood) |
-i wait |
패킷 사이에서 대기시간에 간격을 둔다. |
-I [device] |
출력 인터페이스를 지정한다. |
-l preload |
미리 로드한 패킷을 가능한 빨리 전송한 다음 일반 모드로 돌아간다. |
-n |
호스트 이름을 찾지 않고 IP 주소만 보인다. (numeric) |
-p pattern |
pattern은 16진수이며 pad data를 지정한다. |
-q |
요약한 줄만 출력한다. (quiet) |
-r |
패킷을 보낼 때에 라우팅 테이블을 사용하지 않고, 로컬 인터페이스에만 보낸다. |
-R |
라우트를 기록하는 옵션을 설정한다. |
-s packetsize |
보낼 패킷의 데이터 바이트 크기를 설정한다. |
-T tsonly |
timestamp 옵션과 함께 ping을 보낸다. |
-T tsandaddr |
timestapm와 주소를 모은다. |
-T tsprespec[host1 [host2 [host3 [host4]]]] 열거한 홉들에서 timestamp와 주소를 모은다. |
이런 옵션들은 몇 개를 조합해서 더 유용하게 쓸 수 있다. 이전 섹션에서 사용한 ping 명령이 실행하고 결과를 돌려주는데 몇 초 시간지연이 있다. -f 스위치를 사용하면 명령을 기다리느라 버리는 시간을 줄일 수 있다. -c 10 옵션과 -q 옵션을 조합하면 좀더 빠르고 더 읽기 쉽게 결과를 출력한다.
[root@cherry /root]# ping -c 10 -fq mango PING mango (192.168.1.1) from 192.168.1.10 : 56(84) bytes of data.
--- mango ping statistics --- 10 packets transmitted, 10 packets received, 0% packet loss round-trip min/avg/max = 0.2/0.2/0.9 ms [root@cherry /root]# |
주의: -f와 -l 스위치는 root만 사용할 수 있다. 이 스위치들을 잘못 사용하면 네트워크에 심각한 혼란이 생길 수 있기 때문이다.
더 큰 패킷들을 사용할 경우 테스트하는 데 좀더 유리하다면, ping -c10 -s 1024 -qf 명령으로 더 큰 패킷들을 보낸다. 이 명령은 네트워크에서 발생한 문제가 패킷들이 잘게 쪼개지는 현상 때문에 발생한다고 생각할 때 특히 유용하다.
여러분의 패킷이 라우터를 통과하는지 알아보고 싶다면, ping -c10 -R 명령을 사용한다. 이 명령은 아래와 같은 메시지를 보여줄 것이다:
PING tbr.nailed.org (206.66.240.72) from 192.168.1.10 : 56(124) bytes of data. 64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=0 ttl=239 time=217.2 ms RR: 192.168.1.10 216.41.39.90 serial0.mmgw32.bos1.Level3.net (209.244.39.25) 208.218.130.22 166.90.184.2 so-6-0-0.mp2.NewYork1.level3.net (209.247.10.45) 137.39.52.10 180.ATM7-0.BR2.NYC9.ALTER.NET (152.63.22.229) lo0.XR2.NYC9.ALTER.NET (137.39.4.175)
64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=1 ttl=239 time=1940.8 ms (same route) 64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=2 ttl=239 time=250.6 ms (same route) 64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=3 ttl=239 time=230.3 ms (same route) 64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=4 ttl=239 time=289.8 ms (same route) 64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=5 ttl=239 time=1261.4 ms (same route) 64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=6 ttl=239 time=469.4 ms (same route) 64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=7 ttl=239 time=1272.3 ms (same route) 64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=8 ttl=239 time=353.1 ms (same route) 64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=9 ttl=239 time=1281.1 ms (same route)
--- tbr.nailed.org ping statistics --- 10 packets transmitted, 10 packets received, 0% packet loss round-trip min/avg/max = 217.2/756.6/1940.8 ms |
주의: -R 스위치로 설정하는 라우트 기록 옵션은 모든 라우터와 호스트에서 환대받는 것은 아니다. 패킷들이 네트워크를 다니는 경로를 확인하는 데 traceroute가 훨씬 좋은 도구일 것이다.
ping 명령은 여러분 네트워크의 문제해결에 매우 유용한 도구이고, 대충 아무렇게나 사용해서는 안된다.
이 기사는 Pat Eyler와 New Riders Press가 저작권을 소유한다. 원문을 수정하거나 보태어서는 안되며, 열린 출판물 라이선스(Open Publication License)에 따라 배포된다. 이 글은 “A Practical Guide to TCP/IP”라는 이름으로 New Riders 출판에서 겨울에 출간할 리눅스 네트워킹 책에 포함될 섹션의 초고이다:
-------------------------------------------------------------------
재미 있는 이야기: 하드디스크에 계시는 우리 운영체제시여 로긴을 거룩하게 하옵시고 메모리에 임하옵시며, 명령이 키보드에서 이루어진 것과 같이 모니터에서도 이루어지게 하옵소서. 오늘날 우리에게 일용할 데이터를 주시옵고 우리가 프로그램의 오류를 용서한 것과 같이 우리의 오타를 사하여 주옵시고, 우리를 바이러스에 들게 하지 마옵시고, 다만 불시의 정전에서 구하옵소서! 엔터~~~ |