Vários uplinks de DHCP - Como ignorar o DNS e a rota padrão em todos, exceto um?

1

Uma caixa multi-homed precisa de mais de um uplink para ser configurado para DHCP. Ele precisa ignorar a rota padrão e o DNS para todos, exceto um uplink do DHCP.

Existe uma questão semelhante aqui [ arquivo de interfaces da Debian - ignorar gateway e entradas de DNS do dhcp ], mas as respostas lá não não resolve meu problema:

  • Editar a configuração do cliente DHCP global (/etc/dhcp[3]/dhclient.conf) resultaria na rota padrão e no DNS sendo ignorado nos all uplinks do DHCP.
  • A sugestão de ifmetric lida apenas com a rota, não com o DNS.

Além disso, espero que as coisas tenham mudado desde 2009.

Note que estou falando de sistemas embarcados sem cabeça. O NetworkManager não é uma opção.

A solução preferida seria /etc/network/interfaces{.d/} apenas. Eu estou procurando por algo assim:

auto  eth0
iface eth0 inet dhcp

auto  eth1
iface eth1 inet dhcp
    ignore-dhcp-option routers domain-name-servers domain-name

Adendo:

Temos dezenas dessas caixas instaladas em vários ambientes. As redes não estão sob nosso controle. Em alguns casos, as caixas precisam fazer o DHCP em mais de uma interface. Rota padrão e DNS geralmente não são conhecidos por nós de antemão, e mesmo se fossem eles podem mudar ao longo do tempo sem aviso prévio. Portanto, não podemos configurá-los estaticamente, mas devemos configurá-los por meio do cliente DHCP 'principal'.

    
por Nils Toedtmann 11.03.2015 / 22:35

4 respostas

0

(Ainda estou interessado em soluções que só tocam /etc/network/interfaces{,.d/} , mas não /etc/dhcp/ . Na ausência de tais soluções, eu uso este.)

Em /etc/dhcp*/dhclient.conf , remova as opções routers, domain-name-servers, domain-name, domain-search da declaração global request . Em seguida, adicione isso (assumindo que eth0 é o dispositivo em que a rota padrão e o DNS não serão não ignorados):

interface "eth0" {
    also request routers, domain-name-servers, domain-name, domain-search;
}

Essa solução funciona pelo menos para a versão 4.2.2.dfsg.1-5 + deb70u8 do isc-dhcp-client, já que ela é fornecida com o Debian 7. Suponho que ela também funciona para versões posteriores.

Editar:

  • Confirmado que a ideia original funciona com pequenas alterações ( eth0 deve ser cotado e deve ser request , não required )
  • Especificou a versão do dlclient que isso funciona para
por 11.03.2015 / 23:00
2

Em vez de usar inet dhcp , você pode usar inet manual para, em seguida, especificar sua própria chamada dhclient para a qual pode passar um arquivo dhclient.conf personalizado (observe o argumento -cf <file> ):

iface eth0 inet manual
    up /sbin/dhclient -4 -v -pf /run/dhclient.${IFACE}.pid \
        -lf /var/lib/dhcp/dhclient.${IFACE}.leases -I \
        -df /var/lib/dhcp/dhclient6.${IFACE}.leases \
        -cf /etc/dhcp/dhclient_no_routers.conf ${IFACE}
    down /sbin/dhclient -4 -v -r -pf /run/dhclient.${IFACE}.pid \
        -lf /var/lib/dhcp/dhclient.${IFACE}.leases -I \
        -df /var/lib/dhcp/dhclient6.${IFACE}.leases \
        -cf /etc/dhcp/dhclient_no_routers.conf ${IFACE}

Em seu dhclient.conf ( /etc/dhcp/dhclient_no_routers.conf ), você pode definir as opções de DHCP desejadas.

Para ver o que mais o método inet dhcp faz, consulte o inet.defn arquivo no código-fonte (é onde eu recebo parte da chamada dhclient de cima).

    
por 16.01.2018 / 02:14
0

O mesmo problema resolve adicionando ao /etc/dhcp/dhcliet.conf:

interface "eth0" {
    prepend domain-search "my.domain";
    prepend domain-name-servers 127.0.0.1; # for using dnsmasq without -r option
    request subnet-mask, broadcast-address, time-offset, 
            routers, domain-name-servers, domain-name, domain-search, host-name,
            dhcp6.name-servers, dhcp6.domain-search,
            netbios-name-servers, netbios-scope, interface-mtu,
            rfc3442-classless-static-routes, ntp-servers,
            dhcp6.fqdn, dhcp6.sntp-servers;
    require routers, domain-name-servers, domain-name, domain-search, host-name;

}

e remova o parâmetro global request da configuração

    
por 07.04.2016 / 16:28
0

(transformando meus comentários anteriores em uma resposta)

Atualização:

Adicionar um script conforme proposto abaixo resulta em uma situação inicial de trabalho. No entanto, há cenários (por exemplo, desconectando e conectando o cabo), onde o dhclient irá adicionar novamente a rota padrão, e o script não será executado para que não seja excluído novamente. Como resultado, você terá duas rotas padrão.

Longa história: esta abordagem (infelizmente) não funciona.

Resposta antiga - ignore isto

Mexer no dhclient.conf tem duas desvantagens para mim

  • Eu preciso especificar cada interface para a qual eu quero o comportamento "normal", em vez de especificar para qual interface eu quero ignorar os padrões
  • O
  • isc dhclient (tentado 4.3.3) tentará obter um endereço para cada interface que "conhece", e especificar interfaces em dhclient.conf faz com que ele "conheça" essa interface (consulte a documentação da "interface"). "palavra-chave no manpage do dhclient.conf). Como o gerenciador de rede e o ifup / down esperam que o dhclient obtenha apenas um endereço para a interface fornecida na linha de comando, isso resulta em um comportamento confuso.

Por isso escolhi um script em /etc/network/if-up.d :

#!/bin/sh

if [ x"$IFACE" = x"enp7s4" ]
then
    route del default enp7s4
fi

Retirada: Como isso é executado depois que a interface está ativa, haverá um período (breve) no momento em que os pacotes possivelmente vão na direção errada. Aplicativos bem projetados devem ser capazes de lidar com pacotes sendo perdidos, então isso não deve ser um problema :-). Se você não quiser que nenhum pacote vaze para a rede errada, você precisará de uma regra de firewall para bloqueá-los.

    
por 26.11.2017 / 14:12