我正在在C应用中创建一个原始以太网套接字,例如
s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
及其返回-1表示错误
我很确定它的权限问题 - 只有在UID为0(root)或具有CAP_NET_RAW
功能
我不认为将应用程序作为root合理,因此我的问题是如何将CAP_NET_RAW
功能权限添加到我的用户帐户中?
来自http://manpages.ubuntu.com/manpages/zesty/en/man7/packet.7.html
In order to create a packet socket, a process must have the CAP_NET_RAW
capability in the user namespace that governs its network namespace.
但是如何实现这一目标?
您在需要该功能而不是用户帐户的可执行文件上设置功能。语法是
setcap cap_net_raw,cap_net_admin=eip ./your_exeutable
(注意,您需要运行setCap作为root,因此请使用sudo setcap ...
也要确保cap_net_raw,cap_net_admin=eip
能够阅读所有网络数据包被认为是严重的安全风险,这就是为什么需要一个特权帐户的原因。
您可以将应用程序" suid root"作为"正常"用户启动本应用程序时提升自己的权利。但这也是一种安全风险,在设计应用程序时需要进行一些彻底的思考(它至少应该在不再需要的情况下立即放弃更高的特权 - 即打开原始插座后)。
您无法将CAP_NET_RAW
的权限添加到您的帐户中,因为Linux上的功能不关注用户。他们遵循可执行文件。
要使这项工作,您需要将CAP_NET_RAW
功能添加到汇编的可执行文件中。请参阅setcap
命令,以查看如何做。