Bridges em ambiente Gnu/Linux
De gutocarvalho.net
[editar] resumo
O objetivo deste tutorial é falar sobre bridges, nele vamos aprender a implementar uma bridge em ambiente gnu/linux entendendo quais são as vantagens e quais as aplicações desta tecnologia. Estarei abordando também como trabalhar com filtros de frames EBTABLES e filtros de pacotes IPTABLES dentro da bridge.
[editar] o que é um bridge?
Um bridge é um dispositivo de rede que permite que conectemos 2 segmentos de rede, seja ele ethernet, token ring, fddi, etc, fazendo isto de forma transparente, formando uma única sub-rede.
Um bridge é um dispositivo transparente, isto significa que você não precisa informar a nenhum componente, seja ele uma aplicação, seja ele uma máquina, seja ele um componente qualquer, que existe este novo "dispositivo" na rede.
Não é necessário fazer nenhuma configuração, nem mesmo setar um endereço IP na bridge, o que o torna totalmente transparente, invisível e quase indetectável.
Você pode construir uma bridge facilmente, para isto, você vai precisar de pelo menos 2 NICS ethernet.
No caso de ambientes gnu/linux estas características de invisibilidade podem ser adaptadas para que a bridge nos ajude a melhorar a segurança de sua rede.
[editar] diagrama ascii de um bridge em ambiente linux
/\
Ethernet Ethernet ATM /-/ \
--------- --------- --------- /-/ |
| Box |----------|Bridge |----------|Router |-----| Inter- \
--------- --------- --------- \ net ---|
^ ^ ^ ^ \ /
| | | | \---/
eth0 eth0 eth1 if0 ^
| | | | |
10.0.3.2 none/10.0.3.1 195.137.15.7 anything else
\ /
\ /
^ \-br0-/
| ^ ^
| ^ | |
| | | |
own own foreign hostile
Diagrama-ASCII retirado de: http://lwn.net/Articles/145002/
[editar] quais são os cenários e as aplicações possíveis para o uso de uma bridge?
Podemos utilizar uma brigde para:
- brouter (bridge + router)
- firewall invisível, quase indetectável
- proxy invisível e transparente
- balanceamento de carga de grandes volumes para para vários appliances IDS/IPS.
- ambiente IDS/IPS
- rate shape bandwidth (controle de banda).
[editar] alguns casos de uso
No caso de bridge com filtro de frames e pacotes, abaixo cito alguns cenários que eu já vi funcionando.
[editar] firewall para windows servers com ip público
Vários servidores windows que precisavam de IP público (não me pergunte por que, vontades do cliente), o cliente queria segurança, queria que deixássemos passar apenas requisições para as portas que ofereceriam serviços nos servidores windows, então a bridge entre o roteador e os servidores foi uma solução que atendeu neste caso.
Vi este caso em uma transportadora no Centro Oeste do Brasil (ambiente de produção).
[editar] bridge+ids c/ snort + snort-inline
Criar um IDS com SNORT + SNORT-Inline , o snort fareja, o snort-inline executa ações em conjunto com o iptables de acordo com alertas dos logs.
Vi este caso em uma grande universidade privada do Centro Oeste (ambiente de produção).
[editar] diminuir a quantidade de firewalls em sua DMZ
Se você tem 30+ servidores na grande rede, tem 30 firewalls para administrar e acha isto um saco? Use um bridge entre router e DMZ, cuide de apenas uma firewall e seja feliz.
Enfim, você pode fazer N coisas, depende de suas necessidades e de sua criatividade :)
[editar] isto seria uma alternativa àquelas bridges em appliances?
Sim seria, acho que tu já deve ter visto aquelas APPLIANCES que custam alguns milhares de dólares (já vi algumas sendo comercializadas aqui em brasília por mais de 100k), pois então, com o linux você pode construir uma bridge usando algumas ferramentas livres como alternativa a estes brinquedinhos caros.
Na maioria dos casos estes appliances usam sistemas *NIX com algum frontend "bonitinho", por baixo é tudo *NIX mesmo ;)
[editar] conhecendo o ebtables
O projeto ebtables tem o objetivo de oferecer uma sub-sistema de firewall para o kernel 2.6 o qual atua na camada de elance (data link layer).
Com o ebtables podemos criar filtros para frames ethernet, MAC, fazer MAC/NAT, gerar logs ou criar um brouter.
O projeto também mantém um patch para o kernel 2.4.
O ebtables funciona de forma similar ao iptables porém ele atua na layer2 (data link layer ou camada de enlace) especificamente com o padrão "ethernet", enquanto o iptables atua geralmente na layer3 e layer4 e em alguns casos na layer 7 (vide projeto l7-filter ou o projeto patch-o-matic com módulo ipp2p).
Site do projeto :
[editar] dicas
Layers = Camadas
Layer2 é a camada que o ebtables trabalha
Ex.: Ethernet, ATM, STP, FDDI
Estamos falando aqui das camadas do modelo OSI:
Descubra o que é um brouter no link abaixo:
[editar] o que faz o iptables ?
O netfilter/iptables é um filtro de pacotes para kernel 2.4 ou superior, ele atua na camada 3 e 4 do modelo OSI. Ele pode atuar na camada 7 com a aplicação de patchs não oficiais.
Site do projeto:
[editar] dicas: iptables
Filtro Layer 3, 4 e com alguns patchs no kernel e no netfilter ele pode atuar em layer 7
Layer7 = Application
Ex.: HTTP, FTP, SSH...
Layer4 = Transport
Ex.: UDP, TCP, SCTP...
Layer3 = Network
Ex.: IPv4, IPv6, ICMP, IGMP...
[editar] projetos não-oficiais
Projeto l7-filter
Projeto patch-o-matic (módulo ipp2p para layer7)
[editar] criando sua bridge
Da teoria a prática.
[editar] instalando & configurando seu bridge
Lembro aqui que o seu kernel precisa ter o suporte '802.1d Ethernet Bridging' ativado.
[editar] instalando ebtables e bridg-utils
aptitude install ebtables bridge-utils
[editar] criando um bridge
brctl add br0
[editar] como desligo o STP? (opcional)
caso você precise desligar o stp, siga os passos abaixo:
brctl stp br0 off
STP = Spanning Tree Protocol
[editar] adicionando interfaces ao bridge
brctl addif br0 eth0 brctl addif br0 eth1
[editar] informacoes sobre sua bridge
use o comando
brctl show
e veja a saída similar a esta
bridge name bridge id STP enabled interfaces
br0 8000.0030843e5aa2 no eth0
eth1
[editar] configurando interfaces
ifconfig eth0 down ifconfig eth1 down ifconfig eth0 0.0.0.0/24 ifconfig eth1 0.0.0.0/24 ifconfig eth0 up ifconfig eth1 up
[editar] ativando o ipforward
isto é de suma importância, se não habilitar ip forward o bridge não funciona.
echo "1" > /proc/sys/net/ipv4/ip_forward
[editar] caso queria acessar a bridge remotamente (não recomendo!)
[editar] setando ip a interface brX
ifconfig br0 10.0.103.30
[editar] setando a rota padrão
ip route add default gw 10.0.102.254
[editar] por que nao devo fazer isto?
Se você quer uma bridge de fato, o certo é não setar IP aqui, o acesso a máquina deve ser direto no equipamento, nada de acesso remoto, do contrário não faria sentido você utilizar/criar um bridge.
[editar] agora vamos entender como construir filtros
Aqui vamos abordar algumas formas de se fazer filtros em um bridge com ebtables e iptables.
[editar] ebtables: filtros
Abaixo alguns exemplos da tabela filter e suas cadeias no ebtables.
Lembre-se que o tratamento aqui é na 'camada de elance' ou 'data layer link'.
[editar] tabela filter
[editar] tabela filter, cadeia forward
Esta cadeia trata frames de (intranet|dmz > internet) & (internet > intranet|dmz)
Na primeira linha setamos a politica DROP para cadeita FORWARD da tabela filter do ebtables. Na segunda linha liberamos frames do tipo IPV4 a atracesseram o bridge. Na terceira linha liberamos frames do tipo ARP a atravessarem o bridge. Na quarta linha liberamos frames do tipo LENGH (protocolo legado, maquinas antigas) a atravessarem o bridge. Na quinta linha habilitamos o log com o prefixo EBFW que significa [EB]tables [F]ilter [F]orward
ebtables -P FORWARD DROP ebtables -A FORWARD -p IPv4 -j ACCEPT ebtables -A FORWARD -p ARP -j ACCEPT ebtables -A FORWARD -p LENGTH -j ACCEPT ebtables -A FORWARD --log-level info --log-ip --log-prefix EBFF
[editar] tabela filter, cadeia input
Esta cadeia trata frames de (rede < bridge) & (internet < bridge)
Na primeira linha setamos a politica DROP para cadeita INPUT da tabela filter do ebtables. Na segunda linha liberamos frames do tipo IPV4 a acessarem o bridge. Na terceira linha liberamos frames do tipo ARP a acessarem o bridge. Na quarta linha liberamos frames do tipo LENGH (protocolo legado, maquinas antigas) a acessarem o bridge. Na quinta linha habilitamos o log com o prefixo EBFI que significa [EB]tables [F]ilter [I]nput
ebtables -P INPUT DROP ebtables -A INPUT -p IPv4 -j ACCEPT ebtables -A INPUT -p ARP -j ACCEPT ebtables -A INPUT -p LENGTH -j ACCEPT ebtables -A INPUT --log-level info --log-ip --log-prefix EBFI
[editar] tabela filter, cadeia output
Esta cadeita trata frames de (bridbge > internet) & (bridge > intranet|dmz)
Na primeira linha setamos a politica DROP para cadeita OUTPUT da tabela filter do ebtables. Na segunda linha liberamos frames do tipo IPV4 a sairem do bridge, caso tenham sido processados localmente. Na terceira linha liberamos frames do tipo ARP a sairem do bridge, caso tenham sido processados localmente. Na quarta linha liberamos frames do tipo LENGH (protocolo legado, maquinas antigas) a sairem do bridge, caso tenham sido processados localmente. Na quinta linha habilitamos o log com o prefixo EBFI que significa [EB]tables [F]ilter [O]utput
ebtables -P OUTPUT DROP ebtables -A OUTPUT -p IPv4 -j ACCEPT ebtables -A OUTPUT -p ARP -j ACCEPT ebtables -A OUTPUT -p LENGTH -j ACCEPT ebtables -A OUTPUT --log-level info --log-ip --log-arp --log-prefix EBFO -j DROP
[editar] dicas de segurança
Se estiver pensando em segurança.... nada de lenght, especifique diretamente cada serviço ou mac a ser liberado, seja explítico e direto em suas regras.
[editar] anti-spoof
se o ip de origem tiver um mac diferente de 00:11:22:33:44:55 a ebtables marreta o frame!
ebtables -A FORWARD -p IPv4 --ip-src 172.16.1.4 -s ! 00:11:22:33:44:55 -j DROP
podíamos fazer isto com iptables também , veja um exemplo abaixo
iptables -A FORWARD -s 172.16.1.4 -m mac --mac-source ! 00:11:22:33:44:55 -j DROP
funcionaria, a diferença é que caso usemos a ebtables o DROP será dado antes de chegar na camada 3, na qual o iptables atua pois o ebtables trabalha em uma camada abaixo, layer2 (data link layer).
[editar] surfando na web (http+dns)
Setando política padrão da cadeia FORWARD da tabela filter do ebtables, padrão DROP
ebtables -P FORWARD DROP
Permitindo que pacotes ARP atravessem o bridge
ebtables -A FORWARD -p 0x806 -j ACCEPT
Permitindo que o cliente 200.200.200.1 possa surfar na web
ebtables -A FORWARD -p 0x800 --ip-dst 200.200.200.2 --ip-proto tcp --ip-sport 80 -j ACCEPT ebtables -A FORWARD -p 0x800 --ip-src 200.200.200.2 --ip-proto tcp --ip-dport 80 -j ACCEPT
Permitindo que o cliente 200.200.200.2 faça requisições DNS para 200.200.200.1 para que ele consiga surfar na web
ebtables -A FORWARD -p 0x800 --ip-src 200.200.200.2 --ip-dst 200.200.200.1 --ip-proto udp --ip-dport 53 -j ACCEPT ebtables -A FORWARD -p 0x800 --ip-src 200.200.200.1 --ip-dst 200.200.200.2 --ip-proto udp --ip-sport 53 -j ACCEPT
Dropando fragmentos perdidos, caso algum pacote chegue aqui, marretana nele.
ebtables -A FORWARD -j DROP
Significados dos códigos Hexadecimais.
0x806 = ARP 0x800 = IP
Eu particularmente prefiro fazer este tipo de tratamento usando o iptables.
[editar] MAC/NAT
Exemplo de NAT para MAC
ebtables -t nat -A PREROUTING -d 00:11:22:33:44:55 -i eth0 -j dnat --to-destination 54:44:33:22:11:00
Acha bizzaro fazer MAC/NAT?
Então veja alguns exemplos reais de uso do MAC/NAT clicando no link abaixo:
[editar] marcando frames
O ebtables permite que você faça a marcação de pacotes, veja um exemplo abaixo:
ebtables -A FORWARD -p ipv4 -i eth0 -j mark --set-mark 2 --mark-target CONTINUE
Os frames marcados podem ser reconhecidos pelo iptables.
[editar] iptables: filtros comuns
Aqui alguns filtros comuns que podemos fazer via IPTABLES onde permitiremos no BRIDGE que o acesso aos servidores da DMZ fiquem restritos aos serviços em produção e nada mais.
Setando politica padrao na cadeia forward da tabela filter como DROP.
iptables -t filter -P FORWARD DROP
Liberando conexões estabelecidas ou relacionadas
iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
Liberando acesso dos servidores da DMZ
iptables -t filter -A FORWARD -s 200.200.50.1 -j ACCEPT iptables -t filter -A FORWARD -s 200.200.50.2 -j ACCEPT iptables -t filter -A FORWARD -s 200.200.50.3 -j ACCEPT iptables -t filter -A FORWARD -s 200.200.50.4 -j ACCEPT
Permitindo acesso da rede externa ao host 200.200.50.1 na porta 20,21,80,443 (http/ftp/ftpdata)
iptables -t filter -A FORWARD -m multiport -p tcp --dport 20,21,80,442 -d 200.200.50.1 -j ACCEPT
Permitindo acesso da rede externa ao host 200.200.50.2 nas portas 5222,5223 (jabber+tls)
iptables -t filter -A FORWARD -m multiport -p tcp --dport 5222,5223 -d 200.200.50.2 -j ACCEPT
Permitindo acesso da rede externa ao host 200.200.50.3 nas porta 53 (DNS)
iptables -t filter -A FORWARD -p tcp --dport 53 -d 200.200.50.3 -j ACCEPT iptables -t filter -A FORWARD -p udp --dport 53 -d 200.200.50.3 -j ACCEPT
Permitindo acesso da rede externa ao host 200.200.50.4 nas porta 25,110,143,587,995,993 (smtp,pop,imap|+ssl|+tls)
iptables -t filter -A FORWARD -m multiport -p tcp --dport 25,110,143,587,993,995 -d 200.200.50.4 -j ACCEPT
Dropando fragmentos perdidos nesta cadeia, caso um pacote cheque até aqui, marreta nele!
iptables -t filter -A FORWARD -j DROP
[editar] um pouco mais sobre ebtables
[editar] tabelas
O Ebtables possui 3 tabelas, abaixo as tabelas e suas cadeias
- tabela brouter
- brouting
- tabela filter
- input
- forward
- output
- tabela nat
- prerouting
- output
- postrouting
[editar] targets
Os targets são:
- ACCEPT
Deixa o frame atravessar o bridge
- DROP
Não permite que o frame atravesse
- RETURN
Retorna a rule anterior
- CONTINUE
Passa a próxima rule
Na cadeia BROUTING da tabela broute temos usos específicos para os targets ACCEPT e DROP, dê uma olhada na MANPAGE do ebtables para entender as mudanças.
[editar] match extensions
- 802_3
- vlan
- amgon
- arp
- ip
- limit
- mark_m
- pkgtype
- stp
[editar] watcher extensions
- log
- ulog
[editar] extra extensions
- arpreply
- mark
- redirect
- dnat
- snat
[editar] considerações finais
[editar] testar é preciso
Estude a fundo o tema 'linux ethernet bridge', leia a documentação do ebtables e iptables sem medo.
Antes de colocar em produção faça muitos, mas muitos testes e claro documente tudo passo-a-passo pois vai aumentar a velocidade da absorção do conteúdo que você está estudando.
Use e abuse do NMAP para testar se as restrições e regras que você criou estão funcionando.
Use e abuse do IPTRAF para acompanhar o flow do seu bridge, a opção 'General Interface Statistics' vai te mostrar o flow em tempo real.
[editar] bridge
Ok gente, tudo bem, a teoria é linda mas lembre-se que você está criando um ponto de falha único na sua rede, se a bridge for ao chão sua rede para, então pense nistom pense nas alternativas e no plano de contingência caso isto ocorra.
Você, SysAdmin que está lendo o tutorial, procure que visualizar os benefícios e as vantagens da bridge, mas ao mesmo tempo não pode de forma alguma descartar a possibilidade de ocorrer uma falha, afinal uma bridge é dispositivo 'sensível'.
Pense nas falhas, simule falhas, esgote todas as possibilidades antes de 'pensar' em colocar algo em produção.
[editar] ebtables & iptables
Lembre-se que os filtros do ebtables atuam na camada 2, pense bem se é mais eficiente aplicar um filtro para dropar alguma coisa na camada 2, lembre-se que o iptables oferece uma boa flexibilidade nestes casos, use o ebtables específicamente para o que ele se propõe.
Olhe o diagrama sobre o packet flow do ebtables para entender seu funcionamento, aqui temos ebtables e iptables no mesmo diagrama
[editar] erário
Antes de dilapidar o erário comprando appliances com preços surreais, pare e pense, que tal contatar o setor de infra e redes de sua instituição, fale especificamente com o núcleo que trabalha com tecnologias livres e/ou opensource (geralmente os barbudos e cabeludos...existem exceções, claro :) eles podem ter uma alternativa que economize dinheiro dos contribuintes, e o melhor é que isto para eles será divertido, mas já adianto, com certeza vai custar algumas pizzas e muita coca-cola, o que é bem mais barato que 100K não acha* :P
- Dica direcionada a ministérios, agências e instituições públicas em geral que são mantidas com dinheiro público.
[editar] referências
site do projeto ebtables
links contendo documentação sobre ebtables
manpage do ebtables
faq do ebtables
diagrama package flow do ebtables
artigo quer aborda o que é uma bridge e como construí-la em ambiente linux
artigo que aborda um bridge com uso de netfilter/iptables para filtragens
artigo sobre a construção de uma bridge com firewall e proxy transparente
artigo sobre balanceamento de IDS usando uma bridge + ebtables
links wikipedianos sobre o Modelo OSI
- http://en.wikipedia.org/wiki/OSI_model
- http://en.wikipedia.org/wiki/Data_Link_Layer
- http://en.wikipedia.org/wiki/Application_Layer
- http://en.wikipedia.org/wiki/Transport_Layer
- http://en.wikipedia.org/wiki/Network_Layer
O que é um brouter
site do projeto netfilter
Projeto patch-o-matic (leia sobre o módulo ipp2p filter para a camada 7).
Projeto l7-filter

