Enviando dados para uma interface de toque do Linux sem usar o sudo

0

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 somente 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 estar 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.

Eu olhei em namespaces de rede (entre outros itens). AFAIK, isso não vai ajudar, mas eu permito que isso seja corrigido.

Esta pode ser uma variação desta questão, mas que infelizmente ainda não foi respondida: Tap interface não está recebendo pacotes

    
por user1738833 19.12.2017 / 10:50

1 resposta

0

Esta é uma tarefa para namespaces de usuário e rede, sujeita à chamada de configuração do kernel unshare -Urn executará o programa (por padrão, o shell) com um namespace de rede privada onde interface de rede virtual pode ser criada como se fosse root em um máquina.

    
por 21.08.2018 / 18:29