Estou tentando configurar testes de unidade para meus scripts de rede. Como os testes de unidade são executados por um usuário não-root ("jenkins", normalmente), eu quero ser capaz de configurar uma interface de rede que possa ser usada por Jenkins apenas para testar os pacotes que estão sendo enviados da minha rede. scripts. O programa que estou testando usa a interface de rede no modo "promíscuo" e, em última análise, é executado sob o usuário root como um serviço do Linux. No entanto, quero que a unidade de funcionalidade seja testada sem exigir login raiz ou entrada interativa - O jenkins "user" não é um usuário interativo no sistema.
Eu posso configurar uma interface de toque (CentOS 7.x) da seguinte maneira:
sudo ip tuntap add tap0 mode tap user jenkins
sudo ifconfig tap0 promisc up
Isso traz uma interface, que eu posso ver usando ifconfig
, mas não é "RUNNING".
Eu posso enviar dados para ele executando meu programa usando sudo XXXX
, então meu programa está funcionando como esperado. No entanto, se eu executar o programa através da conta jenkins, os pacotes não estão passando - eu posso mudar temporariamente a conta de usuário Jenkins para ser "interativo" para tentar isso. Estou usando o Wireshark para ver a taxa de transferência nessa interface.
Eu tentei isso usando minha própria conta de usuário e outras contas, mas apenas a conta raiz funciona.
Eu sinto que há alguma invocação de linha de comando que posso usar para permitir que um usuário não-root utilize uma interface de rede (privada, de propriedade do usuário), mas não consigo encontrar nada.
Eu poderia possivelmente desenvolver um sistema usando as permissões sudo
e / ou suid ( chmod 4755 XXX
) que permitiriam que os testes de unidade fossem executados com privilégios de root, mas parece que eu deveria ser capaz de executar testes automatizados sem ter que passar por este processo um tanto tortuoso.
Alguém sabe como posso utilizar uma interface de toque de uma conta de usuário?
Nota: Por fim, meu programa usa libpcap
pcap_inject
para injetar um pacote na interface.
Além disso, posso injetar pacotes como usuário não-root na minha interface de rede real e isso funciona, mas é um pouco perigoso deixar meus pacotes (que podem estar errados) soltos na rede real. Parece incongruente que um usuário possa utilizar uma interface real, mas não utilizar uma interface "tap" para testes.
Se isso não for possível, então alguém tem uma sugestão de como testar (em uma máquina) minha injeção de pacotes de rede de outra maneira?