是否可以在浏览器中进行跟踪路由?
Posted
技术标签:
【中文标题】是否可以在浏览器中进行跟踪路由?【英文标题】:Is it possible to do a traceroute in the browser? 【发布时间】:2011-01-11 18:08:26 【问题描述】:我正在寻找一种在客户端(即在浏览器中)进行跟踪路由的方法。
据我所知,不可能通过 javascript 或 Flash 发送具有任意 TTL 值的 ICMP、UDP 或 TCP 数据包。我知道 Flash 允许通过 Actionscript 中的 Socket 类进行 TCP 连接,但它似乎对 traceroute 实现没有用。
开发浏览器插件是唯一的解决方案吗?
编辑:我刚刚发现它是用 Java 小程序完成的:http://www.codefromthe70s.org/traceroute.aspx
坏消息是这个小程序需要签名代码,因为它实际上解析来自底层客户端系统的 ping 可执行文件的输出。因此,要求用户允许 Java 应用程序运行,这很麻烦。
更多信息在这里:http://www.codefromthe70s.org/traceroute_explained.aspx
如果有人可以提供帮助,我仍在寻找更简单的解决方案。
编辑 2:感谢您的回答。我想那我得用Java了。
我想知道 NaCl (http://code.google.com/p/nativeclient/) 是否会支持某种跟踪路由应用程序。
【问题讨论】:
为什么不能在小程序上签名? 我当然可以签名。只是检查是否有其他方法可以做到这一点。 【参考方案1】:有 CoNetServ(复杂网络服务)浏览器扩展。它能够直接在您的浏览器中从您的本地计算机执行跟踪路由。 https://github.com/VojtechVitek/CoNetServ/wiki
Chrome 扩展程序:https://chrome.google.com/extensions/detail/mmkpilpdijdbifpgkpdndpjlkpjkihee 火狐插件:https://addons.mozilla.org/en-US/firefox/addon/181909/
编辑: Chrome 和 Firefox 都取消了将 NPAPI 库捆绑到扩展程序/附加组件中。不幸的是,上面的方法不再起作用了。
【讨论】:
有没有其他方法可以做 CoNetServ 能够做的事情?【参考方案2】:<script type="text/javascript">
function runapp()
var domain = "10.10.35.1";
var cmdLine = "tracert" +" " + domain;
var wshShell = new ActiveXObject("WScript.Shell");
var out = wshShell.Exec(cmdLine);
var output1 = out.StdOut.ReadAll();
document.getElementById('box').innerhtml += output1;
</script>
<div id="box" align="center"></div>
<button onclick="runapp();">Click me!</button>
所以它只能在 IE 中使用,因为 ActiveX。
它将运行 traceroute 到 10.10.35.1 并将输出写入 id="box" 的 div。
【讨论】:
【参考方案3】:您无需创建小程序并对其进行签名!可以从 javascript 中使用 java。 I made a script 使用 ActiveX 或 Java 进行跟踪路由。
我在 OS X 上没有看到任何安全警告。在 Windows 和 Linux 上尝试一下,告诉我会发生什么 :-)
UPD: 似乎只适用于 Firefox
【讨论】:
【参考方案4】:可能有点晚了,但对未来的阅读可能会很有趣(比如我的 :-D)。
Java 1.5 有一个带有 isReachable 方法的 InetAdress 类,你可以试试。检查这个:
http://download.oracle.com/javase/1.5.0/docs/api/java/net/InetAddress.html#isReachable(int)
【讨论】:
不保证是实际的ICMP请求,也不能调整TTL。 0x13.de/index.php/code-snippets/74-icmp-ping-in-java.html【参考方案5】:您根本无法通过浏览器执行此操作。 Javascript 最多可以为 AJAX 请求打开到其原始服务器的连接,但只能通过 HTTP 这样做。 Flash 可以与任意主机通信,但前提是它们列在原始服务器上的 crossdomain.xml 文件中,并且只能通过 TCP。 Flash 中的 UDP 支持显然待定。
Traceroute 和 ping 都是基于 ICMP 的协议,不能通过 Flash 或 Javascript 创建/控制。它们还都需要“原始”访问来构建自定义数据包,这绝对不能在浏览器端完成。这就是为什么 'ping' 是 Unix 系统上的 'SUID' 程序,因为原始数据包访问需要 root 权限。
您最多可以做一个服务器端实现并将输出发送到浏览器。即便如此,您也很可能无法从 Unix 机器上的服务器内进程执行此操作,因为 Web 服务器不太可能以 root 身份运行。您必须执行系统 ping 和/或 traceroute 并将输出重定向回浏览器。
【讨论】:
"您根本无法通过浏览器执行此操作。" -- 使用 JNI 的签名小程序除外。我很确定运行 JNI 的签名小程序可以做任何事情。 可以用 websockets 转义 HTTP 并实现自己的 ICMP 协议解析器吗?【参考方案6】:你为什么不只是签署小程序?问题其实不是更多你不知道如何签署小程序吗?如果是这样,那么从这里开始:jarsigner。 Here 是一个更清晰的教程。
实际上没有比实际上在客户端机器上运行一些代码和/或命令更简单/更好的解决方案了。 traceroute 确实必须源自客户端计算机。
由于安全限制,Javascript 和 Actionscript 无法执行此操作。它们仅存在于网页上下文中。 Silverlight 可能能够做到,但不要把我钉在那个上面。我不做 NET 的东西。
【讨论】:
不是我不知道怎么做,而是感谢教程链接。由于浏览器安全模型,我只想确认这在 JS/ActionScript 中是不可能的。 我希望一个签名的 java 小程序能够发送 ICMP 数据包,但经过一番谷歌搜索,它实际上看起来像 java 仅原生支持 TCP/UDP?我想它仍然可以通过 JNI 实现。【参考方案7】:如何在服务器上执行 traceroute 并通过某种 ajax 调用返回结果
【讨论】:
因为重点是从客户端IP而不是服务器IP进行traceroute。 @Franck:路线通常是对称的,所以大部分时间都可以。【参考方案8】:嗯...不,因为安全模型。
您可能可以在带有插件的特定浏览器中执行此操作,但不能使用任何广泛可用的任意浏览器。
我想在这里被证明是错误的。
【讨论】:
以上是关于是否可以在浏览器中进行跟踪路由?的主要内容,如果未能解决你的问题,请参考以下文章