สรุปสิ่งที่ควรรู้
- Parameter บังคับเพียงอย่างเดียวคือ Hostname หรือ IP Address ของปลายทาง
- เริ่ม Probe ด้วย TTL=1 เพิ่มทีละ 1 จนได้ ICMP "port unreachable" หรือถึง Max Attempts
บทความนี้ครอบคลุมข้อมูล Traceroute สำหรับ Linux รวมคำอธิบาย Switches และการอ่านผลลัพธ์ Traceroute ใช้งานต่างใน Windows
Traceroute ทำงานอย่างไร
คำสั่ง traceroute แผนที่เส้นทางที่ Packet เดินทางจาก Source ไป Destination หนึ่งในการใช้งานคือ หาจุดที่ Data Loss เกิดขึ้นใน Network ซึ่งอาจบ่งบอก Node ที่ Down
แต่ละ Hop ใน Record แสดง Server หรือ Router ใหม่ระหว่าง PC ต้นทางและ Target การวิเคราะห์ผล Traceroute ช่วยระบุ Slow Points ที่อาจส่งผลต่อ Network Traffic
Troubleshooting ด้วย Traceroute
การประเมิน Route เฉพาะที่ Network Traffic เดิน (หรือหา Gateway ที่ Drop Packets) มีหลาย Challenge Traceroute ใช้ IP Protocol Time to Live Field เพื่อขอ ICMP TIME_EXCEEDED Response จากแต่ละ Gateway บน Path ไป Destination Host
Parameter บังคับเพียงอย่างเดียวตอนรัน traceroute คือ Hostname หรือ IP Address ของ Destination
Traceroute Syntax และ Switches
Traceroute ไวยากรณ์ทั่วไป:
traceroute [ -dFInrvx ] [ -f first_ttl ] [ -g gateway ] [ -i iface ] [ -m max_ttl ] [ -p port ] [ -q nqueries ] [ -s src_addr ] [ -t tos ] [ -w waittime ] [ -z pausemsecs ] host [ packetlen ]
เปลี่ยน Performance หรือ Output ได้ด้วย Optional Switches:
| Switch | คำอธิบาย |
|---|---|
| -f | ตั้งค่า Initial Time-to-Live สำหรับ Probe Packet แรก |
| -F | Set "Don't Fragment" Bit |
| -d | Enable Socket Level Debugging |
| -g | ระบุ Loose Source Route Gateway (สูงสุด 8) |
| -i | ระบุ Network Interface เพื่อ Source IP ของ Outgoing Probe Packets เหมาะกับ Multi-homed Host (ดู Flag -s อีกวิธี) |
| -I | ใช้ ICMP ECHO แทน UDP Datagrams |
| -m | ตั้งค่า Max Time-to-Live (Max Hops) Default 30 Hops (เหมือน TCP Default) |
| -n | พิมพ์ Hop Addresses แบบตัวเลขอย่างเดียว (ประหยัด Nameserver Lookup) |
| -p | ตั้งค่า Base UDP Port Number สำหรับ Probes (Default 33434) หาก Port ใน Range Default ถูกใช้ ให้เปลี่ยนด้วย Option นี้ |
| -r | Bypass Routing Tables ส่งตรงไป Host บน Attached Network หากไม่ใช่ Directly Attached จะ Error |
| -s | ใช้ IP Address ต่อไปนี้ (มักเป็น IP Number ไม่ใช่ Hostname) เป็น Source Address ใน Outgoing Probe Packets บน Multi-homed Hosts ใช้ Force Source Address ให้ไม่ใช่ IP ของ Interface ที่ส่ง Probe |
| -t | ตั้งค่า Type-of-Service ใน Probe Packets (Default 0) ค่า 0-255 ใช้ดูว่า TOS ต่างกันให้ Path ต่างกันหรือไม่ |
| -v | Verbose Output แสดง ICMP Packets อื่นๆ นอกจาก TIME_EXCEEDED และ UNREACHABLE |
| -w | ตั้งค่า Time (วินาที) รอ Response ของ Probe (Default 5 วิ) |
| -x | Toggle IP Checksums ปกติป้องกันไม่ให้ Traceroute คำนวณ IP Checksums บาง OS เขียนทับ Packet แต่ไม่ Recalculate Checksum |
| -z | ตั้งค่า Time (Milliseconds) หน่วงระหว่าง Probes (Default 0) ระบบบางตัว Rate Limit ICMP Messages ค่าที่ดีคือ 500 (0.5 วิ) |
การอ่านผลลัพธ์
Traceroute แสดง Path ของ IP Packet ไป Internet Host โดยยิง UDP Probe Packets ด้วย TTL น้อย แล้วฟัง ICMP "Time Exceeded" Reply จาก Gateway เริ่ม TTL=1 เพิ่มทีละ 1 จนได้ ICMP "Port Unreachable" (มาถึงปลายทาง) หรือถึง Max Attempts (Default 30 Hops เปลี่ยนได้ด้วย Flag -m)
ตอน Traceroute รัน จะส่ง Probe 3 ตัวต่อ TTL Setting แล้วพิมพ์บรรทัดแสดง TTL, Gateway Address, Round-trip Time ของแต่ละ Probe หาก Probe ตอบจาก Gateway ต่างกัน จะแสดง Address ของแต่ละระบบ หากไม่ได้ Response ภายใน 5 วิ (เปลี่ยนด้วย Flag -w) จะพิมพ์ Asterisk (*) สำหรับ Probe นั้น
เพื่อป้องกัน UDP Probe-Packet Processing ท่วมท้น Destination Host Traceroute ตั้ง Destination Port เป็นค่าที่ Device ไม่น่าจะใช้ หาก Network/Service ที่ปลายทางใช้ Port นั้น ให้เปลี่ยนด้วย Flag -p
ตัวอย่างผลลัพธ์ Traceroute
การใช้งานตัวอย่างจะได้ผลลัพธ์คล้ายนี้:
[yak 71]% traceroute nis.nsf.net. traceroute to nis.nsf.net (35.1.1.48), 30 hops max, 38 byte packet 1 helios.ee.lbl.gov (128.3.112.1) 19 ms 19 ms 0 ms 2 lilac-dmc.Berkeley.EDU (128.32.216.1) 39 ms 39 ms 19 ms 3 lilac-dmc.Berkeley.EDU (128.32.216.1) 39 ms 39 ms 19 ms 4 ccngw-ner-cc.Berkeley.EDU (128.32.136.23) 39 ms 40 ms 39 ms 5 ccn-nerif22.Berkeley.EDU (128.32.168.22) 39 ms 39 ms 39 ms 6 128.32.197.4 (128.32.197.4) 40 ms 59 ms 59 ms 7 131.119.2.5 (131.119.2.5) 59 ms 59 ms 59 ms 8 129.140.70.13 (129.140.70.13) 99 ms 99 ms 80 ms 9 129.140.71.6 (129.140.71.6) 139 ms 239 ms 319 ms 10 129.140.81.7 (129.140.81.7) 220 ms 199 ms 199 ms 11 nic.merit.edu (35.1.1.48) 239 ms 239 ms 239 ms
บรรทัดที่ 2 และ 3 เหมือนกัน เกี่ยวกับ Buggy Kernel บน Hop ที่ 2 (lbl-csam.arpa) ที่ Forward Packets ด้วย TTL=0 (Bug ใน 4.3 BSD) ต้องเดา Path ข้ามประเทศเพราะ NSFNet ไม่ให้ Address-to-Name Translations
ตัวอย่าง Silent Gateway
ตัวอย่างน่าสนใจกว่า:
[yak 72]% traceroute allspice.lcs.mit.edu. traceroute to allspice.lcs.mit.edu (18.26.0.115), 30 hops max 1 helios.ee.lbl.gov (128.3.112.1) 0 ms 0 ms 0 ms 2 lilac-dmc.Berkeley.EDU (128.32.216.1) 19 ms 19 ms 19 ms 3 lilac-dmc.Berkeley.EDU (128.32.216.1) 39 ms 19 ms 19 ms 4 ccngw-ner-cc.Berkeley.EDU (128.32.136.23) 19 ms 39 ms 39 ms 5 ccn-nerif22.Berkeley.EDU (128.32.168.22) 20 ms 39 ms 39 ms 6 128.32.197.4 (128.32.197.4) 59 ms 119 ms 39 ms 7 131.119.2.5 (131.119.2.5) 59 ms 59 ms 39 ms 8 129.140.70.13 (129.140.70.13) 80 ms 79 ms 99 ms 9 129.140.71.6 (129.140.71.6) 139 ms 139 ms 159 ms 10 129.140.81.7 (129.140.81.7) 199 ms 180 ms 300 ms 11 129.140.72.17 (129.140.72.17) 300 ms 239 ms 239 ms 12 * * * 13 128.121.54.72 (128.121.54.72) 259 ms 499 ms 279 ms 14 * * * 15 * * * 16 * * * 17 * * * 18 ALLSPICE.LCS.MIT.EDU (18.26.0.115) 339 ms 279 ms 279 ms
Gateway ที่ Hop 12, 14, 15, 16, 17 ไม่ส่ง ICMP "Time Exceeded" หรือส่งด้วย TTL เล็กเกินไป บรรทัด 14-17 รัน MIT C Gateway Code ที่ไม่ส่ง "Time Exceeded"
Silent Gateway 12 อาจมาจาก Bug ใน 4.[23]BSD Network Code: Machines รัน 4.3 Code หรือเก่ากว่า ส่ง Unreachable Message ด้วย TTL ที่เหลือใน Datagram ต้นทาง สำหรับ Gateway TTL ที่เหลือคือ 0 ICMP "Time Exceeded" จะไม่กลับมาถึงเราแน่นอน
ตัวอย่าง Destination System Silent Gateway
พฤติกรรม Bug นี้น่าสนใจกว่าเมื่อปรากฏบน Destination System:
1 helios.ee.lbl.gov (128.3.112.1) 0 ms 0 ms 0 ms 2 lilac-dmc.Berkeley.EDU (128.32.216.1) 39 ms 19 ms 39 ms 3 lilac-dmc.Berkeley.EDU (128.32.216.1) 19 ms 39 ms 19 ms 4 ccngw-ner-cc.Berkeley.EDU (128.32.136.23) 39 ms 40 ms 19 ms 5 ccn-nerif35.Berkeley.EDU (128.32.168.35) 39 ms 39 ms 39 ms 6 csgw.Berkeley.EDU (128.32.133.254) 39 ms 59 ms 39 ms 7 * * * 8 * * * 9 * * * 10 * * * 11 * * * 12 * * * 13 rip.Berkeley.EDU (128.32.131.22) 59 ms ! 39 ms ! 39 ms !
สังเกตมี 12 "Gateways" (13 คือปลายทาง) ครึ่งหลังหายไป จริงๆ Server rip (Sun-3 รัน Sun OS 3.5) ใช้ TTL จาก Datagram ที่มาถึง เป็น TTL ใน ICMP Reply Reply จะ Timeout บน Return Path (ไม่มี Notice เพราะ ICMPs ไม่ส่ง ICMPs) จนกว่าเราจะ Probe ด้วย TTL อย่างน้อยสองเท่าของ Path Length กล่าวคือ Rip อยู่จริงๆ แค่ 7 Hops
Reply ที่กลับมาด้วย TTL=1 เป็น Clue ของปัญหานี้ Traceroute พิมพ์ ! หลัง Time หาก TTL ≤ 1 เนื่องจาก Vendor ส่ง Obsolete/Non-standard Software มาก ควรคาดการณ์ปัญหานี้และระวังเลือก Target Host
Annotations อื่นๆ หลัง Time: !H, !N, !P (Host/Network/Protocol Unreachable), !S (Source Route Failed), !F- (Fragmentation Needed - แสดง RFC1191 Path MTU Discovery), !X (Communication Administratively Prohibited), !V (Host Precedence Violation), !C (Precedence Cutoff), ! (ICMP Unreachable Code) กำหนดโดย RFC1812 (Supersedes RFC1716) หาก Probes เกือบทั้งหมด Unreachable Traceroute จะยอมแพ้และ Exit
โปรแกรมนี้สำหรับ Network Testing, Measurement, Management ใช้ 주로 Manual Fault Isolation เนื่องจาก Load ที่อาจเกิดกับ Network ไม่ควรใช้ Traceroute ระหว่าง Operations ปกติ หรือจาก Automated Scripts