1. Criando Redes Locais Virtuais (VLANs) com Linux<br />O objetivo deste material é demonstrar como os servidores Debian Linux podem ser usados em uma configuração com VLANs, assumindo o papel de roteador e permitindo um melhor controle das redes locais. O uso de VLANs é algo relativamente comum hoje em dia, sendo esta característica suportada por vários switches existentes no mercado. Entretanto, o seu uso associado a máquinas Linux ainda não é muito difundido e merece ser explicado em detalhes.<br />Pode parecer estranho, mas o ciclo de evolução de uma rede local, principalmente de pequenas e médias empresas, passa por caminhos muito parecidos, crescendo à medida que os problemas vão aparecendo e se adaptando às novas necessidades e demandas. <br />Porque usar VLANs?<br />Existem várias boas razões para se usar VLANs:<br />Ganho em performance: Com o emprego de VLANs, o domínio de broadcast fica reduzido, sendo repassado somente dentro da VLAN onde foi gerado e evitando tráfego desnecessário.<br />Aumento na segurança: Através das VLANs pode-se fazer uma separação já no nível de enlace, dificultando o acesso para possíveis invasores que não fazem parte da LAN virtual. Além disso, somente o tráfego que se deseja rotear é repassado entre VLANs. Mas fique alerta: os equipamentos utilizados podem conter falhas na implementação de VLANs e permitir algum tipo de repasse de dados.<br />Geração de grupos virtuais de trabalho: Grupos afins podem estar virtualmente interligados através de VLANs, mesmo quando não estão fisicamente interconectados na mesma sub-rede física, comunicando-se mais rapidamente e com mais segurança, sem gerar tráfego desnecessário para outros grupos.<br />Administração facilitada: O processo de reconfiguração com VLANs é bastante facilitado, isto é, a adição de máquinas ou sub-redes a uma VLAN e feito de forma lógica, sem que sejam necessárias mudanças físicas. Os switches em geral possuem interfaces de configuração baseadas em web, simples e intuitivas.<br />Redução de custos: Além da redução do custo de administração, o emprego de VLANs pode evitar a aquisição de roteadores, caso seja usado um switch com suporte a roteamento entre VLANs (comumente conhecido como switch camada 3). Uma outra opção é empregar uma máquina máquina Linux com suporte a VLANs, agindo como roteador da rede.<br />Aprendendo mais sobre VLANs: o protocolo IEEE 802.1Q<br />Um conceito fundamental para a utilização de VLANs é a introdução de quadros rotulados (tagged frames, em inglês). Os quadros são as unidades de informação compartilhadas no nível de enlace, isto é, o que efetivamente a sua placa de rede irá colocar no barramento. O quadro irá sofrer uma alteração como descrita na Figura 1, onde a identificação da VLAN é adicionada ao quadro ethernet. Isto torna o quadro incompatível com os padrões antigos, requerendo equipamentos e sistemas operacionais com capacidade de lidar com VLANs. é através destes rótulos (tags, em inglês) que é possível identificar a que VLANs um determinado quadro pertence. As VLANs são padronizadas através do protocolo IEEE 802.1Q [1], que prevê quadros especiais para ethernet, token ring e FDDI.<br />Os quadros enviados pelas estações em geral não possuem nenhum tipo de suporte a VLANs e são rotulados ao passarem por switches com uma configuração de VLAN ativa. Isto irá requerer um processamento do quadro, com a inclusão do tag, recálculo do FCS (Frame Check Sequence, um CRC de 32 bits situado ao final do quadro ethernet, usado para verificação da integridade do quadro) e do campo de preenchimento (padding, bytes adicionados para que o tamanho mínimo do quadro ethernet seja obedecido). O procedimento inverso terá que ser feito ao se entregar um quadro para uma estação destino que não é capaz de entender o protocolo 802.1Q. Na Figura 2 pode-se ver esta operações de inclusão e remoção de rótulos, representados em vermelho.<br />O processo de inclusão do tag irá depender do tipo de equipamento que se possui, sendo que nem todos possuem os mesmos métodos. De acordo com a complexidade do equipamento e da camada do modelo OSI/ISO na qual ele opera, métodos diferentes podem ser usados. Entre os métodos mais comuns, tem-se:<br />Baseado em portas (camada 1). Neste caso, a configuração é feita associando-se portas do seu equipamento de rede com números de VLANs, denominados VLAN IDs. Assim todo tráfego que chegar por estas portas será rotulado de acordo com o VLAN ID configurado. Todo tráfego com o mesmo número de VLAN ID passará então a fazer parte da mesma sub-rede lógica, não importando de onde estejam vindo. Esta configuração é muito comum em switches, onde as estações que não usam quadros com rótulos são conectadas. O switch irá adicionar o rótulo ao receber um quadro da estação e remover ao devolver. Este método irá requerer uma reconfiguração do switch caso a estação seja levada para outro lugar.<br />Baseado em MACs (camada 2). Basicamente é feita uma tabela onde se associa endereços MACs a endereços de VLAN. O MAC (Media Access Control) é o endereço de enlace da placa de rede, também chamado de endereço de hardware, que pode ser obtido através do comando ifconfig.<br />Obviamente, este método pode ser bastante enfadonho quando o número de endereços for grande e requer bastante configuração manual.<br />Baseado em subnets (camada 3). Requer um equipamento que opere também na camada 3, de forma que uma tabela tabela de endereços de VLAN ID versus endereços de sub-redes possa ser especificada. São equipamentos mais caros e fora do escopo deste artigo.<br />Tipos menos usuais mas bastante interessantes e previstos na norma 802.1Q são VLANs definidas por protocolos de aplicação (por exemplo, o tráfego de email poderia ser feito em uma VLAN enquanto o de FTP em outra), endereços de multicasting e tipos de protocolos presente no quadro Ethernet (IP e IPX poderiam estar em VLANs diferentes, já que isto pode ser previsto diretamente através do quadro Ethernet, via consulta ao campo Protocol Type.<br />Outro conceito presente no jargão de VLANs é o de tronco (trunk). Um tronco é uma conexão física entre dois equipamentos que possuem implementação de VLANs. Neste caso, podem ser trocados quadros de diversas VLANs entre eles. Por exemplo, suponha um switch e um roteador interligados, ambos com suporte a VLANs. Os quadros trocados entres eles precisam levam consigo a informação de VLAN de forma que o roteador possa executar o roteamento adequadamente. Geralmente cada VLAN é definida no roteador e associada com um endereço de sub-rede, facilitando o trabalho de construção de rotas e geração de regras de firewall. é interessante que as conexões do tipo tronco possuam um banda passante (thoughput) maior do que as outras portas, já que o tráfego por ela será provavelmente maior.<br />O protocolo também define o conceito de Links de Acesso (Access Links) como o segmento que multiplexa um ou mais dispositivos que não possuem VLANs numa porta de um equipamento com VLANs habilitadas. Desta forma, através deste equipamento (geralmente uma bridge ou switch) é possível agregar a informação de VLAN aos quadros. Na Figura 3 são ilustradas estas situações. Suponha que no switch com VLAN as duas primeiras portas estejam associadas às VLANs A e B, respectivamente, e que no roteador exista uma interface de rede virtual associadas às subnets A e B. Através das portas do switch com VLAN, todo o tráfego proveniente das subnets é rotulado e o domínio de broadcast se torna limitado, não sendo repassado entre as sub-redes. Este tráfego rotulado chega até o roteador através de um link tronco, capaz de levar diferentes tipos de VLANs. Finalmente, no roteador, as ações de roteamento e firewall são tomadas.<br />Configuração do Switch<br />O primeiro passo é configurar adequadamente o switch. Isto irá depender do equipamento que se possui, já que não existe uma padronização de configuração. O exemplo de configuração apresentado aqui será genérico, de forma que possa ser traduzido em configurações específicas de um determinado fabricante. Lembre-se de consultar o manual do equipamento em caso de dúvida. Observe na Figura 8 que é necessário apenas um switch capaz de gerenciar VLANs. Ou outros equipamentos podem ser comuns e encarados como links de acesso.<br />Foi usada uma configuração baseada em portas (Figura 5). As portas 3 e 4 foram associadas à VLAN ID 10, a 5 e 6 à VLAN ID 20 e a 7 e 8 à VLAN ID 30. Note que estas portas também foram marcadas como não rotuladas, isto é, untagged. Isto significa que elas estão ligadas a equipamentos que usam quadros ethernet normais. Assim, todo tráfego que se originar delas deve receber o TAG da VLAN ao entrar no switch e todo quadro que for direcionado para elas deve ter o TAG de VLAN removido. A porta 1 foi configurada como uma porta rotulada (tagged). Note que está porta pertence a todas as outras VLANs definidas. Por ser rotulada, todos os quadros ethernet que saem ou entram pela porta 1 possuem o o TAG de VLAN. Nesta porta deverá estar ligado o roteador, rodando um kernel Linux com suporte a VLAN. Como todos os quadros são rotulados, é possível distinguir o tráfego proveniente de cada VLAN.<br />Para não se ter um problema de performance caso o tráfego seja muito alto, é interessante usar um switch que possua pelo menos uma porta de um gigabit, associando o tráfego da porta 1 a ela e colocando no servidor uma placa de um gigabit. Use placas comuns caso o switch não possua portas de um gigabit.<br />Configuração do Kernel<br />Kernels da linha 2.4 ou 2.6 já possuem suporte à VLANs. Veja se este suporte está compilado no kernel, através do comando insmod 8021q. Se for necessário recompilar o kernel, selecione as opções:<br />[M] Network options->802.1Q VLAN support<br /><*> Network options->packet socket<br /><*> Network options->socket filtering<br />As opções packet socket e socket filtering são necessárias caso se deseje rodar um servidor DHCP ou aplicativos como tcpdump. Devido às mudanças no quadro ethernet, estes programas não irão mais funcionar sem estas opções habilitadas, já que esperam um quadro ethernet tradicional. Se preferir, compile o suporte a VLAN diretamente no kernel e não como módulo.<br />Recompile e instale o novo kernel. Se compilou como módulo, carregue o módulo. Você deverá ver uma mensagem parecida com a seguinte, indicando o sucesso:<br /># insmod 8021q<br /># dmesg | grep 802<br />802.1Q VLAN Support v1.8 Ben Greear <greearb--arroba--candelatech--dot--com><br />Será necessário instalar também os programas de modo de usuário para uso com VLANs. No Debian, este pacote se chama vlan e pode ser instalado com apt-get install vlan. Ou então, baixe os fontes do programa [2], compile e instale.<br />Criando VLANs<br />A criação de VLANs em Linux passa pelo comando vconfig. Basicamente ele irá criar novas interfaces de redes virtuais à partir de uma interface de rede real, atribuindo números de VLANs diferentes para cada rede criada. A sintaxe básica do comando para adicionar e remover interfaces de redes virtuais associadas a VLANs está a seguir:<br /># vconfig add interface VLANID<br /># vconfig rem interface<br />Para simplificar, o script em bash vlan.sh, dado a seguir, pode ser usado para automatizar todo o processo. Considere a interface eth0 como sendo a da rede interna, com IP 10.0.1.1 e a interface eth1 como sendo a da rede externa, com IP 10.0.2.1. O gateway default será considerado como 10.0.2.2. Todo o processo de configuração das interfaces e VLANs está descrito no arquivo a seguir:<br />#!/bin/bash<br /># Sintaxe: vlan.sh [start|stop]<br />VCONFIG=/sbin/vconfig<br />case quot;
$1quot;
in<br /> start)<br /> echo quot;
Criando vlans...quot;
<br /> ifconfig lo 127.0.0.1 netmask 255.0.0.0 up<br /> ifconfig eth0 10.0.1.1 netmask 255.255.255.0 up<br /> ifconfig eth1 10.0.2.1 netmask 255.255.255.0 up<br /> $VCONFIG add eth0 10<br /> ifconfig eth0.10 10.0.10.1 netmask 255.255.255.0 up<br /> $VCONFIG set_flag eth0.10 1<br /> $VCONFIG add eth0 20<br /> ifconfig eth0.20 10.0.20.1 netmask 255.255.255.0 up<br /> $VCONFIG set_flag eth0.20 1<br /> $VCONFIG add eth0 30<br /> ifconfig eth0.30 10.0.30.1 netmask 255.255.255.0 up<br /> $VCONFIG set_flag eth0.30 1<br /> <br /> route add default gw 10.0.2.2<br /> echo 1 > /proc/sys/net/ipv4/ip_forward<br /> ;;<br /> stop)<br /> echo quot;
Removendo vlans ...quot;
<br /> echo 0 > /proc/sys/net/ipv4/ip_forward<br /> route del default gw 10.0.2.2<br /> ifconfig eth1 down<br /> $VCONFIG rem eth0.10<br /> $VCONFIG rem eth0.20<br /> $VCONFIG rem eth0.30<br /> ifconfig eth0 down<br /> ifconfig lo down<br /> <br /> ;;<br /> *)<br /> echo quot;
vlan.sh [stop|start]quot;
<br /> exit 1<br /> ;;<br />esac<br />exit 0<br />Após inicializar a configuração de VLANs com ./vlan.sh start, o comando ifconfig deverá mostrar as interfaces a seguir (a saída do comando foi simplificada):<br />eth0 Link encap: Ethernet HWaddr 00:11:43:3E:15:D0 <br /> inet addr:10.0.1.1 Bcast:10.255.255.255 Mask:255.255.255.0<br />eth1 Link encap:UNSPEC HWaddr 00:11:43:3E:F2:E1 <br /> inet addr:10.0.2.1 Bcast:10.255.255.255 Mask:255.255.255.0<br />eth0.10 Link encap:Ethernet HWaddr 00:11:43:3E:15:D0 <br /> inet addr:10.0.10.1 Bcast:10.255.255.255 Mask:255.255.255.0<br />eth0.20 Link encap:Ethernet HWaddr 00:11:43:3E:15:D0 <br /> inet addr:10.0.20.1 Bcast:10.255.255.255 Mask:255.255.255.0<br />eth0.30 Link encap:Ethernet HWaddr 00:11:43:3E:15:D0 <br /> inet addr:10.0.30.1 Bcast:10.255.255.255 Mask:255.255.255.0<br />lo Link encap:Local Loopback <br /> inet addr:127.0.0.1 Mask:255.0.0.0<br />Note que a interface eth0 e suas derivadas, eth0.10, eth0.20 e eth0.30 possuem o mesmo endereço de hardware. Perceba também que o roteamento entre placas foi ativado, através da opção do kernel IP Forward:<br /># echo 1 > /proc/sys/net/ipv4/ip_forward<br />As rotas existentes para esta configuração são (saída do comando route -n):<br />Kernel IP routing table<br />Destination Gateway Genmask Flags Metric Ref Use Iface<br />10.0.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0<br />10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1<br />10.0.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0.10<br />10.0.20.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0.20<br />10.0.30.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0.30<br />0.0.0.0 10.0.2.2 0.0.0.0 UG 0 0 0 eth1<br />DHCP e VLANs<br />Para um exemplo realmente completo, seria bem vindo habilitar a atribuição automática de IPs para as estações via DHCP em todas as VLANs. Isto pode ser feito sem grandes problemas, uma vez que as interfaces de rede já estão adequadamente configuradas. Instale um DHCP server (apt-get install dhcp3-server, no Debian), e use a seguinte configuração mínima para o arquivo /etc/dhcp3/dhcpd.conf (personalize de acordo com as suas necessidades):<br />option domain-name quot;
areias.senai.com.brquot;
;<br />option domain-name-servers ns1.areias.senai.br, ns2.areias.senai.com.br;<br />default-lease-time 600;<br />max-lease-time 7200;<br />authoritative;<br />option ip-forwarding on;<br />subnet 10.0.10.0 netmask 255.255.255.0 {<br /> range 10.0.10.10 10.0.10.254;<br /> option broadcast-address 10.0.10.255;<br /> option routers 10.0.10.1;<br />}<br />subnet 10.0.20.0 netmask 255.255.255.0 {<br /> range 10.0.20.10 10.0.20.254;<br /> option broadcast-address 10.0.20.255;<br /> option routers 10.0.20.1;<br />}<br />subnet 10.0.30.0 netmask 255.255.255.0 {<br /> range 10.0.30.10 10.0.30.254;<br /> option broadcast-address 10.0.30.255;<br /> option routers 10.0.30.1;<br />}<br />As interfaces que terão o DHCP habilitado são especificadas pelo arquivo /etc/default/dhcp3-server, cujo conteúdo está a seguir (este é o padrão para Debian, modifique caso seja diferente na sua distribuição):<br />INTERFACES=quot;
eth0.10 eth0.20 eth0.30quot;
<br />Pronto, agora o servidor/roteador está configurado e fornecendo IPs automaticamente.<br />Conclusão<br />A implementação de VLANs é ainda um tópico pouco explorado em Linux, mas com um potencial enorme de utilização. Uma melhoria que pode ser adicionada é a associação do roteador com regras de firewall, agregando segurança e controle no acesso às sub-redes. Entretanto, dependendo da natureza da sua rede e do volume de dados, um roteador mais potente e com arquitetura dedicada pode ser necessário.<br />Referências<br />[1] IEEE 802.1Q. http://www.ieee802.org/1/pages/802.1Q.html Último acesso em 02 de julho de 2005.<br />[2] 802.1Q VLAN implementation for Linux. http://www.candelatech.com/~greear/vlan.html Último acesso em 02 de julho de 2005.<br />