在没有root特权的情况下如何运行类似traceroute的程序?
我已经看到另一个程序在其中提供了traceroute功能,但不需要root(超级用户)特权?我一直认为原始套接字需要是root,但是还有其他方法吗? (我认为有人提到过" supertrace"或者" tracepath"?)谢谢!
解决方案
回答
对目标执行Ping操作,逐渐增加TTL,并观察" TTL超出"响应的来源。
回答
某些应用程序不使用原始套接字,而是使用编号更大的tcp或者udp端口。通过将tcp端口指向已知Web服务器上的端口80,可以跟踪到该服务器的路由。缺点是我们需要知道在目标设备上打开了哪些端口才能进行tcpping。
回答
我们不需要使用原始套接字来发送和接收ICMP数据包。至少不是在Windows上。
回答
如果我们拥有现代化的Linux发行版,则可以查看traceroute(或者tracepath,它是在traceroute没有setuid之前发生的)和tcptraceroute的源。这些都不需要RAW套接字-在Fedora 9上已选中,它们不是setuid的,并且对普通用户使用默认选项。
使用tcptraceroute所做的代码可能是esp。有用,因为到地址的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结果中读取数据。
回答
ping和traceroute使用ICMP协议。像UDP和TCP一样,可以通过常规套接字API进行访问。除根目录外,只有小于1024的UDP和TCP端口号受到保护,不能使用。 ICMP对所有用户免费提供。
如果我们真的想了解ping和traceroute的工作原理,可以从CodeProject下载它们的示例C代码实现。
简而言之,他们简单地打开一个ICMP套接字,并且traceroute使用setsockopt更改TTL的增量,直到达到目标为止。