AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 443898
Accepted
Ben S.
Ben S.
Asked: 2018-05-16 02:51:52 +0800 CST2018-05-16 02:51:52 +0800 CST 2018-05-16 02:51:52 +0800 CST

Configuração de DNS separada em cada namespace de rede

  • 772

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.confarquivos 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.confno 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!

dns namespace
  • 3 3 respostas
  • 6551 Views

3 respostas

  • Voted
  1. igal
    2018-05-16T04:00:27+08:002018-05-16T04:00:27+08:00

    Solução

    Você pode usar ip netns execwith bashem vez de usar nsenter, ou seja:

    ip netns exec [namespace name] bash
    

    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 netnspágina de manual :

    Para aplicativos que estão cientes de namespaces de rede, a convenção é procurar arquivos de configuração de rede global primeiro em **/etc/netns/**NAME/ e depois em /etc/ . Por exemplo, se você quiser uma versão diferente de /etc/resolv.conf para um namespace de rede usado para isolar sua vpn, você deve nomeá-la como /etc/netns/myvpn/resolv.conf .

    O ip netns exec automatiza o manuseio dessa configuração, convenção de arquivo para aplicativos que não reconhecem o namespace da rede, criando um namespace de montagem e vinculando a montagem de todos os arquivos de configuração do namespace por rede em seu local tradicional em /etc.

    Observe em particular a distinção entre aplicativos com reconhecimento de namespace de rede e aplicativos sem reconhecimento de namespace de rede .

    As nsenterman 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 o nsenterutilitá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.

    • 7
  2. Best Answer
    A.B
    2018-05-16T04:48:36+08:002018-05-16T04:48:36+08:00

    Basta olhar para o que está fazendo ip netns exec test ...na sua situação, usando strace.

    Excerto:

    # strace  -f ip netns exec test sleep 1 2>&1|egrep '/etc/|clone|mount|unshare'|egrep -vw '/etc/ld.so|access'
    unshare(CLONE_NEWNS)                    = 0
    mount("", "/", 0x55f2f4c2584f, MS_REC|MS_SLAVE, NULL) = 0
    umount2("/sys", MNT_DETACH)             = 0
    mount("test", "/sys", "sysfs", 0, NULL) = 0
    open("/etc/netns/test", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 5
    mount("/etc/netns/test/resolv.conf", "/etc/resolv.conf", 0x55f2f4c2584f, MS_BIND, NULL) = 0
    

    então, para reproduzir (parcialmente, por exemplo, /sysnão é tratado aqui) o que ip netns exec test ...está fazendo:

    ~# ip netns id
    
    ~# head -1 /etc/resolv.conf 
    # Generated by NetworkManager
    

    ~# nsenter --net=/var/run/netns/test unshare --mount sh -c 'mount --bind /etc/netns/test/resolv.conf /etc/resolv.conf; exec bash'

    ~# ip netns id
    test
    ~# head -1 /etc/resolv.conf 
    # For namespace test
    ~#
    

    Então está certo. nsentersozinho não é suficiente. unsharetem 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á dizendo strace.

    • 6
  3. DericS
    2021-06-09T12:38:02+08:002021-06-09T12:38:02+08:00

    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 somecomandcomando “ ” 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.confem /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 nsentercomando, ele coloca seu comando no namespace de rede de sua escolha, mas nsenternã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-netnspá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.

    • 2

relate perguntas

  • Nginx - criando um subdomínio com link para outro site (local)

  • O que é domínio raiz? [fechado]

  • Como posso resolver o nome do host para ip usando diferentes servidores DNS?

  • problema de resolução reversa do bind9

  • Como faço para verificar se estou usando 9.9.9.9 para DNS?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve