Configurei vários namespaces de rede em meu sistema Linux (kernel versão 3.10) e agora desejo configurar cada namespace de rede para ter suas próprias configurações de DNS.
Criei resolv.conf
arquivos em cada /etc/netns/[namespace]
diretório, e agora quero fazer meu sistema funcionar da seguinte forma:
Na linha de comando bash, sempre que entro no contexto de um namespace de rede específico com nsenter --net=/run/netns/[namespace name]
, desejo que todos os processos iniciados na linha de comando (como nslookup, ping) sejam executados com as configurações de DNS que configurei com o /etc/netns/[namespace name]/resolv.conf
.
Se eu executar meus comandos assim:
"ip netns exec [namespace name] [command]"
então as configurações de DNS do namespace se aplicam.
No entanto, ao executar os comandos sem "ip netns exec", as configurações de DNS são obtidas de /etc/resolv.conf
, embora a execução de "netns get cur" indique que o contexto está definido para o namespace de rede desejado.
Tentei fazer mount --bind /etc/netns/[namespace name]/resolv.conf /etc/resolv.conf
no contexto do namespace de rede apropriado, mas isso aplica a montagem em todo o sistema, e não apenas no contexto desse namespace de rede.
Suspeitei que o uso de namespaces de montagem pode ajudar, então tentei ler a página de manual dos namespaces de montagem, mas não consegui entender nada no pouco tempo que dediquei a isso.
Existe uma maneira fácil e elegante de atingir esse objetivo?
Qualquer ajuda/orientação para a solução será muito apreciada!
Solução
Você pode usar
ip netns exec
withbash
em vez de usarnsenter
, ou seja:Isso permitirá que você entre em uma sessão de shell interativa onde os arquivos de configuração de rede específicos do namespace são automaticamente montados em seus locais padrão (globais) (sem afetar outras sessões).
Explicação
O seguinte é retirado da
ip netns
página de manual :Observe em particular a distinção entre aplicativos com reconhecimento de namespace de rede e aplicativos sem reconhecimento de namespace de rede .
As
nsenter
man pages , por outro lado, parecem não mencionar essa distinção (em particular, procurei pelas strings "aware", "resolv", ".conf" e "/etc" e não encontrei resultados). Isso parece sugerir que onsenter
utilitário não executa o mesmo tipo de manipulação automática de aplicativos que não reconhecem namespace.Comentários adicionais
Além de Network Namespaces , você também pode querer olhar para User Namespaces e Mount Namespaces . E se você deseja mais isolamento além do DNS, também pode considerar a conteinerização, por exemplo, LXC Containers , Docker ou até mesmo uma VM completa.
Basta olhar para o que está fazendo
ip netns exec test ...
na sua situação, usandostrace
.Excerto:
então, para reproduzir (parcialmente, por exemplo,
/sys
não é tratado aqui) o queip netns exec test ...
está fazendo:~# nsenter --net=/var/run/netns/test unshare --mount sh -c 'mount --bind /etc/netns/test/resolv.conf /etc/resolv.conf; exec bash'
Então está certo.
nsenter
sozinho não é suficiente.unshare
tem que ser usado, para mudar para um namespace de montagem recém-criado (baseando este novo em uma cópia do anterior) e alterá-lo, e não apenas usando textualmente um já existente, uma vez que ainda não existe nenhum que se encaixe. Isso é o que está fazendo o syscall com o mesmo nome que está dizendostrace
.As duas primeiras respostas fornecem boas informações e respostas, mas tentarei responder de um ângulo ligeiramente diferente.
Um namespace de rede fornece um local para colocar interfaces de rede, rotas e regras de roteamento de rede e entradas de filtro de rede.
Um namespace de montagem fornece um local para colocar arquivos. Esses arquivos podem estar relacionados à rede e podem ser usados em um namespace de rede específico, mas no final são apenas arquivos.
A criação de um novo namespace de rede (por exemplo, com “
ip netns add newnetns
”) não fornece automaticamente um novo namespace de montagem.Se você usar o
ip netns exec newnetns somecomand
comando “ ” então você criará um novo processo (somecommand) usando o novo namespace de rede (newnetns que você criou anteriormente) e também obterá um novo namespace de montagem criado para este processo. Você também obterá determinados arquivos vinculados montados nesse novo namespace de montagem (por exemplo ,/etc/netns/newnetns/resolv.conf
em/etc/resolv.conf
). Agora, ao usar “ip netns exec
” esses arquivos geralmente são relacionados à rede, como resolv.conf. No entanto, mesmo que esses arquivos estejam relacionados à rede e você provavelmente os tenha criado para usar com seu novo namespace de rede, eles não farão parte de seu novo namespace de rede. Quando seu processo (somecommand) terminar, o namespace de montagem que foi criado para ele também desaparecerá (a menos que por outros meios você tenha anexado outro processo ao mesmo namespace de montagem), mas o namespace de rede permanecerá.Quando você usa o
nsenter
comando, ele coloca seu comando no namespace de rede de sua escolha, masnsenter
não cria um novo namespace de montagem como “ip netns exec
” faz.Digno de nota é que “
ip netns add newnetns
” cria um novo namespace de rede que está basicamente vazio. Você precisa adicionar interfaces ou rotas a esse novo namespace de rede. “ip netns exec
” que coloca um processo nesse namespace de rede, cria um novo namespace de montagem que é basicamente uma cópia do namespace de montagem principal (provavelmente mostrando seu sistema de arquivos principal), com apenas algumas montagens de ligação adicionadas a ele.Também digno de nota é que a
ip-netns
página do manual menciona a convenção de arquivo que será usada em nome de aplicativos que não reconhecem o namespace da rede. Isso pode dar a impressão de que há um monte de aplicativos com reconhecimento de rede que usam a convenção de arquivo./etc/netns/nsname/...
Até onde sei, esse não é o caso. De cara, não consigo pensar em nenhum outro aplicativo que use os arquivos em/etc/netns/nsname/...
, mas talvez haja.