【问题标题】:How is it possible to run a traceroute-like program without needing root privileges?如何在不需要 root 权限的情况下运行类似 traceroute 的程序?
【发布时间】:2010-09-09 18:30:47
【问题描述】:

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

【问题讨论】:

    标签: sockets traceroute


    【解决方案1】:

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

    【讨论】:

    • 这实际上是 traceroute 所做的。
    • 如何在不使用 C 语言的原始套接字的情况下增加 TTL?
    • 您不需要原始套接字来执行 ping 或设置选项。你做它的精确程度取决于你的目标平台。例如,.net 参见msdn.microsoft.com/en-us/library/…
    • 对我来说就像一个魅力。谢谢。
    【解决方案2】:

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

    【讨论】:

    • 我已经尝试找到一个无需 root 即可执行此操作的工具。我无法做到。您是否有一个不需要 root 的示例,我可以在其中跟踪路由到 google.com?
    【解决方案3】:

    pingtraceroute 使用 ICMP 协议。与 UDP 和 TCP 一样,这可以通过普通的套接字 API 访问。只有小于 1024 的 UDP 和 TCP 端口号受到保护,不能被 root 使用。所有用户均可免费使用 ICMP。

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 带有自定义 TTL 的数据包呢?
      • 99.99% 错误。您确实需要原始套接字来伪造和发送 ICMP 消息,但在某些默认禁用的 Linux 系统上,ICMP 回显请求消息有一个例外,这不会让您 100% 出错。
      • @jean-loup - 我的评论基于我多年前工作的一个网络监控系统,该系统在内部实施了 ICMP 以监控服务器。它没有使用原始套接字。这几乎是十年前的事了,所以事情可能已经改变了。另请记住,并非所有版本的 Windows 实际上都支持原始套接字。我不记得微软何时真正启用它们,但出于安全考虑,他们确实在 XP SP2 中禁用了它们。我不知道他们从那以后做了什么。
      【解决方案5】:

      如果你有一个现代 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 结果中读取数据。

      【讨论】:

      • traceroute.c 的源代码希望用户是 root 以便重写数据包的 TTL - 如果您查看您的发行版 traceroute 很可能是 setuid root。
      猜你喜欢
      • 2021-03-24
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      相关资源
      最近更新 更多