Как отправить ICMP-пакет через сокеты? - PullRequest
3 голосов
/ 12 марта 2012

Я пытаюсь отправить сообщение через пакеты ICMP, но не знаю, как это сделать.

Это код, который у меня сейчас есть, но, очевидно, не работает:

s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)
s.setsockopt(IPPROTO_IP, IP_HDRINCL, 1)
s.settimeout(3.0)
s.sendto("Hello!" + "\r\n", (server, 7))
msg = s.recvfrom(buff_size)
s.close()

Я должен получить ответ от сервера, если строка "Hello!" отправлено, но я не понимаю Я полагаю, что "Привет!" строка будет инкапсулирована в поле данных:

enter image description here

Ответы [ 2 ]

5 голосов
/ 12 марта 2012

Чтобы создать пакет ICMP, вы должны создать весь пакет самостоятельно, используя необработанный сокет. Модуль struct полезен для этого.

Во-вторых, для того, чтобы вообще использовать необработанные сокеты, вам нужно иметь разрешение на это - вы должны работать от имени пользователя root (я знаю, что это достаточное условие, но я не уверен на 100%, что это необходимое условие). Исполняемый файл ping(1) может сделать это, потому что это исполняемый файл setuid , который запускается от имени пользователя root при запуске. Поскольку сценарии не могут быть сделаны setuid в Linux, вам придется создать программу-оболочку setuid на C, которая просто выполняет ваш сценарий Python.

1 голос
/ 12 марта 2012

Я не думаю, что SOCK_RAW собирается для вас дейтаграммы ICMP только потому, что вы установили поле протокола на IPPROTO_ICMP! Вы должны построить пакет самостоятельно.

Посмотрите на источник пинга.

Есть (как минимум) два популярных пакета, которые предоставляют ping в операционных системах GNU / Linux. Один - netkit, а другой iputils. (netkit-combo - это tarball, в котором есть все утилиты netkit: telnet, FTP, ...) У парней * BSD, вероятно, есть свои.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...