Выяснилось, что дело в конструкции socket(AF_INET, SOCK_RAW, IPPROTO_ICMP). Оказывается, непривилегированным пользователям не позволено открывать raw-сокеты. Сделано это, как я понял, из соображений безопасности: raw-сокеты относятся к третьему уровню модели OSI, и могут ничего не знать о портах и прочих прелестях TCP, UDP и т.д., отдавая обработку IP-пакетов целиком на откуп программисту.
Однако возникает закономерный вопрос: команда ping же как-то работает без sudo. Подобное поведение возможно благодаря хитрым правам, розданным файлу /bin/ping. Если у нас есть файл /home/huh-muh/myprog, и мы хотим сделать его таким же крутым, этого можно достигнуть двумя путями.
1. Выполнить последовательность команд:
# chown root:root /home/huh-muh/myprog # chgrp u+s /home/huh-muh/myprog
2. Либо воспользовавшись capabilites:
#filecap /home/huh-muh/myprog net_raw net_admin
или
#setcap cap_net_raw,cap_net_admin=eip /home/huh-muh/myprog
Посмотреть, какие права даны программе, можно командой:
#getcap /home/huh-muh/myprog