我正在尝试为我的网络脚本设置单元测试。由于单元测试是由非 root 用户(通常是“jenkins”)运行,因此我希望能够设置一个可由 jenkins 使用的网络接口,以测试从我的网络发送的数据包脚本。我正在测试的程序在“混杂”模式下使用网络接口,并最终作为 Linux 服务在 root 用户下运行。但是,我希望在不需要 root 登录或交互式输入的情况下测试功能单元 - jenkins“用户”不是系统上的交互式用户。
我可以通过以下方式设置 Tap 接口(CentOS 7.x):
sudo ip tuntap add tap0 mode tap user jenkins
sudo ifconfig tap0 promisc up
这会弹出一个界面,我可以使用 看到该界面ifconfig
,但它不是“正在运行”。
我可以通过使用运行我的程序来向它发送数据sudo XXXX
,所以我的程序按预期工作。但是,如果我通过 jenkins 帐户运行程序,数据包不会通过 - 我可以暂时将 jenkins 用户帐户切换为“交互式”来尝试此操作。我正在使用 Wireshark 查看此接口上的吞吐量。
我已经使用我自己的用户帐户和其他帐户尝试过此操作,但只有根帐户有效。
我觉得我可以使用一些命令行调用来允许非根用户使用(私有的、用户拥有的)网络接口,但我什么也找不到。
我可以sudo
可能会使用和/或 suid ( ) 权限来设计一个系统chmod 4755 XXX
,该权限允许单元测试以 root 权限运行,但似乎我应该能够运行自动化测试,而不必经历这个有点曲折的过程。
有谁知道我如何使用用户帐户的点击界面?
注意:最终,我的程序使用libpcap
'spcap_inject
将数据包注入接口。
另外,我可以作为非根用户将数据包注入到我的真实网络接口上,这可以工作,但是让我的数据包(可能是错误的)松散到真实网络上有点危险。用户可以使用真实的界面,但不能使用“点击”界面进行测试,这似乎是不协调的。
我研究了网络命名空间(以及其他项目)。 AFAIK,这不会有帮助,但我允许对此进行纠正。
这可能是这个问题的一个变体,但遗憾的是,尚未得到回答:Tap 接口未接收数据包
答案1
这是针对用户和网络名称空间的任务,根据内核配置调用unshare -Urn
将使用专用网络名称空间运行程序(默认情况下为 shell),可以在其中创建虚拟网络接口,就像它是单独计算机上的 root 一样。