Montando um switch (hub) com um computador rodando gnu/linux.

Pra que serve?

Requesitos:

Explicação:

Para montar esse switch, precisaremos fazer com que os pacotes passem através das interfaces de rede transparentemente, é possível fazer isso diretamente com o Iptables, mas pode se preparar para uma boa dor de cabeça.
Para facilitar operaçõess desse tipo existe um módulo no kernel chamado 802.1d Ethernet Bridging, que faz com que as interfaces trabalhem como se fossem apenas uma, então o que vamos fazer é uma pequena configuração para unir todas as placas de rede para trabalharem como se fossem apenas uma, essa técnica é chamada "bridging".

Observações:

  1. A velocidade do seu switch dependera exclusivamente da qualidade das placas que você adicionar a ele, sendo assim se tua rede trabalha a 100Mbps, evite placa de 10Mbps, e assim sucessivamente. Caso isso não seja possível tente um arranjo de forma que as melhores placas peguem os tráfegos mais pesados.
  2. Quando vocé ligar um outro computador ao switch, vocé deverá usar cabos do tipo Crossover.
  3. Se for ligar outro switch ao switch que estamos montando, use preferencialmente cabos parelelos (ou null), porém a maioria dos switchs mais novos trabalham com os dois tipos de cabos sem problemas.
  4. Todos os comandos devem ser executados como root.

Procedimentos:

  1. Verifique a configuração das suas placas de rede:
    Execute o comando dmesg | grep eth , o resultado deveré listar todas as suas interfaces de rede, montei o meu switch com 3 placas, logo possuo três interfaces disponíveis como demonstra o meu resultado:

    root@kram3r:~# dmesg | grep eth
    eth0: RealTek RTL8139 at 0xc382b000, 00:60:67:01:e4:f1, IRQ 11
    eth0: Identified 8139 chip type 'RTL-8139C'
    eth1: VIA VT6105 Rhine-III at 0x6000, 00:02:2a:b7:88:f7, IRQ 9.
    eth1: MII PHY found at address 1, status 0x786d advertising 05e1 Link 0021.
    eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
    NE*000 ethercard probe at 0x220: 00 00 21 fa 11 ff
    eth2: NE2000 found at 0x220, using IRQ 5.

    Lembre-se, em geral o linux comeca a contar do zero, como você pode ver, tenho as interface eth0, eth1 e eth2.
    Se por acaso suas placas não estiverem devidamente configuradas, configure todas corretamente antes de prosseguir, de forma que no boot elas sejam carregadas automaticamente.
  2. Instalacao do pacote bridge-utils:
    Esse pacote é o que prove ferreamentas para que possamos manipular o módulo 802.1d Ethernet Bridging no kernel.
    Se voce é usuário de Debian ou alguma distro debian-like (ubuntu, kurumin...), vocêª pode instalá-lo com o comando:

    aptitude install bridge-utils


    Se voce é usuário slackware, infelizmente não há um pacote oficial para o bridge-utils, mas você pode pegá-lo no LinuxPackages.net, execute o seguinte comando para instalá-lo:

    installpkg bridge-utils-que-vc-baixou.tgz


    Para distros baseadas no redhat, eu não sei se esse pacote vem junto ou não, mas você pode usar o google para achar esse pacote, e o seguinte comando para instalar:

    rpm -ivh pacote.rpm

    Caso você não encontre o pacote certo para a sua distro, corra atrás do código fonte (source), compile e instale.

  3. Desfaça suas configurações de rede atual: De forma que caso você reiniciasse o pc agora, somente os módulos das placas seriam carregados e as interfaces fiquem disponíveis, ou seja, NÃO atribua nenhum endereçp IP para suas placas. Para ter certeza que as placa estão sem endereços, execute o comando:

    ifconfig
    Você deverá ter como retorno somente a loopback:

    root@kram3r:~# ifconfig
    lo Link encap:Local Loopback
    inet addr:127.0.0.1 Mask:255.0.0.0
    UP LOOPBACK RUNNING MTU:16436 Metric:1
    RX packets:24 errors:0 dropped:0 overruns:0 frame:0
    TX packets:24 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:0
    RX bytes:1944 (1.8 Kb) TX bytes:1944 (1.8 Kb)

    Você pode derrubar manualmente as configurações de rede com o comando:

    ifconfig eth0 down


    E assim sucessivamente até todas as interfaces estarem desativadas.

  4. Configurando a bridge:
    Agora chegou a hora da verdade ;)

    Primeiramente, devemos adicionar uma nova bridge ao sistem, que deverá ser feito com o comando:

    brtcl addbr br0


    Agora, deve-se adicionar as interfaces desejadas a bridge, com os comandos:

    brctl addif br0 eth0
    brctl addif br0 eth1
    brctl addif br0 eth2

    Você deverá executar esses até adicionar todas as interfaces desejadas a serem adicionadas a bridge.

    Para conferir se você configurou sua bridge corretamente, use o comando brctl show.

    Tendo as interfaces devidamente adicionadas a bridge, é preciso subir cada interface de rede com endereço IP 0.0.0.0, para isso você deverá executar o seguinte comando para cada interface que incluiu na bridge.

    ifconfig interface 0.0.0.0 up


    Como na minha bridge, eu coloquei as interfaces eth0, eth1 e eth2 eu executei os seguintes comandos:

    ifconfig eth0 0.0.0.0 up
    ifconfig eth1 0.0.0.0 up
    ifconfig eth2 0.0.0.0 up


    Para o switch funcionar, só falta levantar a bridge, que responde pela interface br0, para isso, execute o seguinte comando:

    ifconfig br0 192.168.1.6 netmask 255.255.255.0 broadcast 192.168.1.255

    eu coloquei na minha bridge o ip 192.168.1.6, mas você pode substituí­-lo pelo o que lhe for mais conveniente a sua rede =) Esse IP será o qual switch responderá na rede.

  5. Configurando um gateway para o switch acessar a internet:
    Caso o switch seja uma máquina que esteja dentro da rede, e ainda não tenha uma rota de saída configurada para internet, use o comando route para isso, desta forma:

    route add default gw 192.168.1.2 dev br0

    Troque o valor 192.168.1.2 pelo ip do seu gateway, e não se esqueça de configurar corretamente o dns no arquivo /etc/resolv.conf

  6. Automatizando as configurações:


  7. Se você não fizer a automatização dessas configurações, todas as vezes que desligar e ligar a máquina terá de refazer tudo, então é muito conveniente a automatizaçãoo desse processo, vou deixar as configurações como se fosse para a meu switch, então é só você copiar, colar e alterar devido suas necessidades.

    Para Slackware: edite o arquivo /etc/rc.d/rc.local e adicione as seguintes linhas:
    brctl addbr br0
    brctl addif br0 eth0
    brctl addif br0 eth1
    brctl addif br0 eth2
    ifconfig eth0 0.0.0.0
    ifconfig eth1 0.0.0.0
    ifconfig eth2 0.0.0.0
    ifconfig br0 192.168.1.6 netmask 255.255.255.0 broadcast 192.168.1.255
    route add default gw 192.168.1.2 dev br0

    Para Debian: edite o arquivo /etc/network/interfaces e adicione as seguintes linhas:
    auto br0
    iface br0 inet static
    address 192.168.1.6
    network 192.168.1.0
    netmask 255.255.255.0
    broadcast 192.168.1.255
    gateway 192.168.1.2
    bridge_ports eth0 eth1 eth2

    Para RedHat: Não sei! Se tu souber manda ae que eu complemento :P

  8. Filtrando os pacotes com Iptables:
    Você poderá trabalhar normalmente com o iptables para fazer a sua segurança, só tenha em mente que os pacotes na interface br0 estão atravessando-na.

Bibliografia:
Eu tive a idéia de montar um switch com um computador com gnu/linux a partir do artigo sobre Bridge localizado no Guia Foca Gnu/Linux Avançado

Autor & Dúvidas