Não há necessidade de interfaces virtuais aqui. O que você deseja é vários endereços IP no mesmo dispositivo e boas tabelas de roteamento com o roteamento de políticas para selecionar a tabela de roteamento a ser usada. Agora, na parte de configuração. Vamos configurar seus endereços IP com um / 32, para que possamos criar nossas rotas no próprio link
ip addr flush dev eth0
ip addr add 192.168.1.yourhost/32 dev eth0
ip addr add 192.168.2.yourhost/32 dev eth0
ip addr add 192.168.3.yourhost/32 dev eth0
Agora, para a tabela de roteamento. A primeira tabela de roteamento irá corresponder aos pacotes que vão para seus lans.
ip route add 192.168.1.0/24 dev eth0 src 192.168.1.yourhost table 2
ip route add 192.168.2.0/24 dev eth0 src 192.168.1.yourhost table 2
ip route add 192.168.3.0/24 dev eth0 src 192.168.1.yourhost table 2
table 2
especifica qual tabela de roteamento deve ser usada. 2 é um número arbitrário. números podem ser mapeados para nomes editando / etc / iproute2 / rt_tables. Vamos adicionar 2 lan
a esse arquivo, agora você pode simplesmente usar table lan
.
Agora, vamos usar essa tabela de roteamento por padrão:
ip rule add table lan
Agora, se você observar a saída de ip rule
, verá algo assim:
0: from all lookup local
99: from all lookup lan
32766: from all lookup main
32767: from all lookup default
local
é uma tabela reservada usada para que o kernel possa verificar se um endereço IP é seu próprio endereço IP, lan
é nossa tabela, main
é a tabela de roteamento usual que você conhece e default
é uma tabela especial para pacotes que não podemos rotear. Basicamente, o kernel tentará essas regras começando do primeiro e, se não encontrar uma rota nessa tabela, irá para a próxima regra.
Então, adicionamos outra tabela de roteamento onde colocamos nossas rotas para a LAN, que é testada antes da tabela main
. Agora vamos adicionar uma rota padrão no main: Quando você não liga um socket a um endereço IP, você só usará esta rota padrão. Vamos escolher 192.168.1.1:
ip route add default via 192.168.1.1 src 192.168.1.yourhost
Agora, se você vincular seu soquete ao 192.168.2.yourhost, não desejará usar essa rota padrão, mas outra. Vamos adicionar essa rota padrão a outra tabela de roteamento:
ip route add default via 192.168.2.1 src 192.168.2.yourhost dev eth0 table 3
# and while we are at it, let's do this for 192.168.3.1 as well
ip route add default via 192.168.3.1 src 192.168.3.yourhost dev eth0 table 4
Agora você deseja usar essas tabelas de roteamento, mas somente se o seu soquete estiver vinculado a esses outros endereços IP.
ip rule add from 192.168.2.yourhost iif lo table 3
ip rule add from 192.168.3.yourhost iif lo table 4
from 192.168.2.yourhost
fará com que o kernel tente apenas a tabela se o endereço IP no pacote for 192.168.2.yourhost. iif
permite especificar de qual interface o pacote foi recebido (o que é útil quando você encaminha o tráfego) com uma exceção especial, em que iif lo
significa que o tráfego foi gerado localmente.
Agora, você pode verificar se funciona tentando ou usando os comandos ip route get
para testar suas tabelas de roteamento:
$ ip route get 192.168.2.5
192.168.2.5 dev eth0 src 192.168.2.yourhost
cache
$ ip route get 64.34.119.12
64.34.119.12 via 192.168.1.1 dev eth0 src 192.168.1.yourhost
cache
$ ip route get 64.34.119.12 from 192.168.2.yourhost
64.34.119.12 via 192.168.2.1 dev eth0 src 192.168.2.yourhost
cache