Linux Raw Socket权限问题

时间:2017-09-28 10:11:14

标签: c linux sockets

我正在C应用程序中创建一个原始的以太网套接字,例如

s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

并返回-1表示错误

我很确定它是一个权限问题 - 如果您的UID为0(root)或具有CAP_NET_RAW功能

,则只能打开原始套接字

我不认为以root身份运行应用程序是合理的,因此我的问题是如何将'{1}}功能权限添加到我的用户帐户?

来自http://manpages.ubuntu.com/manpages/zesty/en/man7/packet.7.html

CAP_NET_RAW

但是如何实现这一目标呢?

3 个答案:

答案 0 :(得分:3)

能够读取所有网络数据包被认为是一个严重的安全风险,这就是为什么这需要一个特权帐户。

你可以使应用程序" suid root"在启动此应用程序时提升您自己的权利作为"正常"用户。但这也是一个安全风险,在设计应用程序时需要一些彻底的思考(一旦它不再需要它,它至少应该放弃更高的特权 - 即在打开原始套接字之后)。

答案 1 :(得分:1)

您无法向帐户添加CAP_NET_RAW权限,因为Linux上的功能不会跟随用户。他们遵循可执行文件。

要使其工作,您需要将CAP_NET_RAW功能添加到已编译的可执行文件中。请参阅setcap命令以了解如何执行此操作。

答案 2 :(得分:1)

您可以在需要该功能的可执行文件上设置功能,而不是用户帐户。语法是

setcap cap_net_raw,cap_net_admin=eip ./your_exeutable

(注意,您需要以root身份运行setcap,因此请使用sudo setcap ...同时确保cap_net_raw,cap_net_admin=eip

中没有空格字符