[FUG-BR] Dual Nic na mesma subnet.

Marcelo Araujo araujobsdport em gmail.com
Terça Março 5 02:53:25 BRT 2013


Em 2 de março de 2013 21:55, <freebsd-request em fug.com.br> escreveu:

>
>    8. Re: Dual Nic na mesma subnet. (Klaus Schneider)
>
> Message: 8
> Date: Sat, 2 Mar 2013 00:24:54 -0300
> From: Klaus Schneider <klausps em gmail.com>
> Subject: Re: [FUG-BR] Dual Nic na mesma subnet.
> To: Lista Brasileira de Discussão sobre FreeBSD (FUG-BR)
>         <freebsd em fug.com.br>
> Message-ID:
>         <
> CAHw7puT4Bv58DDmQfwkzkUZJgwuexozOtkRH8m6TjatOx7WvOg em mail.gmail.com>
> Content-Type: text/plain; charset=ISO-8859-1
>
> Opa Marcelo, blz?
>
>
> 2013/2/27 Marcelo Araujo <araujobsdport em gmail.com>
>
> > Em 25 de fevereiro de 2013 19:13, <freebsd-request em fug.com.br> escreveu:
> >
> > >
> > >    7. Re: Dual Nic na mesma subnet. (Renato Botelho)
> > >
> > > Então Marcelo,
> > >
> > > O que eu to tentando entender é o que justificaria a necessidade de se
> > > ter os dois IPs, cada um em uma interface, na mesma subnet. Cada
> > > placa é ligada a um switch ou router diferente? as LANs que vão
> > > acessar são distintas, mas compartilham a subnet?
> > >
> >
> > Sim, as LANs são distintas, mas elas compartilham a mesma subnet.
>
>
> >
> > >
> > > Porque se não for nenhuma das razões acima, eu não consigo ver razão
> > > pra isso mesmo, nesse caso você poderia ter um lagg e os dois IPs
> > > configurados na interface lagg, o que funcionaria normalmente já que um
> > > dos IPs teria mask 0xffffffff.
> > >
> > > []s
> > > --
> > > Renato Botelho
> > >
> >
> >
> > Sim, eu poderia ter uma interface lagg, mas não é o meu caso!
> > Até agora, a única maneira que consegui fazer isso funcionar foi com FIB,
> > mais ou menos dessa maneira:
> >
> > root# ifconfig ix0 fib 0
> > root# ifconfig ix1 fib 1
> > root# setfib 1 route delete 172.17.22.0/23
> > root# setfib 1 route add 172.17.22.0/23 -iface ix1
> > root# setfib 0 smbd -D -s /usr/local/etc/smb_ix0.conf
> > root# setfib 1 smbd -D -s /usr/local/etc/smb_ix1.conf
> >
> > Estou procurando se existe alguma outra alternativa mais fácil de
> > configurar.
> >
>
> Mesmo prefixo em duas interfaces, quebra o modelo de roteamento IP. Afinal,
> por qual lado é o correto sair? O sistema tem o mesmo peso para ambas as
> interfaces. E se houver dois hosts distintos com o mesmo IP nestas duas
> subnets?
> O BSD não vai conseguir montar uma tabela arp com duas entradas para o
> mesmo endereço. Fazer isso funcionar seria uma gambiarra, pois teria que
> fazer mudanças nas camadas 2 e 3 do sys/net do FreeBSD, e talvez até
> mudança de alguns drivers.
>
> Você pode fazer a "gambiarra" de colocar por ex:
> iface x 172.16.0.1/22
> iface y 172.16.0.1/23
>
>
> O problema é que vai começar a aparecer flap de endereços MAC e problemas
> com a resolução(arp). E quando resolver sair, vai sair pela iface y se o
> endereçamento estiver dentro do /23, caso não, sairá pelo /22.
>
> A solução menos gambiarra é fazer um NAT de alguma forma.
> A solução correta: trocar as subnets... hehe
>
> Isso não é problema do BSD, e sim do modelo de roteamento IP. Aliás, não é
> um problema, é como funciona... em qualquer SO, seja IOS, Junos, Linux e
> Windows...
>
>
>
>
Olá Pessoal,

Terminei minhas pesquisas e testes sobre esse assunto; agora é hora de
compartilhar!

O que eu gostaria de fazer é chamado de Multihoming e é especificado na RFC
1122, para ser mais preciso na section 3.3.4.2.

Basicamente existem dois modelos chamados de "Strong ES Model" and "Weak ES
Model", o FreeBSD suporta o "Weak ES Model" que é comum para dispositivos
que atuam como ROUTERS e GATEWAYS. Como algumas pessoas comentaram, é
necessário fazer várias modificações nas camadas 2 e 3 de rede no KERNEL,
estava até pensando em trabalhar nisso, mas realmente é muito complexo e
pode quebrar muita coisa.

Algumas pessoas chegaram a tentar implementar o modelo "Strong ES", mas
devido a complexidade na parte de roteamento, não conseguiram.

Exemplo de comentário no código relacionado a RFC 1122:

File: sys/netinet/ip_input.c

    121 /*

    122  * XXX - Setting ip_checkinterface mostly implements the receive
side of

    123  * the Strong ES model described in RFC 1122, but since the routing
table

    124  * and transmit implementation do not implement the Strong ES model,

    125  * setting this to 1 results in an odd hybrid.

Na entrada, o KERNEL consegue identificar o pacote e direcionar para a
placa correta, agora o problema é na saída e também na tabela de roteamento.

FreeBSD suporta a RFC 1122 sem problema algum, mas no modelo "Weak ES",
para utilizar algo como no modelo "Strong ES" é necessário usar source
based policy routing que pode ser implementado usando FIB(como já é sabido).

Fiz vários testes, e todos eles falharam!

1) ipfw fwd: É possível fazer fwd para multiplos gateways, mas eles não
podem fazer parte da mesma subnet.
2) pf reply-to e route-to: Mesma coisa como o ipfw, única diferença é que é
possível fazer loadbalance e etc.
3) netgraph - ng_one2many: Podemos fazer routing para multiplos links
one-to-many e o inverso para many-to-one sem problemas, mas ele falha
igualmente nos casos 1 e 2.
4) Jail - nem vou comentar... :P

Sendo assim, não existe uma maneira fácil igualmente implementada no
Linux(iproute2), e eu acredito que não vamos ter isso nunca no FreeBSD.

É muito esforço alterar a parte de roteamento no FreeBSD(código) e manter
compatibilidade com IPv4 e IPv6. E claro, manter isso com ótima performance
como temos hoje.

Sendo assim, para pessoas que como eu, queriam ter 2 interfaces na mesma
subnet, as soluções são:

1) Usar FIB.
2) Modificar as subnets.
3) Desligar tudo e ir tomar umas cervejas!

Grande Abraço.
-- 
Marcelo Araujo
araujo em FreeBSD.org


Mais detalhes sobre a lista de discussão freebsd