2008-09-16 2 views
2

私は他のプログラムでtraceroute機能を提供していますが、ルート(スーパーユーザー)権限は必要ありません。私はいつもrawソケットがrootである必要があると仮定してきましたが、別の方法がありますか? (私は誰かが "supertrace"または "tracepath"と言ったと思う?)ありがとう!ルート特権を必要とせずにtracerouteのようなプログラムを実行するにはどうすればいいですか?

答えて

3

ターゲットにpingを実行し、TTLを徐々に増加させ、「TTL超過」レスポンスの発生場所を監視します。

+0

音がうまくいくようですが、少し複雑です。 – UnkwnTech

+2

これは実際にtracerouteがすることです。 – Ferruccio

+1

Cでrawソケットを使用せずにTTLをどのように増やしますか? – brian

1

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

+0

私はrootを必要とせずにこれを行った単一のツールを探してみました。私はできなかった。 google.comと言い換えるとルートを必要としない例がありますか? –

0

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

+0

カスタムTTLを持つパケットはどうですか? – brian

+0

99.99%が間違っています。 ICMPメッセージを偽造&送信するにはrawソケットが必要ですが、デフォルトで無効になっているLinuxシステムのICMPエコー要求メッセージは100%間違っていません。 –

+0

@ jean-loup - 私は数年前にICMPを内部的に実装してサーバを監視していたネットワーク監視システムに私のコメントを基づいています。 rawソケットは使用しませんでした。これはほぼ10年前のことだったので、事態が変わった可能性があります。また、すべてのバージョンのWindowsが実際にはrawソケットをサポートしているわけではありません。マイクロソフトが実際にそれらを有効にしたときは覚えていませんが、セキュリティ上の理由からXP SP2で無効にしました。それ以来彼らが何をしたのか分かりません。 – Ferruccio

-1

最新のLinuxディストリビューションをお持ちの場合は、traceroute(またはtracerouteがsetuidになる前のtracepath)とtcptracerouteを見ることができます。それらのどれもRAWソケットを必要としません - Fedora 9でチェックされて、彼らはsetuidではなく、通常のユーザーのためのデフォルトオプションで動作します。

tcptracerouteが行うコードを使用すると、有用なのは、アドレスへのICMPパケットが必ずしもポート80へのTCP接続と同じ場所で終わるとは限らないためです。


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結果からデータを読み込む:

(通常のユーザとして)のtracerouteのstraceのをやって、それが何かをやって示しています。

+0

traceroute.cのソースコードは、パケットのTTLを書き直すためにユーザがrootであることを期待しています。もしあなたがディストリビューションを見ていれば、おそらくsetuid rootです。 – brian

0

pingおよびtracerouteはICMPプロトコルを使用します。 UDPやTCPと同様に、これは通常のソケットAPIを通じてアクセス可能です。 1024より小さいUDPおよびTCPポート番号だけが、ルート以外の使用から保護されます。 ICMPは、すべてのユーザーが自由に利用できます。

実際にpingとtracerouteの動作を確認したい場合は、CodeProjectからサンプルCコード実装をダウンロードできます。

要約すると、ICMPソケットを簡単に開き、ターゲットに達するまでsetsockoptを使用してtracerouteがTTLを増分します。

関連する問題