sábado, 25 de fevereiro de 2012

Configurando VLANs em Linux (Debian)



Introdução
Configurar uma VLAN no Linux é um processo bastante simples e rápido, bastando alguns conceitos de rede. Porém, se quiser planejar as VLANs de sua rede, será necessário um pouco mais de leitura do que este post, cujo propósito é auxiliar na lembrança do processo.
VLAN é um acrônimo de Virtual Local Area Network. Para utilizar VLAN é necessário um switch que suporte VLAN. Alguns aceitam a configuração de tags apenas, enquanto switches melhores (como o PowerConnect 6200 series) suportam trunk.
A VLAN separa virtualmente redes, adicionando aos cabeçalhos alguns bytes que são utilizados como identificadores. Uma rede que possuir a tag 5 pertence à VLAN5 e seus pacotes não poderão ser ‘sniffados’ por fora, nem trafegados em outra VLAN (exceto haja roteamento para e configuração para tal). Uma das vantagens além de segurança é menor tráfego de rede, além de organização, o que facilita o gerenciamento.
Um servidor por exemplo, poderá estar em qualquer lugar fisicamente e participar de uma rede apenas conectando-o à respectiva porta de sua VLAN. Isso também permite otimização dos recursos físicos, pois um switch poderá ser sub-dividido entre N VLANs, e a economia de espaço físico, energia, manutenção e gerenciamento acaba sendo otimizada. Como tudo, há também um lado negativo; jamais você poderá ter um switch sub-dividido entre N VLANs se não tiver um backup; uma falha (apesar de raro) no equipamento poderá paralizar N ambientes de produção! Em contra-partida é possível ter apenas 1 ou 2 switches de backup atendendo a muitos, desde que haja a possibilidade de backup de sua configuração interna. Com isso, bastará inserir essa configuração em um equipamento de backup e passar a utilizá-lo. Observe que esse método não serve para alta-disponibilidade onde entre as possibilidades, um switch em modo stack pode ser a solução ideal.
Também deve-se considerar que haja uma configuração flexível dos switches, ainda mais se tratando de ambientes de callcenters onde contratos são curtos, protocolos precisam ser bloqueados ou liberados, portas de VLANs precisam ser expandidas, etc. Então nesse caso o ideal seria ter um robô de rede para fazer backup das configurações. Veja um exemplo nesse post, onde fiz um robô de backup em python para recolher configurações de switches de borda de rede Summit.
Nesse exemplo, será descrita a configuração de uma vlan em modo tag. Primeiramente, instala-se o pacote vlan:

apt-get install vlan
Posteriormente, baixe a(s) interface(s) de rede e edite o arquivo de configuração de interfaces /etc/network/interfaces. Uma configuração de exemplo seria:

auto lo
iface lo inet loopback

auto vlan100
iface vlan100 inet static
address 10.0.0.254
netmask 255.255.0.0
network 10.0.0.0
broadcast 10.0.255.255
gateway 10.0.0.1
vlan_raw_device eth0
Se for adicionar mais VLANs à interface física eth0, então:

auto vlan47
iface vlan47 inet static
address 191.168.1.18
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
vlan_raw_device eth0
Pode-se também passar o parâmetro mtu no bloco de configuração de uma VLAN:

mtu 1500
Na interface do switch será necessário que esteja configurada a(s) respectiva(s) VLAN(s).
Com um restart no serviço de rede (/etc/init.d/network restart) deverá aparecer algo como:

Set name-type for VLAN subsystem. Should be visible in /proc/net/vlan/config
Added VLAN with VID == 100 to IF -:eth0:-
Set name-type for VLAN subsystem. Should be visible in /proc/net/vlan/config
Added VLAN with VID == 47 to IF -:eth0:-
Utilizando o comando vconfig
O comando vconfig permite que se faça a configuração manual da VLAN de uma maneira bastante simples:

vconfig add eth0 100
Especificamente durante a escrita desse post, enquanto fazia o processo para descrevê-lo me deparei com essa mensagem:

WARNING: Could not open /proc/net/vlan/config. Maybe you need to load the 8021q module, or maybe you are not using PROCFS??
Added VLAN with VID == 100 to IF -:eth0:-

De qualquer forma a VLAN foi adicionada, mas então fiz o load do modulo (que é obrigatório):

modprobe 8021q

Se for o caso, adicione a carga do módulo em /etc/modules.
Então, ainda não aparecerá nenhuma configuração na interface. Faça:

ifconfig eth0.100 10.0.0.254 netmask 255.255.0.0 broadcast 10.0.255.255 up
Informações detalhadas sobre a interface VLAN podem ser obtidas no respectivo arquivo criado em /proc:

cat /proc/net/vlan/eth0.100
Para remover uma VLAN, tão simples quanto adicioná-la:

vconfig rem eth0.100
Informações sobre todas as VLANs do sistema:

cat /proc/net/vlan/config
Sendo necessário regra de firewall na interface virtual, basta indicá-la. Exemplo:

iptables -A OUTPUT -o eth0.100 -j ACCEPT

Tanto faz utilizar ‘.’ ou ‘:’, mas prefiro ‘.’ porque ‘:’ é utilizado em ‘port range’.
Uma breve visão do funcionamento
Trunks são feitos entre switches, entre switch e roteador ou entre switch e computador.
Quando um o switch recebe uma quadro unicast com tags, ele procura pelo MAC e a porta que corresponda à VLAN que ele vem marcado. No caso a tag é a marca que adicionamos ao header; nas VLANs de exemplo, 100 para uma e 47 para a outra.
Quando recebido um quadro multicast, ele é distribuido para todas as interfaces participantes da respectiva VLAN.
Quando um computador ou roteador ciente recebe um quadro tagueado, ele examina a tag para determinar a qual interface o quadro pertence. Essa interface virtual pode ter um endereço IP e se comportar basicamente da mesma forma que uma interface física normal (tradução dessa última linha exatamente como descrito nesse excelente documento).
Alguns switches tem o conceito de VLAN nativa, de forma que pacotes não tagueados que chegarem a uma porta receberão a marca da VLAN correspondente. Os switches Dell PowerConnect 6200 series tem essa característica como opcional configurável. Nesse switch se encontram os modos TAG,UNTAG, TRUNK.
Considerando que untagged fará com que o pacote entrante receba a marca definida para aquela porta, tenha atenção de não ter essa configuração ativa em ambas as pontas.
Por um lado, a VLAN é segura pois os pacotes só serão desencapsulados pelo seu destino, mas cita-se 2 principais riscos (cujos riscos não peguei até hoje); leak de uma VLAN para outra, onde pode-se revelar informações sensíveis a respeito de uma dada VLAN. A outra é injeção de pacotes em uma VLAN, mas convenhamos que para ter alguma pessoa ou processo gerando tags para uma VLAN específica DENTRO de sua rede, a coisa está feia.
Um artigo da LinuxJournal (o do link contido no desenrolar desse post) cita esses riscos e seguidamente cita também que em um switch devidamente configurado as chances são mínimas. Em minha opinião, nulas.
As recomendações são as de qualquer administrador de sistema, que seria desativar trunking e negociação trunk em todas as portas, exceto seja uma necessidade; ativar proteção de flood do MAC em todas as portas e por fim, isolar o gerenciamento das VLANs de servidores e estações de trabalho.
A configuração de VLANs em Linux está descrita em muitos artigos que se pode encontrar facilmente pela internet, mas compilei um procedimento mais completo para agilizar um startup, espero que possa ser útil a mais pessoas.

Um comentário:

  1. Excelente Post ! Parabens !!! Eu estou com um problema parecido com esse post. Será que você poderia me dar uma mãozinha ? deixo meu e-mail guerreiro.guilherme@uol.com.br.

    Muito Obrigado

    ResponderExcluir