Почему я не могу создать сырой сокет в Ubuntu? - PullRequest
5 голосов
/ 26 июля 2011

Я учусь работать с необработанными сокетами в Linux. Я пытаюсь создать сокет так:

if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) {
    perror("socket() failed");
    exit(-1);
}

Но все, что я получил после запуска:

сокет () не выполнен: операция не разрешена

Я знаю, что только root может создавать необработанные сокеты, но если я запускаю его с битом SUID или sudo - проблема та же. В чем дело? Система Ubuntu 11.04.

Может быть, я включаю ненужные заголовки?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <netdb.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>

И мне интересно - почему SUID бесполезен?

Ответы [ 3 ]

14 голосов
/ 26 июля 2011

Мои деньги на том, что вы неправильно выполняете свой код.

Я скопировал и вставил ваш точный код в пустой main().Я получаю ту же ошибку, если запускаю ее как сам, но она работает правильно под sudo.Это на Ubuntu.

Код:

#include <sys/socket.h>
#include <netinet/in.h>

int main()
{ 
  int sd;
  if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) {
    perror("socket() failed");
    return -1;
  }
  return 0;
} 

Запуск от имени самого себя:

aix@aix:~$ ./a.out 
socket() failed: Operation not permitted
aix@aix:~$

Запуск от имени пользователя root:

aix@aix:~$ sudo ./a.out 
aix@aix:~$
9 голосов
/ 26 июля 2011

в соответствии с man: только процессам с эффективным идентификатором пользователя 0 или возможностью CAP_NET_RAW разрешено открывать необработанные сокеты

Таким образом, вы можете запустить ваше приложение с помощью sudo, как было предложено ниже, или установить для него возможность CAP_NET_RAW(на самом деле вам также понадобится CAP_NET_ADMIN):

# setcap cap_net_raw,cap_net_admin=eip PATH_TO_YOUR_APPLICATION

Подробности можно найти на http://ftp.kernel.org/pub/linux/libs/security/linux-privs/kernel-2.4/capfaq-0.2.txt

0 голосов
/ 26 июля 2011

Заголовок никак не повлияет на него.

Даже если вы добавите несколько ненужных файлов, это не повлияет на работу программы.

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