quinta-feira, 19 de dezembro de 2013

Routing on a stick com Linux


Router on a stick é a técnica usada para encaminhar o tráfego de diferentes VLAN's usando um único roteador conectado a uma única porta de transporte (porta trunk ou VLAN tagged). Um roteador deve ter uma interface conectada em cada rede que ele encaminha o tráfego, mas se você não tem o switch layer 3, ou um roteador que tenha suporte à VLAN, você pode usar o Linux. Com uma única porta de rede é possível criar interfaces virtuais e atribuir uma VLAN a cada uma usando o encapsulamento 802.1q. Este pode ser, é claro, um pc modesto com uma distro Linux qualquer instalada. Primeiro basta que a porta do switch esteja configurada como trunk, usando o encapsulamento 802.1q, marcando os frames de saída com o ID da VLAN de origem. A interface do roteador recebe os frames em cada interface virtual segundo a respectiva VLAN. Veja a imagem abaixo:
Existem 3 VLAN's no switch acima, 10, 20 e 30. O servidor, que fará o papel de roteador, está conectado em uma única porta onde tem acesso as 3 VLAN's. O tráfego de uma ou de outra é diferenciado pelo protocolo 802.1q.
Se quiser entender mais sobre VLAN's consulte este artigo.

Em seguida vou criar 3 VLAN interfaces sobre a interface eth0. Com as interfaces criadas você pode referenciá-las para manipular qualquer configuração no sistema, como regras de firewall, roteamento, etc... 


Antes de tudo instale o pacote "vlan". No Debian e derivados seria:
# apt-get install vlan

Em seguida carregue o módulo "8021q", e coloque uma linha para ele no arquivo "/etc/modules", para que seja carregado sempre:

# modprobe 8021q
# echo 8021q >> /etc/modules

Com o módulo carregado pelo kernel você pode exibir as configurações das VLAN interfaces no arquivo "/proc/net/vlan/config". E o comando para manipular as interfaces é o "vconfig":

# cat /proc/net/vlan/config
# vconfig --help

Existem algumas opões quanto à nomenclatura das interfaces, mas você pode alterar usando o "vconfig set_name_type". Por exemplo, as interfaces da vlan 3 podem ser nomeadas como vlan0030 ou vlan30 ou eth0.30. Consulte o help e veja a nomenclatura atual no arquivo "/proc/net/vlan/config":
# cat /proc/net/vlan

Para adicionar uma VLAN interface com VLAN ID 10 na interface eth0 seria:

# vconfig add eth0 10

Veja se a interface foi criada verificando o arquivo "/proc/net/vlan/config". Uma interface será criada com o nome eth0.10 ou vlan10, dependendo do "name-type" definido.
Para remover uma VLAN interface:

# vconfig rem  eth0.10

Você deve declarar as configurações da interface normalmente, exatamente como as interfaces reais, mas com apenas um parâmetro a mais, o que identifica a interface física associada à vlan. No caso do Debian o arquivo é o "/etc/network/interfaces":

auto eth0.10
    iface eth0.10
    inet static address 192.168.10.1
    netmask 255.255.255.0
    network 192.168.10.0
    broadcast 192.168.10.255
    vlan_raw_device eth0

auto eth0.20
    iface eth0.20
    inet static address 192.168.20.1
    netmask 255.255.255.0
    network 192.168.20.0
    broadcast 192.168.20.255
    vlan_raw_device eth0

auto eth0.30
    iface eth0.30
    inet static address 192.168.30.1
    netmask 255.255.255.0
    network 192.168.30.0
    broadcast 192.168.30.255
    vlan_raw_device eth0


Veja que no exemplo defini 3 VLANs na interface eth0, a 10 , a 20 e a 30. Agora você pode montar as configurações da máquina baseadas nas interfaces das VLANs.
Por exemplo, impedir que o tráfego de uma VLAN seja encaminhado para outra:

# iptables -A FORWARD -i eth0.20 -o eth0.30 -j REJECT
# iptables -A FORWARD -i eth0.30 -o eth0.20 -j REJECT
 

Ou definir regras diferentes para uma VLAN no squid:
acl vlan30 src 192.168.30.0/24
acl vlan20 src 192.168.20.0/24
acl youtube dstdomain youtube.com
http_access deny vlan20 youtube


Configuração do Switch

Para que o tráfego chegue na interface da VLAN correta, os frames devem vir com a marcação 802.1q. Para isso a porta do switch deve estar configurada corretamente como trunk e permitindo tráfego das VLAN's desejadas.
Em um switch Cisco a configuração seria:
# switch(config-if) switchport mode trunk
# switch(config-if) switchport trunk allow vlan all


Ou em um switch HP/3com:
# port link-type trunk
# port trunk permit vlan all


Se você usa o Mikrotik RouterOS a coisa pode ser um pouco mais confusa, confira aqui.