如何在不需要root权限的情况下运行类似traceroute的程序?

时间:2008-09-16 20:57:21

标签: sockets traceroute

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

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您不需要使用原始套接字来发送和接收ICMP数据包。至少不在Windows上。

答案 3 :(得分:0)

ping traceroute 使用ICMP协议。与UDP和TCP一样,可以通过普通的套接字API访问它。除root之外,仅保护小于1024的UDP和TCP端口号不被使用。 ICMP可供所有用户免费使用。

如果您真的想了解ping和traceroute的工作原理,可以从CodeProject为它们下载示例C代码实现。

简而言之,他们只需打开一个ICMP套接字,traceroute就会使用setsockopt改变TTL的增量,直到达到目标。

答案 4 :(得分:-1)

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

使用tcptraceroute所做的代码可能是特别的。例如,因为到地址的ICMP数据包不一定与与端口80的TCP连接在同一个地方结束,所以非常有用。

做一个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结果中读取数据。