Como posso validar parâmetros antes de chamar “ip route add”?

0

Estou usando um programa que define os parâmetros do etcd que são expandidos para chamadas para "ip route add ..." e preciso que essas chamadas sejam bem-sucedidas sem erros. O modelo usa um formato como:

ip route add < route > [ via < gateway > ] dev < interface >

Recebi respostas como esta:

# ip route show
169.254.0.0/16 dev ens192 scope link metric 1002 
172.16.25.64/26 dev ens192 proto kernel scope link src 172.16.25.115 
254.146.247.0/24 dev ens224 scope link 

# ip route add 10.20.30.0/24 via 172.16.25.124 dev ens192
# ip route delete 10.20.30.0/24 via 172.16.25.124 dev ens192
# ip route add 10.20.31.0/24 via 172.16.25.124 dev ens224
RTNETLINK answers: Network is unreachable

# ip route add 10.20.31.0/24 via 254.146.247.1 dev ens224
# ip route delete 10.20.31.0/24 via 254.146.247.1 dev ens224
# ip route add 10.20.30.0/24 via 254.146.247.1 dev ens192
RTNETLINK answers: Network is unreachable

# ping -c 1 172.16.25.124
PING 172.16.25.124 (172.16.25.124) 56(84) bytes of data.
64 bytes from 172.16.25.124: icmp_seq=1 ttl=64 time=0.294 ms

--- 172.16.25.124 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.294/0.294/0.294/0.000 ms

# ping -c 1 254.146.247.1
PING 254.146.247.1 (254.146.247.1) 56(84) bytes of data.
ping: sendmsg: Operation not permitted

--- 254.146.247.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

Estou usando o Python para coletar parâmetros a serem armazenados em um banco de dados do etcd para executar um modelo preenchido com "ip route add ..." quando o serviço que usa o arquivo de configuração preenchido é reiniciado. O que estou procurando é uma maneira de verificar os valores a serem usados para rota, gateway e interface, de modo que quando os "add ip route" sejam eventualmente chamados, eles não falharão. Em particular, do exemplo acima, eu preciso saber que o endereço IP do gateway 254.146.247.1 não pode ser acessado pela interface ens192.

Não consigo usar o ping como mostra o exemplo acima. 172.16.25.124 é pingável AND pode ser usado como um gateway para a interface ens192, mas não para o ens224. 254.146.247.1 NÃO é pingável, mas pode ser usado como um gateway para a interface ens224, mas não para o ens192.

Qualquer ajuda seria muito apreciada.

    
por Mark Solinski 23.08.2018 / 08:35

2 respostas

0

Experimente o código abaixo,

#!/bin/bash
IP_RULES_FILE=/tmp/iprules.txt

while read rule
do
   GW='echo $rule |  awk '{print $6}''
   ping -c1 $GW 2>/dev/null 1>/dev/null
   if [ "$?" = 0 ]; then
    $rule
    else
        echo "host $gw is not reachable"
    fi
done < $IP_RULES_FILE
  • Por favor armazene o iproute no arquivo /tmp/iprules.txt que precisa ser adicionado.
  • O script obterá o gateway da regra fornecida e a capacidade de verificação verificada antes de configurá-lo no servidor
por 23.08.2018 / 11:29
0

Consegui resolver esse problema analisando a saída do netstat:

# netstat -nr
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 ens192
172.16.25.64    0.0.0.0         255.255.255.192 U         0 0          0 ens192
254.146.247.0   0.0.0.0         255.255.255.0   U         0 0          0 ens224

Um endereço de gateway para uma interface deve vir dos endereços de destino configurados para essa interface. No meu exemplo (ip route add 10.20.31.0/24 via 254.146.247.1 dev ens224) funciona porque eu escolhi um endereço ip (254.146.247.1) de uma rede ip (254.146.247.0/24) configurada para a interface (ens224).

    
por 29.08.2018 / 02:35