我已经看到另一个程序在其中提供了跟踪路由功能,但不需要 root(超级用户)权限?我一直认为原始套接字需要是 root,但是还有其他方法吗?(我认为有人提到了“supertrace”或“tracepath”?)谢谢!
5 回答
Ping 目标,逐渐增加 TTL 并观察“TTL 超出”响应的来源。
一些应用程序不使用原始套接字,而是使用编号更高的 tcp 或 udp 端口。通过将该 tcp 端口指向已知 Web 服务器上的端口 80,您可以跟踪路由到该服务器。缺点是您需要知道目标设备上打开了哪些端口才能对其进行 tcpping。
ping和traceroute使用 ICMP 协议。与 UDP 和 TCP 一样,这可以通过普通的套接字 API 访问。只有小于 1024 的 UDP 和 TCP 端口号受到保护,不能被 root 使用。ICMP 可供所有用户免费使用。
如果您真的想了解 ping 和 traceroute 是如何工作的,您可以从CodeProject下载一个示例 C 代码实现。
简而言之,他们简单地打开一个 ICMP 套接字,然后 traceroute 使用 setsockopt 更改 TTL 的增量,直到达到目标。
您不需要使用原始套接字来发送和接收 ICMP 数据包。至少在 Windows 上没有。
如果你有一个现代 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 结果中读取数据。