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
まとめ
Android と Mac で到達しているホストが異なるので若干経路に違いはあるけど、 Mac の再現と検算では経路が同じだったので traceroute 再現という目的は達成できてそう。