別のプログラムがその中にtraceroute機能を提供しているのを見ましたが、root(スーパーユーザー)特権は必要ありませんか?私は常にrawソケットがrootである必要があると思っていましたが、他の方法はありますか?(誰かが「スーパートレース」または「トレースパス」について言及したと思いますか?)ありがとう!
5 に答える
ターゲットにpingを実行し、TTLを徐々に増やして、「TTL超過」応答が発生する場所を監視します。
raw ソケットを使用するのではなく、一部のアプリケーションはより高い番号の tcp または udp ポートを使用します。その tcp ポートを既知の Web サーバーのポート 80 に向けることで、そのサーバーに traceroute できます。欠点は、宛先デバイスでどのポートが開いているかを知る必要があることです。
pingとtracerouteは ICMP プロトコルを使用します。UDP や TCP と同様に、これは通常のソケット API を介してアクセスできます。1024 未満の UDP および TCP ポート番号のみが、root 以外による使用から保護されています。ICMP は、すべてのユーザーが無料で利用できます。
ping と traceroute がどのように機能するかを実際に確認したい場合は、CodeProjectから C コードの実装例をダウンロードできます。
つまり、ICMP ソケットを開くだけで、traceroute は、ターゲットに到達するまで、setsockopt を使用して TTL の増分を変更します。
ICMP パケットの送受信に raw ソケットを使用する必要はありません。少なくとも Windows ではありません。
最新の Linux ディストリビューションを使用している場合は、traceroute (または traceroute が setuid なしになる前に発生した tracepath) と tcptraceroute のソースを確認できます。これらはいずれも RAW ソケットを必要としません。Fedora 9 で確認すると、setuid ではなく、通常のユーザーのデフォルト オプションで動作します。
tcptraceroute が行うコードを使用すると、特に問題が発生する可能性があります。たとえば、あるアドレスへの ICMP パケットが、ポート 80 への TCP 接続と同じ場所に到達するとは限らないため、便利です。
(通常のユーザーとして)traceroute の strace を実行すると、次のようなことを示します。
int opt_on = 1;
int opt_off = 0;
fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)
setsockopt(fd, SOL_IP, IP_MTU_DISCOVER, &opt_off, sizeof int)
setsockopt(fd, SOL_SOCKET, SO_TIMESTAMP, &opt_on, sizeof int)
setsockopt(fd, SOL_IP, IP_RECVTTL, &opt_on, sizeof int)
...そして、CMSG の結果からデータを読み取ります。