documentation 여기서 설명하는 것 이상으로 유용한 command 및 nmon에서 출력하는 정보에 대한 내용이 써져 있으니 궁금하면 찾아보자.
현재 host에서 특정 목적지(서버, 웹사이트, 타 컴퓨터)까지 network packet이 어떻게 이동하는지 파악할 때 사용되는 command다. 지나간 경로의 ip주소랑 domain name이 출력물로 나오며, 경로 상의 각 위치까지 도달하는데 시간이 얼마나 걸렸는지도 출력된다.
이를 통해 특정 목적지까지 도달하는데 오래 걸리는 이유를 파악할 수 있다.
또 지역망 분석에도 유용하다.
별도의 설치가 필요하다. Ubuntu의 경우 밑의 command를 사용하자.
$ sudo apt install traceroute -y
IP protocol의 time to live (TTL) 성분을 활용하는 것이다. 작은 TTL을 가진 탐색용 패킷을 목적지에 전달해, 거기까지 도달하는동안 지나가는 gateway에서 ICMP TIME_EXCEEDED message를 유도하는 것이다.
처음에는 TTL을 1로 설정하고, 목적지에 도달할 때까지 (ICMP port unreachable 또는 TCP reset), 혹은 최대치 TTL에 도달할 때까지 (설정하지 않으면 30 hop) 1씩 늘리면서 packet을 보낸다.
각 TTL마다 3개의 packet을 보낸다. 그리고 출력물은 1, 2, 3... 형식으로 나오는데 이게 바로 보낼때 설정한 TTL이며, 그 옆에 도달한 gateway의 주소와 각 packet의 round trip time이 나온다. routing 방식에 따라 각 packet이 도달한 gateway 주소가 다를 수 있다는 점에 유의 바람. Option에 따라 추가적인 정보를 출력할 수도 있다.
출력에 *
이 나오는 경우가 있는데, 5초 안에 응답이 없는 경우다. 이런 경우는 보통
위의 내용까지는 운영체제에 상관 없는 공통 사항이다...만 운영체제에 따라서 traceroute
가 기본적으로 '어떤' trasnport layer protocol을 가지고 probe packet을 만들지는 모른다. IP의 TTL을 활용하는 것과 수신된 packet이 ICMP이라는것 까지는 동일하지만, 송신할 때 사용하는 transport layer protocol이 뭐냐는 다를 수 있다는 것이다. 가능한게 3가지인데, UDP / TCP/ ICMP이다.
기본적으로는 UDP를 사용하거나 ICMP를 사용한다. 예전 UNIX 계열은 UDP를 사용하며, Window나 최근 Linux의 경우에는 ICMP를 사용한다.
무슨 protocol을 사용하냐랑 가장 크게 연관된 부분이 traceroute가 도착지랑 연결을 시도할 때 port를 뭘로 사용하냐는 것이다. UDP를 사용하는 경우 도착지의 port 번호를... 전혀 사용하지 않을 법한 port로 설정을 해서 통신을 한다. 이유는 도착지 측에서 이걸 진짜 유효한 연결로 생각하지 않도록 하기 위해서다. 해당 protocol이 알다시피 별도의 절차 없이 그냥 서로 바로 통신을 연결하는 것이라 유효한 연결에서 단순 탐색용 packet이 왔는데 이걸 진지하게 취급하면 난감하기 때문이다. 이때 TTL이 늘어날수록 port번호도 함께 늘려가지고 혹시나 운안좋게 사용되는 port를 썼더라도 한번만 쓸 수 있도록 설정을 한다.
ICMP의 경우 애초에 오류 메세지, 혹은 네트워크 상에서 무슨 operation을 하기 위해 사용되는 프로토콜이라서 도착 port를 뭘로 설정하는지 딱히 관심을 안가진다.
뒤에 배울 option을 통해 사용할 수 있는 TCP의 경우에도 도착 port를 뭘로 설정하든지 딱히 관심을 안가지는데, protocol 자체는 현실에서 사용되는 연결 구축이긴 하나 handshake 과정을 반만 해가지고 실질적인 TCP 연결이 이루어지지 않게 해서, 목적지가 이를 유효한 연결로 취급하지 않는 기술을 사용한다. 이를 'half-open technique'이라고 한다.
가장 간단한 사용법은 traceroute
옆에 도착지의 주소나 ip주소를 입력해서 사용하는 것이다. 밑은 geeksforgeeks에서의 예시 사진이다.
각 출력물의 의미는 위의 '기본 작동 원리'에서 설명한 내용을 참고.
traceroute
가 사용하는 internet protocol은 현재 host에 구성된 internet protocol을 기본으로 한다. 본인이 IPv4를 사용해 traceroute
를 쓰고 싶으면 -4
를, IPv6를 사용해 traceroute를 쓰고 싶으면
-6`을 쓰자.$ traceroute -4 linuxhint.com
$ traceroute -6 linuxhint.com
traceroute to linuxhint.com (2606:4700::6812:637), 30 hops max, 80 byte packets
connect: Network is unreachable
-p
를 사용하면 된다. UDP traceroute의 경우 base port를 저걸로 설정하며 이후 TTL마다 거기서 1씩 늘린다. TCP랑 ICMP의 경우 이 option으로 설정한 port를 그대로 사용한다.$ traceroute -p 80 192.168.0.1
traceroute
의 output은, gateway의 device name이 존재할 경우 그것도 같이 출력을 한다. 이것을 출력하지 않도록 하는 것이 -n
option이다.$ traceroute -n 192.168.0.1
traceroute
는 최대 5초까지 답변을 기다린다고 했다. 그러나 이거보다 더 길게 설정해야 하거나 짧게 설정해야 할 수 있는데 이 경우 -w
option을 사용하자.$ traceroute -w 6.0 192.168.0.1
-I
, -T
, -U
를 사용하도록 하자.$ traceroute -I 192.168.0.1
-m
을 통해 조절하면 된다.$ traceroute -m 10 192.168.0.1
-i
option을 사용한다. 옆에 interface 이름도 넣어야 하는데, 이건 ifconfig
command를 통해 파악이 가능하다. 참고로 기본은, OS 상에 있는 routing table에 따라서 무슨 interface를 사용할지를 정한다.$ traceroute -i eth0 192.168.0.1
-q
를 사용하도록 하자.$ traceroute -q 4 192.168.0.1
-g
를 사용하자. 다만 이게 IP source routing option을 packet에 추가하는 것인데, 대부분의 router이 보안상의 문제로 이것을 지원하지 않는다는 점은 유의 바란다. 여러개의 gateway 설정도 가능하며, 이 경우 ,
로 구분지으면 된다.$ traceroute -g 192.168.43.45 google.com
-F
를 하면 된다. IPv4로 진행 중인 경우 중간의 router들도 fragmentization을 하지 않도록 DF bit를 설정해버린다. 이러면 probing packet이 무조건 한번에 전달 성공이 되거나 실패가 된다.$ traceroute -F google.com
-f
를 사용하면 된다.$ traceroute -f 3 google.com
$ traceroute google.com 100
$ traceroute -4IFnp 80 -w 6.0 -i eth0 -q 5 -f 5 google.com 100