/etc/resolv.conf não é suficiente ?! Eu preciso usar um DNS diferente para cada conexão ISP no linux do CentOS

1

O PROBLEMA

Eu tenho várias conexões de internet em uma máquina linux, quero que cada conexão com a internet use um servidor de nomes DNS específico. /etc/resolv.conf é um problema, pois usa um servidor de nomes global para todas as conexões de internet abertas.

Por favor, note que as conexões estão todas abertas e sendo usadas ao mesmo tempo.

O QUE PRECISO?

Uma maneira de dizer ao Linux o seguinte:

Use o servidor de nomes DNS A para conexão com a Internet 1

Use o servidor de nomes DNS B para conexão com a Internet 2

Use o servidor de nomes DNS C para conexão com a Internet 3

O problema é que /etc/resolv.conf usa o mesmo servidor de nomes para todas as conecções.

O requisito exato acima eu tenho que manter.

Desde o aplicativo, estou trabalhando no desempenho do provedor de medidas e no tempo de resposta do DNS.

Usar o OpenDNS não me fará bem.

Quanto ao DHCP, eu já estou obtendo DNS automaticamente do ISP, mas apenas os últimos servidores DNS estão sendo usados no resolve.conf sobrescrevendo os servidores de nomes anteriores.

Preciso de ajuda.

    
por Basil A 08.08.2009 / 13:58

9 respostas

13

Essencialmente, você tem dois problemas:

  1. comportamento do resolvedor padrão
  2. roteamento de pacotes

O primeiro é relativamente fácil de resolver se você desenvolver seu próprio código de teste. Os programas de usuário final quase sempre acabam usando libresolv e é a função res_init() que é responsável pela leitura de /etc/resolv.conf e pela configuração dos servidores DNS para consultas subsequentes por esse programa. É muito fácil redefinir explicitamente os servidores DNS em uma instância por programa em seu próprio código.

O segundo problema requer alterações no nível da rede. É provável que você tenha três rotas padrão e nenhuma entrada de tabela de roteamento específica para cada ISP. Você precisa descobrir em qual sub-rede estão os servidores de nomes de seus três ISPs e, em seguida, adicionar uma rota a essa sub-rede que force o tráfego a sair pelo provedor certo.

Por exemplo, se um ISP estiver usando 192.168.1.1 como um servidor DNS, será necessário:

  # route add -net 192.168.1.0/24 gw w.x.y.z

em que w.x.y.z é o endereço do próximo salto voltado para esse ISP em particular.

Note que tudo isso seria um lote mais simples se você não tentasse testar três ISPs ao mesmo tempo da mesma máquina!

Eu fiz testes em massa de servidores DNS e os rejeitei tentando fazer isso com eles todos conectados de uma só vez - é muito mais fácil fazer um de cada vez.

    
por 08.08.2009 / 15:45
4

Por que não usar dig para realizar seu teste?

Seria muito mais fácil:

#using local resolver (with cache)
dig +noall +stats www.google.com | grep ";; Query time"
;; Query time: 3 msec

#using opendns
dig +noall +stats google.com @208.67.222.222 | grep ";; Query time" 
;; Query time: 28 msec

#using my isp dns
dig +noall +stats google.com @212.27.40.240  | grep ";; Query time" 
;; Query time: 20 msec
    
por 08.08.2009 / 15:32
3

Normalmente, a decisão de roteamento de "qual rota usar / qual ISP enviar uma conexão via" é feita com base no endereço IP de destino. Você não tem um endereço IP de destino até fazer uma solicitação de DNS para mapear o nome do host de destino para um endereço IP de destino.

Se a sua configuração não for "típica", você precisa fornecer mais detalhes.

Até lá, você tem uma situação de galinha / ovo. Você não pode decidir qual servidor DNS usar até que você saiba qual ISP você vai usar, e (exceto algo especial que você ainda não descreveu aqui) você não sabe o que o ISP estará usando até você executou a pesquisa de DNS e obteve o endereço IP de destino.

Você menciona que está trabalhando em um aplicativo para medir o desempenho do provedor e o tempo de resposta do DNS. Sua aposta menos complexa pode ser monitorar um ISP de cada vez.

Mais detalhes de você podem permitir respostas mais detalhadas e relevantes.

    
por 08.08.2009 / 15:36
0

Não faria mais sentido usar o DHCP do ISP e obter automaticamente os servidores DNS dessa maneira, em vez de codificá-los?

    
por 08.08.2009 / 14:03
0

Como alternativa, você pode até mesmo ignorar os servidores DNS do seu provedor de Internet e usar o OpenDNS (a menos que seu ISP seja tolo o suficiente para bloquear solicitações de DNS para servidores DNS externos).

    
por 08.08.2009 / 14:27
0

Talvez o resolvconf ou o openresolv seja o que você está procurando:

por 08.08.2009 / 15:30
0

Eu acho que Benoit lhe deu a resposta certa. Você não deve tentar resolver este problema no CentOS. Se você escrever um aplicativo para medir os desempenhos da conexão com a Internet, então este aplicativo deve escolher o servidor DNS (e não o próprio CentOS).

Se você usa o dig para o teste de desempenho ou o faz diretamente em seu aplicativo, você decide. Mas, de qualquer forma, você pode especificar diretamente o servidor DNS que você deseja executar.

Outra questão em aberto é: como você faz a modelagem de tráfego e o roteamento? Esses são apenas estáticos?

    
por 08.08.2009 / 15:44
0

Você pode tentar colocar linhas DNS como as seguintes em seus arquivos / etc / sysconfig / network-scripts / ifcfg-eth {0,1,2}. Eu não tenho certeza de que isso realmente vai conseguir o que você quer no entanto.

# Networking Interface
DEVICE=eth0
BOOTPROTO=static
HWADDR=00:11:22:33:44:55
ONBOOT=yes
IPADDR=10.10.10.100
NETMASK=255.255.255.0
DNS1=10.10.10.1
DNS2=10.10.10.2
    
por 08.08.2009 / 19:02
0

Aqui está o que eu faria.

1) Configure cada ISP em uma NIC separada. Isso permite um roteamento mais fácil.

2) Configure as rotas estáticas que forçam as consultas aos servidores dns do isp A a usarem a interface / gateway do isp. Repita para os outros isps (os dns de B através da interface b, etc).

3) Use cavar o teste dos servidores dns. As rotas que você adicionou devem garantir que as consultas saiam da interface correta para o isp correto.

    
por 09.08.2009 / 05:08