【发布时间】:2010-09-09 18:30:47
【问题描述】:
我看到另一个程序在其中提供了跟踪路由功能,但不需要 root(超级用户)权限?我一直认为原始套接字需要是 root,但是还有其他方法吗? (我认为有人提到了“supertrace”或“tracepath”?)谢谢!
【问题讨论】:
标签: sockets traceroute
我看到另一个程序在其中提供了跟踪路由功能,但不需要 root(超级用户)权限?我一直认为原始套接字需要是 root,但是还有其他方法吗? (我认为有人提到了“supertrace”或“tracepath”?)谢谢!
【问题讨论】:
标签: sockets traceroute
Ping 目标,逐渐增加 TTL 并观察“TTL 超出”响应的来源。
【讨论】:
有些应用程序不使用原始套接字,而是使用编号更高的 tcp 或 udp 端口。通过将该 tcp 端口指向已知 Web 服务器上的端口 80,您可以跟踪路由到该服务器。缺点是您需要知道目标设备上打开了哪些端口才能对其进行 tcp。
【讨论】:
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 结果中读取数据。
【讨论】: