5

別のプログラムがその中にtraceroute機能を提供しているのを見ましたが、root(スーパーユーザー)特権は必要ありませんか?私は常にrawソケットがrootである必要があると思っていましたが、他の方法はありますか?(誰かが「スーパートレース」または「トレースパス」について言及したと思いますか?)ありがとう!

4

5 に答える 5

3

ターゲットにpingを実行し、TTLを徐々に増やして、「TTL超過」応答が発生する場所を監視します。

于 2008-09-16T21:00:41.363 に答える
1

raw ソケットを使用するのではなく、一部のアプリケーションはより高い番号の tcp または udp ポートを使用します。その tcp ポートを既知の Web サーバーのポート 80 に向けることで、そのサーバーに traceroute できます。欠点は、宛先デバイスでどのポートが開いているかを知る必要があることです。

于 2008-09-16T21:02:29.753 に答える
1

pingtracerouteは ICMP プロトコルを使用します。UDP や TCP と同様に、これは通常のソケット API を介してアクセスできます。1024 未満の UDP および TCP ポート番号のみが、root 以外による使用から保護されています。ICMP は、すべてのユーザーが無料で利用できます。

ping と traceroute がどのように機能するかを実際に確認したい場合は、CodeProjectから C コードの実装例をダウンロードできます。

つまり、ICMP ソケットを開くだけで、traceroute は、ターゲットに到達するまで、setsockopt を使用して TTL の増分を変更します。

于 2008-09-16T21:26:50.973 に答える
0

ICMP パケットの送受信に raw ソケットを使用する必要はありません。少なくとも Windows ではありません。

于 2008-09-16T21:03:18.033 に答える
-2

最新の 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 の結果からデータを読み取ります。

于 2008-09-16T21:15:19.253 に答える