Linux에서 traceroute 명령을 사용하는 방법

네트워크 연결 문제를 겪고 계신가요? Linux traceroute 명령어를 활용하면 네트워크 패킷의 이동 경로에서 병목 구간을 찾아내어 느린 연결 문제를 해결하는 데 도움이 됩니다. 지금부터 그 방법을 알아보겠습니다!

traceroute 작동 원리

traceroute가 어떻게 작동하는지 이해하면 그 결과를 해석하기가 훨씬 수월해집니다. 네트워크 경로가 복잡할수록 네트워크 패킷이 목적지에 도달하기 위해 거쳐야 하는 과정이 많아지고, 그만큼 속도 저하가 발생할 수 있는 지점을 정확히 파악하기가 어려워집니다.

소규모 조직의 근거리 통신망(LAN)은 일반적으로 단순합니다. 최소한 한 대의 서버와 라우터가 있겠죠. 하지만 광역 네트워크(WAN)로 넘어가면 상황이 복잡해집니다. 서로 다른 위치 간, 혹은 인터넷을 통한 통신을 생각해보세요. 네트워크 패킷은 수많은 라우터와 게이트웨이를 거쳐 이동하게 됩니다.

데이터 패킷의 메타데이터 헤더에는 길이, 출발지, 이동 경로, 사용 프로토콜 등 다양한 정보가 담겨 있습니다. 헤더의 내용은 프로토콜 사양에 따라 정의됩니다. 사용된 프로토콜을 식별할 수 있다면 헤더에서 각 필드의 시작과 끝을 찾아 메타데이터를 읽을 수 있습니다.

traceroute는 TCP/IP 프로토콜 스택과 사용자 데이터그램 프로토콜(UDP) 패킷을 활용합니다. 패킷 헤더에는 TTL(Time to Live) 필드가 포함되어 있는데, 8비트 정수 값을 가지며, 시간이 아닌 ‘홉’ 수를 의미합니다.

패킷은 출발지에서 목적지까지 라우터를 거쳐 이동합니다. 패킷이 라우터에 도착할 때마다 TTL 카운터는 1씩 감소합니다. 만약 TTL 값이 1에 도달하면, 해당 라우터는 값을 0으로 만들고 패킷을 폐기합니다. 이는 ‘시간 초과’를 의미하며 패킷은 다음 홉으로 전달되지 않습니다.

이때 라우터는 인터넷 제어 메시지 프로토콜(ICMP)의 시간 초과 메시지를 원래 패킷 출발지로 되돌려 보냅니다. 이 Time Exceeded 메시지는 원본 헤더와 데이터의 첫 64비트를 포함하며, RFC 792 6페이지에 정의되어 있습니다.

traceroute는 패킷을 보낼 때 TTL 값을 1로 설정하여 첫 번째 라우터까지만 도달하게 합니다. 그 후 라우터로부터 ICMP 시간 초과 메시지를 수신하고 왕복 시간을 기록합니다.

다음으로 TTL을 2로 설정하여 동일한 과정을 반복하고, 두 홉 이후 실패합니다. traceroute는 TTL을 3으로 늘려 다시 시도합니다. 이러한 과정을 목표 지점에 도달하거나 최대 홉 수(기본적으로 30)를 초과할 때까지 반복합니다.

응답하지 않는 라우터 문제

일부 라우터는 버그로 인해 TTL이 0인 패킷을 폐기하는 대신 전달하려고 시도합니다.

Cisco에 따르면 일부 인터넷 서비스 제공업체(ISP)는 라우터가 중계하는 ICMP 메시지 수를 제한하기도 합니다.

또한 일부 장치는 의도적으로 ICMP 패킷을 보내지 않도록 설정되어 있기도 합니다. 이는 분산 서비스 거부 공격, 예를 들어 스머프 공격에 무분별하게 참여하지 않도록 하기 위한 조치입니다.

traceroute는 기본적으로 5초의 응답 시간 제한을 가지고 있습니다. 만약 5초 이내에 응답을 받지 못하면 해당 시도는 중단됩니다. 즉, 매우 느린 라우터의 응답은 무시될 수 있습니다.

traceroute 설치

traceroute는 Fedora 31에는 이미 설치되어 있지만 Manjaro 18.1 및 Ubuntu 18.04에는 별도로 설치해야 합니다. Manjaro에 traceroute를 설치하려면 아래 명령어를 입력하세요.

sudo pacman -Sy traceroute

Ubuntu에 traceroute를 설치하려면 아래 명령어를 사용하세요.

sudo apt-get install traceroute

traceroute 사용법

앞서 언급했듯이 traceroute의 목적은 컴퓨터에서 목적지까지 각 홉에서 라우터의 응답을 얻어내는 것입니다. 일부 라우터는 아무런 응답을 하지 않을 수도 있고, 다른 라우터는 정보를 제공할 수도 있습니다.

예를 들어, 블라니 성 웹사이트에 대한 traceroute를 실행해 보겠습니다. 블라니 성은 블라니 스톤으로 유명한 아일랜드의 관광 명소입니다. 전설에 따르면 블라니 스톤에 키스하면 “달변의 재능”을 얻게 된다고 합니다. 도중에 만나는 라우터들도 이처럼 “말썽쟁이”이기를 바라봅니다.

다음 명령어를 입력하세요.

traceroute www.blarneycastle.ie

첫 번째 줄은 다음과 같은 정보를 보여줍니다.

목표지 주소와 해당 IP 주소
traceroute가 포기하기 전에 시도할 최대 홉 수
전송되는 UDP 패킷의 크기

이후 각 줄에는 홉 중 하나에 대한 정보가 담겨 있습니다. 실행 결과 컴퓨터와 블라니 성 웹사이트 사이에 11개의 홉이 존재하며, 11번째 홉에서 목적지에 도착했다는 사실을 알 수 있습니다.

각 홉 라인은 다음 형식을 따릅니다.

장치 이름 (혹은 장치가 자체 식별하지 못하는 경우 IP 주소)
IP 주소
세 번의 테스트 각각에 소요된 왕복 시간. 별표(*) 표시는 해당 테스트에 대한 응답이 없었음을 의미합니다. 장치가 전혀 응답하지 않으면 세 개의 별표가 표시되고 장치 이름이나 IP 주소는 표시되지 않습니다.

이제 결과를 자세히 살펴보겠습니다.

홉 1: 첫 번째 관문은 로컬 네트워크의 DrayTek Vigor 라우터입니다. UDP 패킷이 로컬 네트워크를 떠나 인터넷으로 진입하는 지점입니다.
홉 2: 이 장치는 응답하지 않았습니다. ICMP 패킷을 보내지 않도록 구성되었거나, 응답했지만 너무 느려서 traceroute 시간이 초과되었을 수 있습니다.
홉 3: 장치는 응답했지만 이름을 얻지 못하고 IP 주소만 받았습니다. 이 줄에 별표가 있는 것은 세 가지 요청 모두에 대한 응답을 받지 못했다는 의미이며, 이는 패킷 손실을 나타낼 수 있습니다.
홉 4 및 5: 익명의 홉들이 이어집니다.
홉 6: 이 홉은 세 번의 UDP 요청을 모두 처리했기 때문에 정보가 많습니다. 각 장치의 (상당히 긴) 이름과 IP 주소가 표시됩니다. 이는 많은 트래픽을 처리할 수 있는 풍부한 네트워크에서 흔히 볼 수 있는 현상입니다. 이 홉은 영국에서 가장 큰 ISP 중 하나에 속하므로, 동일한 원격 장치가 모든 연결 요청을 처리한다는 것은 사실상 불가능에 가깝습니다.
홉 7: UDP 패킷이 ISP 네트워크를 벗어나는 지점입니다.
홉 8: 다시 한번 IP 주소는 얻었지만 장치 이름은 얻지 못했습니다. 세 가지 테스트는 모두 성공적으로 완료되었습니다.
홉 9 및 10: 두 개의 익명 홉이 더 있습니다.
홉 11: 드디어 블라니 성 웹사이트에 도착했습니다. 블라니 성은 아일랜드 코크에 있지만, IP 주소 지리적 위치 정보에 따르면 웹사이트는 런던에 위치하고 있습니다.

결론적으로, 일부 장치는 정보를 제공했고, 다른 장치는 응답했지만 이름을 알려주지 않았고, 또 다른 장치는 익명으로 유지되었습니다.

하지만 최종 목적지에 도달했으며, 왕복 시간은 약 13.773밀리초에서 14.715밀리초 사이라는 것을 확인할 수 있습니다.

장치 이름 숨기기

앞서 보았듯이 장치 이름이 표시되면 결과가 복잡해 보일 수 있습니다. 결과를 좀 더 쉽게 확인하기 위해 ‘-n'(매핑 없음) 옵션을 사용할 수 있습니다.

다음과 같이 명령어를 입력해 보세요.

traceroute -n blarneycastle.ie

이 방법으로 왕복 시간을 더 쉽게 비교하고 병목 현상을 찾아낼 수 있습니다.

홉 3은 여전히 의심스럽습니다. 이전 실행에서는 두 번 응답했었는데 이번에는 한 번만 응답했습니다. 물론 이러한 상황은 우리가 제어할 수 없는 부분입니다.

만약 회사 네트워크를 조사하는 중이라면 해당 노드에 대해 조금 더 자세히 알아볼 필요가 있을 것입니다.

traceroute 시간 초과 값 설정

기본 시간 제한(5초)을 늘리면 더 많은 응답을 얻을 수 있습니다. ‘-w'(대기 시간) 옵션을 사용하여 7초로 변경해 보겠습니다 (이 값은 부동 소수점으로 입력해야 합니다).

다음 명령어를 입력하세요.

traceroute -w 7.0 blarneycastle.ie

결과에 큰 차이는 없었습니다. 응답 시간이 초과되었거나, 익명의 홉이 의도적으로 정보를 숨기고 있을 가능성이 있습니다.

테스트 횟수 설정

기본적으로 traceroute는 각 홉에 대해 3개의 UDP 패킷을 보냅니다. ‘-q'(쿼리 수) 옵션을 사용하여 이 값을 변경할 수 있습니다.

traceroute 테스트 속도를 높이려면, 다음 명령어를 사용하여 전송하는 UDP 패킷 수를 줄여보세요.

traceroute -q 1 blarneycastle.ie

이제 각 홉에 하나의 패킷만 전송됩니다.

초기 TTL 값 설정

TTL 초기값을 1이 아닌 다른 값으로 설정하면 일부 홉을 건너뛸 수 있습니다. 일반적으로 TTL 값은 첫 번째 테스트 세트에서 1로 설정되고, 다음 테스트 세트에서 2로 설정되는 식으로 증가합니다. 만약 5로 설정하면 첫 번째 테스트는 5홉을 시도하고, 1에서 4번째 홉을 건너뛰게 됩니다.

블라니 성 웹사이트가 이 컴퓨터에서 11홉 거리에 있다는 것을 알기 때문에, 다음 명령어를 사용하여 11번째 홉으로 바로 이동해 보겠습니다.

traceroute -f 11 blarneycastle.ie

이 방법으로 목적지에 대한 연결 상태 요약을 빠르게 확인할 수 있습니다.

주의사항

traceroute는 네트워크 라우팅 경로를 분석하거나 연결 속도를 확인하고 병목 현상을 파악하는 데 유용한 도구입니다. Windows 환경에서는 tracert라는 유사한 명령어를 사용할 수 있습니다.

하지만 traceroute를 과도하게 사용하여 알 수 없는 장치에 UDP 패킷을 퍼붓는 것은 지양해야 하며, 스크립트나 자동화된 작업에 traceroute를 포함할 때는 주의해야 합니다.

traceroute가 네트워크에 가하는 부하는 성능에 부정적인 영향을 줄 수 있습니다. 따라서 즉시 해결해야 할 긴급한 상황이 아니라면 업무 시간 외에 사용하는 것이 좋습니다.