在没有 root 权限的情况下更改 Linux 中的网络设置

Change network settings in Linux without root privilege

我说的设置是IP、子网掩码和默认网关(设置和获取)。为了设置所有这些,我使用 ioctl 函数以及 SIOCSIFADDRSIOCSIFNETMASK 等选项。为了获取 IP 和掩码,我使用相同的方法,但使用 SIOCGIFADDR 等选项。为了获取默认网关,我解析文件 /proc/net/route 并读取接口对应的默认网关地址。

整个过程完美无缺,但需要 root 权限。有没有什么方法可以在不给 root 用户的情况下更改这些设置?这是我无法解决的要求。像 this 问题这样更改所有权可以通过将代码放入单独的可执行文件并将该可执行文件的所有权更改为 root 然后从主应用程序调用它来解决问题。

我只想知道是否可以在不授予应用程序根访问权限的情况下更改此类设置。

我知道有两种方法:

  1. 使用 sudo 到 运行 ifconfig 并以 root 身份路由。 Sudo 可以设置为无需密码即可工作,并且仅适用于某些程序。

  2. 使用 capabilities see the answer to Is there a way for non-root processes to bind to "privileged" ports on Linux? 并使用 CAP_NET_ADMIN 代替 cap_net_bind_service。