原始套接字访问作为正常用户在Linux 2.4上

在一个embedded式系统(2.4内核)中,我需要一个原始套接字从一个以root身份运行的进程访问eth0接口。

我尝试通过从命令行设置CAP_NET_RAWfunction并使用cap_set_proc()以编程方式解决此问题,但都没有成功。 看来我没有权限这样做,在程序中我得到一个EPERM错误,在命令行上

无法在进程“1586”上设置上限:(操作不允许)

有没有更简单的方法来做我想要的? 如果不是,则成功设置CAP_NET_RAWfunction需要执行哪些步骤?

编辑:我有根访问,但作为根永久运行的过程是没有select。 libcap的版本是1.10,没有“setcap”二进制文件,而是“setpcaps”。

编辑 – 回答George Skoptsov:

如果我弄明白了,你的build议是用setuid启动一个进程,然后设置CAP_NET_RAWfunction,然后删除权限。 我用下面的代码尝试了这个,但是它似乎不起作用,即使caps命令不返回错误。 随着seteuid()注释掉,原始访问工作,但只是因为该进程作为根运行,那么:

cap_t caps = cap_get_proc(); cap_value_t cap_list[1]; cap_list[0] = CAP_NET_RAW; if (cap_set_flag(caps, CAP_EFFECTIVE, 1, cap_list, CAP_SET) == -1) { printf("cap_set_flag error"); } if (cap_set_proc(caps) == -1) { printf("cap_set_proc error"); } if (seteuid(getuid()) != 0) { printf("seteuid error"); } function_that_needs_raw_access(); 

谢谢你的帮助。 克里斯

Solutions Collecting From Web of "原始套接字访问作为正常用户在Linux 2.4上"

通常,您需要 root权限才能在接口上接收原始数据包。 此限制是安全防范措施,因为接收原始数据包的进程可以访问使用该接口的所有其他进程和用户的通信。

但是,如果您有权访问计算机上的root用户,那么即使以非root用户身份执行进程 ,也可以使用setuid标志为进程提供root权限。

首先,确保以root用户身份运行进程时,此功能已成功设置。 然后使用

 sudo chown root process sudo chmod ugo+s process 

将root设置为进程的所有者并设置setuid标志。 然后检查该进程是否由其他用户运行时设置的功能。 由于此过程现在具有所有超级用户权限,因此应遵守安全防范措施,并在代码不再需要时立即删除权限(启用CAP_NET_RAW后)。

你可以按照这个方法来确保你正确地放下它们。

该进程必须以root身份运行,或对可执行文件具有CAP_NET_RAW功能。

为了设置CAP_NET_RAW,您需要以root身份运行setcap命令。 一旦设置,你就可以作为另一个用户运行可执行文件,并且可以访问原始数据包捕获。

如果您无权访问根访问权限,也无法获得具有root权限的任何人对可执行文件设置CAP_NET_RAW或setuid root的权限,那么您将无法以非root用户身份执行数据包捕获。

您可以为可执行程序提供使用CAP_NET_RAW权限而不赋予其他root权限的能力。

 $ setcap cap_net_raw=pe *program* 

没有这个特权,你不能给这个特权。 当然,root可以赋予程序这个特权。

TL; DR恕我直言不支持内核<3.0。

有关于在netdev内核邮件列表中支持它的讨论: https ://lwn.net/Articles/420800/和https://lwn.net/Articles/420801/

并将其包含在内核3.0中发布的提交c319b4d76b9e583a5d88d6bf190e079c4e43213d中:

 commit c319b4d76b9e583a5d88d6bf190e079c4e43213d Author: Vasiliy Kulikov <segoon@openwall.com> Date: Fri May 13 10:01:00 2011 +0000 net: ipv4: add IPPROTO_ICMP socket kind Follows: v2.6.39-rc2 Precedes: v3.0-rc1 

在没有CAP_NET_RAW的情况下运行ping(即没有设置功能或没有set-uid)在版本87dbb3a5db657d5eae6934707beaf0507980a1c3中的 ping中实现 ,在iputils s20150815中发布:

 commit 87dbb3a5db657d5eae6934707beaf0507980a1c3 Author: Nikos Mavrogiannopoulos <nmav@redhat.com> Date: Fri May 29 11:01:00 2015 +0200 This patch allows running ping and ping6 without root privileges on kernels that support it. Almost identical to Lorenzo Colitti's original patch except: ... Follows: s20140519 Precedes: s20150815