我正在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
但是如何实现这一目标呢?
答案 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