Como garantir que o / etc / network / interfaces trará a interface para cima?

1

Eu tenho uma caixa headless baseada no Debian. Destina-se a ser acessado através de sua interface de rede. A rede é configurada por meio do /etc/network/interfaces . Estou tentando validar se o arquivo é realmente válido. Minha ideia é verificar se o arquivo tem algum erro e, nesse caso, recorrer a um arquivo padrão.

Minha pergunta é sobre a primeira parte do problema: detectar um erro no arquivo interfaces .

Eu encontrei muitas perguntas sobre o uso de comandos ifup --no-act , mas o que vejo na prática é que esse método não é robusto o suficiente para o meu caso. Tome o seguinte exemplo:

root@arm:~# ifup --no-act --interfaces=/etc/network/interfaces eth0
run-parts  /etc/network/if-pre-up.d
ip addr add 1s23.123.123.123/255.255.255.192 broadcast +          dev eth0 label eth0
ip link set dev eth0   up
 ip route add default via 123.123.123.122  dev eth0
run-parts  /etc/network/if-up.d

Observe o endereço IP inválido definido (extra 's' no primeiro octeto). O comando não dá erro (de qualquer forma, eu vejo) e se eu reiniciar a máquina com o arquivo nesse estado, perderia o recurso de rede. Um interfaces válido me dá um resultado muito semelhante (exceto pela broadcast + part):

root@arm:~# ifup --no-act --interfaces=/etc/network/interfaces eth0
run-parts  /etc/network/if-pre-up.d
ip addr add 123.123.123.123/255.255.255.192 broadcast 123.123.123.127     dev eth0 label eth0
ip link set dev eth0   up
 ip route add default via 123.123.123.122  dev eth0
run-parts  /etc/network/if-up.d

Este é principalmente o problema que estou tentando evitar. Minha pergunta é como posso detectar a configuração inválida no arquivo /etc/network/interfaces ? O sinal de mais indica que há um erro? O que isso significa? Qual é a melhor abordagem para resolver isso?

    
por ricardomenzer 04.12.2017 / 20:42

2 respostas

2

Resposta curta: Chame ifup --no-act com a configuração de rede para testar e verificar o código de retorno.

Resposta longa: venho fazendo algo muito semelhante para um appliance incorporado; aqui está a parte relevante do script de init que eu criei para este propósito, que é executado antes de networking ser iniciado, então é assegurado que o sistema tem uma configuração de ethernet funcional.

ETH0_CUSTOM=/var/myproject/etc/interfaces.eth0 
result=1

if [ -f "${ETH0_CUSTOM}" ]; then
    ifup -n -i "${ETH0_CUSTOM}" eth0
    if [ $? -eq 0 ]; then
        ln -sf "${ETH0_CUSTOM}" /etc/network/interfaces.eth0
        result=0
    else
        echo "Validating ${ETH0_CUSTOM} failed"
    fi
fi

if [ ${result} -ne 0 ]; then
    ln -sf /etc/network/interfaces.eth0.default /etc/network/interfaces.eth0
fi

No original /etc/network/interfaces , as configurações válidas são incluídas com

source /etc/network/interfaces.eth0
    
por 06.12.2017 / 13:54
1

Acho que vejo dois problemas / abordagens aqui:

  • protegendo usuários de cometer erros; e
  • ter uma maneira de testar uma configuração modificada antes de torná-la permanente

Para o primeiro, fazendo toda a configuração através de alguma ferramenta inteligente que faz mais verificações de sanidade do que $EDITOR /etc/foobar . Neste caso, ele pode verificar se o endereço IP é válido e se a rota padrão está na mesma rede, etc. A ferramenta pode ser algum script ou uma interface de administração gráfica / baseada na Web (como você tem no OpenWRT, etc.). .)

A outra coisa seria fazer com que o usuário verificasse a configuração da rede depois que ela estivesse em vigor, da mesma forma que muitos sistemas fazem o usuário verificar as configurações de exibição (resolução etc) e voltar à última configuração em funcionamento se o usuário não fizer nada .

Então, algo assim:

  • Ter uma configuração de inicialização separada da nova configuração, permitir que o usuário faça alterações somente na configuração nova (não na configuração de inicialização!).
  • Quando o usuário deseja aplicar a nova configuração, agende uma reinicialização para ocorrer em aproximadamente 5 minutos ( shutdown -r +5 ) e, em seguida, carregue a nova configuração.

  • Agora, peça ao usuário que verifique se eles ainda acessam o sistema (incluindo a abertura de novas sessões SSH).

  • Se puderem, eles poderão confirmar a alteração, cancelando a reinicialização e copiando a nova configuração para a configuração de inicialização.

  • Se eles não puderem acessar o sistema depois que as modificações estiverem em vigor, eles não poderão verificar as alterações, e a reinicialização permitirá que eles iniciem novamente (desde que a configuração de inicialização esteja correta, o que deve ser, desde que o sistema começou a usá-lo anteriormente.)

A ideia deve ser aplicável a alterações na configuração da interface de rede, configuração de firewall, etc. Mas isso requer que a configuração seja independente, para que você não possa terminar em uma situação em que a nova configuração só funcione porque configuração de inicialização efetiva continha alguma regra importante)

(E, claro, não é absolutamente necessário reinicializar o sistema, apenas restaure a configuração.)

Nada disso impede que os usuários de root gravem a si mesmos na perna, é claro, mas pelo menos você poderia fornecer uma ferramenta com um interruptor de segurança.

Ter acesso de backup por meio do console / porta serial ou ainda seria melhor.

Nesse caso específico, se os usuários forem personalizados para editar /etc/network/interfaces e executar ifup , você terá que ensiná-los sobre isso, o que pode ser difícil. Ou você pode alterar o sistema para que a configuração real realmente esteja em outro lugar, para que eles não deixem que os hábitos antigos causem problemas.

    
por 05.12.2017 / 15:03