5

我已经看到另一个程序在其中提供了跟踪路由功能,但不需要 root(超级用户)权限?我一直认为原始套接字需要是 root,但是还有其他方法吗?(我认为有人提到了“supertrace”或“tracepath”?)谢谢!

4

5 回答 5

3

Ping 目标,逐渐增加 TTL 并观察“TTL 超出”响应的来源。

于 2008-09-16T21:00:41.363 回答
1

一些应用程序不使用原始套接字,而是使用编号更高的 tcp 或 udp 端口​​。通过将该 tcp 端口指向已知 Web 服务器上的端口 80,您可以跟踪路由到该服务器。缺点是您需要知道目标设备上打开了哪些端口才能对其进行 tcpping。

于 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 数据包。至少在 Windows 上没有。

于 2008-09-16T21:03:18.033 回答
-2

如果你有一个现代 Linux 发行版,你可以查看 traceroute(或 tracepath,在 traceroute 没有 setuid 之前出现)和 tcptraceroute 的源代码。这些都不需要 RAW 套接字——在 Fedora 9 上检查过,它们不是 setuid 并且使用普通用户的默认选项。

使用 tcptraceroute 所做的代码可能是 esp。很有用,因为到一个地址的 ICMP 数据包不一定会在与到端口 80 的 TCP 连接相同的位置结束,例如。

执行 strace 的 traceroute(作为普通用户)显示它正在执行以下操作:


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 回答