[FUG-BR] Packet loss com Layer2

Nilson nilson em forge.com.br
Quinta Janeiro 7 00:41:10 BRST 2010


2010/1/6 Renata Dias <renatchinha at gmail.com>:
> Certo, mas eu tinha esse mesmo sistema (router, ipfw e layer2) em um outro
> servidor i386. Quando reinstalei nesse amd64 me deparei com essas perdas.

Creio que o fato de ser AMD64 nao muda nada, então lhe pergunto:
1) Eram as mesmas regras de firewall? (com pequenas mudanças...)
2) O trafego na rede era semelhante?
3) Ambos as redes usam SWITCHES?
4) Sua interface LAN está em modo promisquo?


> Como eu não faço o controle de MAC de meus clientes por este servidor,
> talvez eu possa modificar meu firewall para que fique da seguinte forma:
>
> 1550 allow layer2 not mac-type ip // Libera todos os frames que não forem do
> tipo IP
> 1607 deny log all from any to any in via bge0 MAC any 00:12:17:34:eb:a0
> layer2 // Bloqueia esse MAC indesejado
> 1608 deny log all from any to any in via bge0 MAC any 00:12:0e:a1:38:47
> layer2 // Bloqueia esse MAC indesejado
> 1650 allow layer2 // Libera tudo que for layer2 - seria a mesma coisa de não
> ter o net.link.ether.ipfw ativado, correto??
>
>
> // Controle de banda dos clientes como está atualmente
> // Cliente 1
> 20040 pipe 20040 ip from any to 200.200.200.243 out via bge0 not layer2
> 20041 pipe 20041 ip from 200.200.200.243 to any in via bge0 not layer2
> 20045 allow ip from any to 200.200.200.243
> 20046 allow ip from 200.200.200.243 to any
>
> Ou então, como ja liberei layer2 na regra 1650 é lógico que só sobrou
> pacotes "not layer2", então poderia ficar assim tbm:
>
> // Cliente 1
> 20040 pipe 20040 ip from any to 200.200.200.243 out via bge0
> 20041 pipe 20041 ip from 200.200.200.243 to any in via bge0
> 20045 allow ip from any to 200.200.200.243
> 20046 allow ip from 200.200.200.243 to any
>
>
> Alguém discorda do meu raciocínio? Será que dessa forma eu vou prejudicar a
> rede de alguma forma? O controle de banda nas regras pipe sofrerão alguma
> deficiencia? A banda será controlada corretamente?
>

Dados insuficientes para uma afirmação conclusiva, mas olhando
apenas esses pedaços do firewall que nos enviaste, eu fico
tensionado a discordar.

Existem varias formas de desenhar um firewall e em geral
em pequenas redes isso pouco importa em termos de
performance, pois o hardware que você estará usando como
router (aquele PC velhinho que ninguem mais queria usar
na empresa) é muito poderoso com FreeBSD, e dá
conta com sobra para tratar aqueles 100 packets por
segundo num link de uns 2Mbps.

Mas quando você tem um trafego alto, torna-se evidente
que o design vai fazer diferença e terás que usar hardware
adequado para dar conta do recado.

Quanto ao hardware, um detalhe da sua configuração me
chamou a atenção e lhe sugiro uma troca: inverter as
interfaces de rede, pois você está usando uma Broadcom
(muito boa) para a rede roteável, onde o trafego é
muito menor e sem lixo ARP, enquanto usas uma realtek
(muito ruim) para a rede interna onde em relação a iface
externa o trafego deve ser mais que o dobro, com todo
aquele lixo ARP, broadcasts, netbios, virus, muitos
pacotes que serão bloqueados no firewall, e talvez
um proxy com cache.

Bom, continuando com o firewall, tens que lembrar
que como você faz NAT, todos os pacotes (não todos,
tem aqueles que foram bloqueados e tals, mas vou
generalizar pra simplificar a história) IP tem que
passar pelo firewall 2 vezes: quando ele chega
pela LAN (in) e quando ele está saindo para a
WAN (out). Quando você habilita a camada 2 no fw,
cada pacote passa 4 vezes pelo seu ipfw:
L2 (in) -> L3 (in) -> **NAT** -> L3 (out) -> L2 (out)

Partindo desse ponto de vista, nos meus firewalls
(principalmente nos HEAVYs) gosto de dividir as
checagens de cada tipo de trafego em blocos
separados, fazendo com que os pacotes sejam
checkados apenas pelas regras que lhes são
pertinentes, e não por todas as regras existentes,
segue um exemplo simples para lhe dar uma boa
idéia disso que falei:

# INICIO, REGRAS GERAIS QUE VC QUEIRA,
# E OS "DIVISORES":
ipfw blablabla...
ipfw blablabla...
ipfw blablabla...

# DIVISORES:
# pacotes entrando L2
ipfw add 2001 skipto 10000 all from any to any layer2 in

# pacotes entrando L3
ipfw add 2002 skipto 20000 all from any to any not layer2 in

# pacotes saindo L3
ipfw add 2003 skipto 30000 all from any to any not layer2 out

# pacotes saindo L2
ipfw add 2004 skipto 40000 all from any to any layer2 out

# se algo não bateu em nenhuma dessas, kill it!
ipfw add 2005 deny all from any to any

# 10.000 -> trate a partir daqui suas regras de L2 in,
# e entao mande pro final do firewall
ipfw add 10000 blablabla...
ipfw add skipto 65000 all from any to any

# 20.000 -> trate a partir daqui suas regras de L3 in, e skito final
ipfw add 20000 blablabla...
ipfw add skipto 65000 all from any to any

# e assim por diante até que finalmente:

ipfw add 65000 allow all from any to any

--------------------------

Isso foi apenas um exemplo, dependendo da sua
necessidade ou imaginação você poderia subdividi-lo
muito mais, como fazer essa mesma divisao por interfaces,
um bloco exclusivo para os pipes (dummynet), e o que
mais você quiser inventar.

[]s
Nilson


Mais detalhes sobre a lista de discussão freebsd