A tabela local (tabela 255) é consultada antes do main e contém todas as rotas locais (daí o nome). Ele é mantido pelo kernel (daí proto kernel
). Em sua máquina, provavelmente é algo como isso.
local 10.1.1.1 dev eth0 proto kernel scope host src 10.1.1.1
broadcast 10.2.2.0 dev eth0 proto kernel scope link src 10.2.2.2
local 10.2.2.2 dev eth0 proto kernel scope host src 10.2.2.2
broadcast 10.2.2.255 dev eth0 proto kernel scope link src 10.2.2.2
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope host src 127.0.0.1
Os endereços de origem são especificados aqui.
O Linux suporta mais de uma tabela de roteamento e o roteamento envolve consultar o uso do banco de dados de política de roteamento (RPDB) para decidir quando e qual tabela consultar. Se uma tabela não contiver a resposta, ou se uma rota for do tipo throw
, a próxima regra RPDB será consultada.
$ ip ru
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
Você pode tentar remover a regra da pesquisa local
table e colocá-la posteriormente ( ip rule del pref 0; ip rule add from all lookup local pref 1
), o que não é recomendado. Você então prefixaria uma regra para consultar uma tabela de roteamento personalizada (escolha qualquer número de sua fantasia acima de 255), em que haveria uma única rota para 10.1.1.1 com o endereço de origem definido como 10.2.2.2. A melhor maneira de fazer isso é apenas chamar bind()
se você for o autor dos programas em questão que estarão falando com 10.1.1.1.