Ao usar o RTLINK para consultar a rota IP disponível de um kernel Linux (com namespace de rede), notei que em um sistema de teste o RTLINK retorna uma rota sem um RTA_OIF
atributo, ou seja, sem uma interface de rede de saída especificada.
Infelizmente, não tenho ideia de como reproduzir essa situação (para teste) usando o ip route add
comando e até agora nenhuma pessoa ao meu alcance conseguiu explicar "o que" originalmente criou essa rota sem qualquer indicação de uma interface de rede de saída. De uma olhada nas fontes do kernel do Linux, notei que o atributo de interface de rede de saída na verdade é opcional. No entanto, minhas tentativas ip route add
sempre acabam com uma interface de rede de saída adicionada automaticamente pelo kernel ou uma interface inacessível:
ip route add 1.1.1.1/32 via 1.1.1.2
dá RTNETLINK answers: Network is unreachable
.
Próxima tentativa (falhou):
ip addr add 1.1.1.2/32 dev ens33
ip route add 1.1.1.1/32 via 1.1.1.2
ip route show
... então dá 1.1.1.1 via 1.1.1.2 dev ens33
, onde o kernel inseriu automaticamente uma interface de rede de saída adequada (e, portanto, RTA_OIF
está presente, mesmo que eu não a especifique no início).
Pesquisar coisas como "rota ip linux sem interface de saída" ou similar não me dá resultados utilizáveis - a menos que eu esteja ignorando algo importante aqui.
Então, como posso criar um caso (de teste) em que tenho uma rota IP sem uma interface de rede de saída? O que estou negligenciando aqui?
Acontece que rotas sem interfaces de rede de saída (não: regras, que estão relacionadas ao roteamento) são usadas pelo menos para estes três casos de uso:
Essas rotas podem ser facilmente criadas da seguinte forma:
Um
ip route show
então confirma que essas rotas não têm interfaces de rede de saída: