Linux: força o endereço de origem dos pacotes para IPs ligados localmente

3

Eu tenho 10.1.1.1 e 10.2.2.2 ligado a eth0.

# ip address show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 04:01:05:ff:42:01 brd ff:ff:ff:ff:ff:ff
    inet 10.2.2.2/24 brd 10.2.2.255 scope global eth0
    inet 10.1.1.1/32 scope global eth0
    inet6 fe80::601:5ff:feff:4201/64 scope link 
       valid_lft forever preferred_lft forever
# ip route get 10.1.1.1
local 10.1.1.1 dev lo  src 10.1.1.1 

Pergunta A: por que usa "dev lo" quando o IP está ligado a eth0?

Eu quero forçar conexões locais para 10.1.1.1 a ter um endereço de origem de 10.2.2.2. Então eu tento:

# ip route add 10.1.1.1/32 dev eth0 src 10.2.2.2
# ip route show
default via 10.2.2.1 dev eth0 
10.1.1.1 dev eth0  scope link  src 10.2.2.2 
10.2.2.0/24 dev eth0  proto kernel  scope link  src 10.2.2.2 
# ip route get 10.1.1.1
local 10.1.1.1 dev lo  src 10.1.1.1 

Pergunta B: Como faço para substituir essa estranha rota "local"?

Background: os pacotes são interceptados pelo subsistema de kernel IPVS. Antes de chegar lá, eu preciso do endereço de origem correto, caso contrário, o IPVS não sabe o que fazer com ele. O SNATting com o iptables não funciona, já que isso acontece na fase POSTROUTING, e o IPVS ignora isso. Veja também minha pergunta relacionada em Linux IPVS no modo DR: VIP inacessível para o diretor

Obrigado!

    
por Willem 21.08.2013 / 14:26

1 resposta

5

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.

    
por 21.08.2013 / 16:35

Tags