2010-02-01 3 views
15

Я ищу способ сделать клиентскую сторону traceroute, то есть в браузере.Возможно ли сделать traceroute в браузере?

Насколько я знаю, невозможно отправлять ICMP, UDP или TCP-пакеты с произвольными значениями TTL через Javascript или Flash. Я знаю, что Flash разрешает TCP-соединения через класс Socket в ActionScript, но это не кажется полезным для реализации traceroute.

Это единственное решение для разработки плагина для браузера?

EDIT: Я только что узнал, что это было сделано с помощью Java-апплета: http://www.codefromthe70s.org/traceroute.aspx

Плохая новость заключается в том, что этот апплет требует, чтобы быть подписан код, потому что он на самом деле разбирает вывод пинг исполняемому базовой клиентской системы. Из-за этого пользователю предлагается разрешить запуск приложения Java, что является громоздким.

Больше информации здесь: http://www.codefromthe70s.org/traceroute_explained.aspx

Я до сих пор ищу более простое решение, если кто-то может помочь.

EDIT 2: Спасибо за ваши ответы. Думаю, мне придется пойти с Java.

Интересно, будет ли NaCl (http://code.google.com/p/nativeclient/) поддерживать какое-то приложение traceroute.

+0

Почему вы не можете подписать апплет? – shylent

+0

Я могу его подписать, конечно. Просто проверьте, есть ли другие способы сделать это. – Franck

ответ

1

Вы не можете сделать это вообще из браузера. Javascript может в лучшем случае открыть соединение с исходным сервером для запросов AJAX, но может делать это только через HTTP. Flash может разговаривать с произвольными хостами, но только если они указаны в файле crossdomain.xml на исходном сервере и снова только через TCP. Поддержка UDP во Flash, по-видимому, ожидается.

Traceroute и ping являются протоколами на основе протокола ICMP и не могут быть созданы/управляются с Flash или Javascript. Они также требуют «сырого» доступа для создания пользовательских пакетов, и это определенно не может быть сделано на стороне браузера.Вот почему «ping» - это программа «SUID» в Unix-системах, поскольку для доступа к пакетному доступу требуются привилегии root.

В лучшем случае вы можете выполнить реализацию на стороне сервера и получить вывод, отправленный в браузер. И даже тогда вы, скорее всего, не смогли бы сделать это из процесса на сервере в окне Unix, поскольку веб-сервер вряд ли будет работать от имени root. Вам нужно будет выполнить ping системы и/или traceroute и перенаправить вывод обратно в браузер.

+1

«Вы не можете сделать это вообще из браузера». - за исключением подписанного апплета с использованием JNI. Я уверен, что подписанный апплет JNI может делать буквально все. –

1

Хм ... нет, из-за модели безопасности.

Хотелось бы, чтобы мне было неправильно.

0

Как о выполнении трассировки на сервере и возвращает результат с somekind Аякса вызова

+1

Потому что нужно сделать traceroute с IP-адреса клиента, а не с IP-адреса сервера. – Franck

+0

@Franck: маршрут * обычно * симметричный, поэтому это может работать большую часть времени. –

5

Почему вы не просто подписать апплет? Разве проблема не в том, что вы еще не знаете, как подписать апплет? Если да, тогда начинайте здесь: jarsigner. Here - более понятный учебник.

На самом деле на самом деле нет более простого/лучшего решения, чем Фактически запускает часть кода и/или команд на клиентской машине. Traceroute действительно должен возникнуть на клиентской машине.

Javascript и Actionscript не могут этого сделать из-за ограничений безопасности. Они живут только в контексте веб-страницы. Silverlight, возможно, сможет это сделать, но не прикасайтесь ко мне. Я не делаю NET.

+0

Это не то, что я не знаю, как это сделать, но спасибо за ссылку на учебник. Я только хотел получить подтверждение, что это невозможно в JS/ActionScript из-за модели безопасности браузера. – Franck

+0

Я ожидал, что подписанный java-апплет сможет отправлять ICMP-пакеты, но после некоторого поиска в Google, на самом деле он выглядит как Java только изначально поддерживает TCP/UDP? Я полагаю, что это возможно через JNI. –

3

Расширение браузера CoNetServ (Комплексные сетевые службы). Он способен делать traceroute с вашей локальной машины прямо в вашем браузере. http://wiki.github.com/VojtechVitek/CoNetServ/

Chrome расширение: https://chrome.google.com/extensions/detail/mmkpilpdijdbifpgkpdndpjlkpjkihee Firefox дополнение: https://addons.mozilla.org/en-US/firefox/addon/181909/


EDIT:Оба Chrome и Firefox отозваны пакетирование библиотеки NPAPI в расширения/дополнения. К сожалению, вышеупомянутое больше не будет работать.

+1

Есть ли какая-либо альтернатива, чтобы сделать то, что мог сделать CoNetServ? –

0

Возможно, немного поздно, но может быть интересно для будущих чтений (например, мое: -D).

Java 1.5 имеет класс InetAdress с методом isReachable, который вы можете попробовать. Проверьте это:

http://download.oracle.com/javase/1.5.0/docs/api/java/net/InetAddress.html#isReachable(int)

+1

Не гарантируется, что он является фактическим запросом ICMP, и вы не можете настроить TTL. http://www.0x13.de/index.php/code-snippets/74-icmp-ping-in-java.html –

0

Вам не нужно, чтобы создать апплет и подписать его! Можно использовать java из javascript. I made a script для выполнения traceroute с ActiveX или Java.

Я не вижу каких-либо предупреждений системы безопасности на OS X. Попробуйте на Windows, и Linux, и скажите мне, что происходит :-)

UPD: кажется, что он работает только в Firefox

0
<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 и записывать вывод в div с id = "box".

Смежные вопросы