Как можно запустить программу, похожую на traceroute, без необходимости получения привилегий root? - PullRequest
2 голосов
/ 17 сентября 2008

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

Ответы [ 5 ]

3 голосов
/ 17 сентября 2008

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

1 голос
/ 17 сентября 2008

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

0 голосов
/ 17 сентября 2008

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

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

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

0 голосов
/ 17 сентября 2008

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

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

Выполнение трассировки трассировки (как обычного пользователя) показывает, что она выполняет что-то вроде:


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.

0 голосов
/ 17 сентября 2008

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

...