traceroute コマンドの無い環境で traceroute を再現する

traceroute コマンドとは、 TTL を増やしながら送る ICMP パケットなので、 ping コマンドが使えれば再現可能。

問題

Android 端末でのネットワークトラブルシューティングのために adb shell をしながら curl したり ping を試していたけど、 traceroute が無いことに気づいた。

root を取れば traceroute コマンドを入れることも可能だけど、会社の検証端末なので root は取りたくない (というかポリシー的にダメそう) 。

解決方法

TTL を増やしながら送る ICMP パケットなので、 ping コマンドが使えれば再現可能。

ping コマンドの ttl を指定するオプションは環境によってかなり違うようなので man なり help なりを読んでみてください。 Android では -t でしたが、 Mac では -m でした。

Android で試してみた

 $ for i in `seq 1 54`; do ping -t $i -c 1 www.google.com | grep rom; sleep 1; done
From 192.168.100.1: icmp_seq=1 Time to live exceeded
From flets-nte-poi3.edit.ne.jp (218.219.145.6): icmp_seq=1 Time to live exceeded
From flets-gw-poi3.edit.ne.jp (218.219.145.5): icmp_seq=1 Time to live exceeded
From 218.219.145.37: icmp_seq=1 Time to live exceeded
From 202.17.189.121: icmp_seq=1 Time to live exceeded
From 202.17.189.61: icmp_seq=1 Time to live exceeded
From as15169.ix.jpix.ad.jp (210.171.224.96): icmp_seq=1 Time to live exceeded
From 108.170.242.161: icmp_seq=1 Time to live exceeded
From 66.249.95.89: icmp_seq=1 Time to live exceeded
64 bytes from nrt20s02-in-f4.1e100.net (172.217.26.4): icmp_seq=1 ttl=55 time=25.1 ms
64 bytes from nrt20s02-in-f4.1e100.net (172.217.26.4): icmp_seq=1 ttl=55 time=23.9 ms
64 bytes from nrt20s02-in-f4.1e100.net (172.217.26.4): icmp_seq=1 ttl=55 time=23.5 ms

Mac で試してみた

$ for i in `seq 1 54`; do ping -m $i -c 1 -t 1 www.google.com | grep rom; done
36 bytes from 192.168.100.1: Time to live exceeded
36 bytes from flets-nte-poi3.edit.ne.jp (218.219.145.6): Time to live exceeded
36 bytes from flets-gw-poi3.edit.ne.jp (218.219.145.5): Time to live exceeded
36 bytes from 218.219.145.37: Time to live exceeded
36 bytes from 202.17.189.121: Time to live exceeded
36 bytes from 202.17.189.61: Time to live exceeded
36 bytes from as15169.ix.jpix.ad.jp (210.171.224.96): Time to live exceeded
76 bytes from 108.170.242.129: Time to live exceeded
92 bytes from 108.170.236.5: Time to live exceeded
64 bytes from 172.217.27.68: icmp_seq=0 ttl=55 time=10.746 ms
64 bytes from 172.217.27.68: icmp_seq=0 ttl=55 time=4.149 ms
64 bytes from 172.217.27.68: icmp_seq=0 ttl=55 time=4.149 ms

Mac で検算してみた

$ traceroute www.google.com
traceroute to www.google.com (172.217.27.68), 64 hops max, 52 byte packets
 1  192.168.100.1 (192.168.100.1)  1.903 ms  2.308 ms  1.193 ms
 2  flets-nte-poi3.edit.ne.jp (218.219.145.6)  4.379 ms  3.693 ms  4.483 ms
 3  flets-gw-poi3.edit.ne.jp (218.219.145.5)  4.969 ms  4.604 ms  5.210 ms
 4  218.219.145.37 (218.219.145.37)  5.696 ms  4.900 ms  4.650 ms
 5  202.17.189.121 (202.17.189.121)  4.710 ms  4.347 ms  5.061 ms
 6  202.17.189.61 (202.17.189.61)  4.747 ms  4.849 ms  4.570 ms
 7  as15169.ix.jpix.ad.jp (210.171.224.96)  4.879 ms  4.685 ms  8.653 ms
 8  108.170.242.97 (108.170.242.97)  4.891 ms
    108.170.242.129 (108.170.242.129)  6.192 ms  4.975 ms
 9  108.170.236.5 (108.170.236.5)  5.277 ms
    108.170.236.7 (108.170.236.7)  4.860 ms
    108.170.236.5 (108.170.236.5)  4.219 ms
10  nrt12s15-in-f68.1e100.net (172.217.27.68)  3.942 ms  5.195 ms  5.049 ms

まとめ

AndroidMac で到達しているホストが異なるので若干経路に違いはあるけど、 Mac の再現と検算では経路が同じだったので traceroute 再現という目的は達成できてそう。