Как можно запустить программу, подобную traceroute, без привилегий root?

Я видел другую программу, предоставляющую в ней функциональность traceroute, но без привилегий root (суперпользователя)? Я всегда предполагал, что необработанные сокеты должны быть корневыми, но есть ли другой способ? (Кажется, кто-то упомянул «supertrace» или «tracepath»?) Спасибо!


person brian    schedule 16.09.2008    source источник


Ответы (5)


Пропингуйте цель, постепенно увеличивая TTL и наблюдая, откуда берутся ответы «TTL превышен».

person moonshadow    schedule 16.09.2008
comment
Именно это и делает traceroute. - person Ferruccio; 17.09.2008
comment
Как увеличить TTL без использования необработанных сокетов в C? - person brian; 17.09.2008
comment
Вам не нужны необработанные сокеты для проверки связи или установки параметров. Насколько точно вы это сделаете, будет зависеть от вашей целевой платформы. См. msdn.microsoft.com/en-us/library. / для .net, например. - person moonshadow; 19.09.2008
comment
Работал как шарм для меня. Спасибо. - person andyb; 01.09.2017

Вместо того, чтобы использовать необработанные сокеты, некоторые приложения используют порт tcp или udp с более высоким номером. Направив этот tcp-порт на порт 80 на известном веб-сервере, вы можете проследить маршрут до этого сервера. Недостатком является то, что вам нужно знать, какие порты открыты на целевом устройстве, чтобы подключить его.

person akraut    schedule 16.09.2008
comment
Я попытался найти единственный инструмент, который делал это без рута. Я не смог. У вас есть пример, которому не нужен root, где я могу проследить путь, скажем, до google.com? - person Ole Tange; 05.10.2015

ping и traceroute используют протокол ICMP. Подобно UDP и TCP, это доступно через обычный API сокетов. Только номера портов UDP и TCP менее 1024 защищены от использования, кроме как пользователем root. ICMP свободно доступен для всех пользователей.

Если вы действительно хотите увидеть, как работают ping и traceroute, вы можете загрузить пример реализации кода C для них с КодПрожект.

Короче говоря, они просто открывают сокет ICMP, а traceroute изменяет приращение TTL, используя setsockopt, пока цель не будет достигнута.

person Andrew Johnson    schedule 16.09.2008

Вам не нужно использовать необработанные сокеты для отправки и получения пакетов ICMP. По крайней мере, не в Windows.

person Ferruccio    schedule 16.09.2008
comment
Как насчет пакетов с пользовательским TTL? - person brian; 17.09.2008
comment
99,99% неправильно. Вам ДЕЙСТВИТЕЛЬНО нужны необработанные сокеты для подделки и отправки сообщений ICMP, но есть исключение для сообщений эхо-запросов ICMP в некоторых системах Linux, которые отключены по умолчанию, что делает вас не на 100% неверным. - person jean-loup; 02.02.2015
comment
@jean-loup - я основывал свой комментарий на системе мониторинга сети, над которой я работал несколько лет назад, в которой реализован внутренний протокол ICMP, чтобы следить за серверами. Он не использовал необработанные сокеты. Это было почти десять лет назад, так что, возможно, что-то изменилось. Также имейте в виду, что не все версии Windows фактически поддерживают необработанные сокеты. Я не помню, когда Microsoft действительно включила их, но они отключили их в XP SP2 из соображений безопасности. Я не знаю, что они делали с тех пор. - person Ferruccio; 02.02.2015

Если у вас современный дистрибутив Linux, вы можете посмотреть в источнике traceroute (или tracepath, появившийся до того, как traceroute потерял setuid) и tcptraceroute. Ни одному из них не требуются сокеты RAW — проверено на Fedora 9, они не setuid и работают с параметрами по умолчанию для обычного пользователя.

Использование кода, который делает tcptraceroute, может быть esp. полезно, поскольку пакеты ICMP на адрес не обязательно заканчиваются в том же месте, что и TCP-соединение, например, с портом 80.

Выполнение трассировки 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.

person James Antill    schedule 16.09.2008
comment
Исходный код traceroute.c предполагает, что пользователь является пользователем root, чтобы переписать TTL пакета — если вы посмотрите на свой дистрибутив, traceroute, скорее всего, имеет root-права setuid. - person brian; 17.09.2008