Archive for Endian Firewall

Balanceamento de 2 links no Endian Firewall

Instalei um firewall usando Endian, onde o mesmo tinha 2 links de acesso a internet.

Configure a interface que será o link principal, depois vá em:

Rede > Interfaces

E configure o outro link, normalmente.

O de 2mb, adicione apenas os serviços como e-mail e site.
E o outro de 20MB para acesso da rede local da seguinte forma:

Rede > Routing > Policy Routing e criei as regras.

Tudo que for da Lan, vá para o Link de 20mb.
Tudo que for da DMZ, vá para o Link de 2mb.

O problema apresentado foi, que o link de 20mb está saindo apenas com 2mb.
E analisando a saída de tráfego, é como se o link de 20mb estivesse saindo pela interface de 2mb, no caso a interface eth3, assim limitando a conexão.

Usando traceroute, route, ip route e iptables, para verificar se o Endian estava tratando corretamente as rotas, ficou evidente que ele não estava especificando as metricas das routas e nem mostrava o gateway do segundo link.

Para resolver esta questão, foi preciso logar como root via ssh e executar:

# route del default
# ip route add default equalize scope global nexthop via IP_LINK1 dev IF_LINK1 weight 1 nexthop via IP_LINK2 dev IF_LINK2 weight 1

Adicione no arquivo /var/efw/inithooks/start.local estes 2 comandos, espere alguns minutos após a execução destes comandos e verifique se está tudo ok.

Assim finalizo a série de posts sobre o Endian Firewall.

Fontes:

http://efwsupport.com/index.php?topic=854.0
http://www.efwsupport.com/index.php?topic=54.0
http://bugs.endian.com/view.php?id=2816
http://bugs.endian.com/view.php?id=1132
http://bugs.endian.com/view.php?id=444

Compilação no Endian.

A mais ou menos 9 meses, tive uma tarefa muito interessante de realizar.

Precisei configurar um Endian na versão 2.4.0, em uma máquina com 3 placas de rede, onde duas tinha chips da Agere Systems e outra era onboard.

As placas com chipset: Agere Systems ET-131x PCI-E Ethernet Controller, não tem suporte no endian, foi necessário compilar o driver específico para a mesma. Os procedimentos abaixo dão suporte necessário para fazer a compilação do driver.

Dar acesso a internet ao Endian:

# route add default gw 192.168.0.100
# echo “nameserver 192.168.0.251” > /etc/resolv.conf

Atualizar o Endian e mudar de repositório:

# efw-upgrade
# efw-upgrade -s

Escolha development, digite seu e-mail. Reboot!

Agora utilizando o smart para instalar o kernel-PAE, já que não consegui achar o kernel padrão para desenvolvimento.
O kernel PAE dá suporte a mais de 4GB de ram, de acordo com informações encontradas na internet.

# smart install kernel-PAE

Após executar este comando, ele irá remover o kernel padrão e algumas dependências e instalar o kernel PAE e as dependências necessárias, que são iguais a do kernel padrão.

Reboot!

Se iniciou normalmente, agora, faça um upgrade usando o efw-upgrade ou smart upgrade.
Agora vamos iniciar o processo de instalação dos pacotes necessários para compilação do driver.

Primeiro, baixar os pacotes/fontes do Endian 2.4 Community.

Vamos instalar alguns pacotes para nos ajudar nessa tarefa:

# rpm -Uvh http://archives.fedoraproject.org/pub/archive/fedora/linux/core/3/i386/os/Fedora/RPMS/info-4.7-5.i386.rpm
# rpm -Uvh http://archives.fedoraproject.org/pub/archive/fedora/linux/core/3/i386/os/Fedora/RPMS/wget-1.9.1-17.i386.rpm

Agora vamos baixar e descompactar os pacotes para permitir a compilação do driver:

# wget http://sourceforge.net/projects/efw/files/Development/EFW-2.4-RESPIN/EFW-COMMUNITY-2.4-devel-srpms.tar.gz/download
# tar -xvzf EFW-COMMUNITY-2.4-devel-srpms.tar.gz

Instalamos os pacotes necessários para a compilação:

# cd EFW-COMMUNITY-2.4-201006071652/RPMS/
# rpm -Uvh binutils-2.15.92.0.2-25.endian2.i586.rpm glibc-kernheaders-2.4-9.1.103.EL.endian1.i586.rpm patch-2.5.4-20.endian0.i586.rpm glibc-headers-2.3.4-2.41.endian8.i386.rpm glibc-extras-2.3.4-2.41.endian8.i386.rpm glibc-devel-2.3.4-2.41.endian8.i386.rpm libgomp-4.1.2-14.endian1.i586.rpm gcc4-4.1.2-14.endian1.i586.rpm make-3.81-3.endian0.i586.rpm cpp-3.4.6-10.endian8.i586.rpm autoconf-2.59-7.endian0.noarch.rpm automake-1.9.5-0.endian0.noarch.rpm m4-1.4.3-0.endian0.i386.rpm rpm-build-4.4.2.3-9.endian3.i586.rpm libstdc++-devel-3.4.6-10.endian8.i586.rpm

OBS.: A instalação do rpmbuild é apenas para manter a compatibilidade com o Endian, caso você queria gerar um .rpm do driver se o mesmo estiver conforme as exigências para criação do .rpm.

Criamos um link do gcc apontando para o gcc4:

# ln -s /usr/bin/gcc4 /usr/bin/gcc

Agora vamos trabalhar a compilação do driver, primeiro baixando o driver direto do sourceforge:

# wget -c http://sourceforge.net/projects/et131x/files/et131x-1.2.3-3%20Source/et131x/et131x-1.2.3-3.tar.gz/download

Descompactar e compilar o driver:

# tar -xvzf et131x-1.2.3-3.tar.gz
# cd et131x-1.2.3-3/
# make

Caso não apresente nenhum erro durante a compilação, instale o módulo no sistema:

# make modules_install

Carregue o módulo no sistema:

# gzip et131x.ko
# cp et131x.ko.gz /lib/modules/2.6.27.19-72.e25PAE/kernel/drivers/net/
# gunzip et131x.ko.gz
# insmod et131x.ko

Verifique com o comando dmesg e veja se driver foi carregado:

# dmesg

et131x: module license ‘BSD’ taints kernel.
10/100/1000 Base-T Ethernet Driver for the ET1310, v1.2.3 01/31/2006 15:40:00 by Agere Systems, http://www.agere.com
et131x 0000:01:00.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16
et131x 0000:01:00.0: setting latency timer to 64
# ifconfig eth1 up
# ifconfig eth2 up

Pronto! O dispositivo já devem aparecer na interface web!

OBS.: Caso você tenha realizado uma atualização e tenha apresentado problemas. Reinstale a versão 2.4.0 e não faça nenhuma atualização e realize os passos abaixo.

Faça o download dos pacotes chkconfig-1.3.11.2-1.i586.rpm initscripts-2.4.2-0.endian12.i586.rpm ipac-ng-1.33-2.endian7.i586.rpm iptables-1.4.8-1.endian16.i586.rpm, no site, http://updates.endian.org/stable/pool/ coloque seu e-mail e a senha community.

Depois execute os comandos a seguir:

# cd pacotes
# rpm -Uvh chkconfig-1.3.11.2-1.i586.rpm initscripts-2.4.2-0.endian12.i586.rpm ipac-ng-1.33-2.endian7.i586.rpm iptables-1.4.8-1.endian16.i586.rpm
# reboot

# cd EFW-COMMUNITY-2.4-201006071652/RPMS/
# rpm -e –nodeps kernel kernel-modem-drivers-2.4-15_2.6.27.19_72.e25.i586 kernel-module-openswan-2.6.24-4.endian9_2.6.27.19_72.e25.i586 kernel-module-r8168-8.016.00-3.endian4_2.6.27.19_72.e25.i586
# rpm -Uvh kernel-PAE-2.6.27.19-72.e25.i686.rpm kernel-PAE-devel-2.6.27.19-72.e25.i686.rpm kernel-modem-drivers-PAE-2.4-15_2.6.27.19_72.e25.i586.rpm kernel-module-openswan-PAE-2.6.24-4.endian9_2.6.27.19_72.e25.i586.rpm kernel-module-r8168-PAE-8.016.00-3.endian4_2.6.27.19_72.e25.i586.rpm
# reboot

Agora siga os passos iniciais para compilar o driver.

O log do firewall não estava funcionando.

Foi preciso atualizar o ulogd pra versão: ulogd-2.0.0-0.endian9.i586.rpm

Agora evite atualizações, pois você terá problemas com sua placa de rede e compatibilidade no sistema.

Dica, só compre placas que são suportadas pelo sistema.

Os Links utilizados como solução para a compilação do driver, foram:

http://blog.luizagostinho.com/?p=596
http://blog.luizagostinho.com/?p=733
http://efwsupport.com/index.php?topic=610
http://efwsupport.com/index.php?topic=1155.0
http://efwsupport.com/index.php?topic=1988.0
http://www.efwsupport.com/index.php?topic=628.0

Você pode ver essa solução no link:

http://endian.eth0.com.br/topic/placa-de-rede-com-chipset-agere-system#post-3317

Recomendo frequentar o fórum endian.eth0.com.br.

Problemas de Proxy com AD no Endian Firewall.

Ano passado, no mês novembro depois de vários dias tentando resolver um problema que estava tendo ao ingressar o Endian Firewall 2.4.0 no AD, para controlar as políticas de acesso da internet por grupos, consegui resolver o problema.

E aqui, descrevo como resolvi o problema, apesar desse tempo todo sem postar esta solução, a mesma se encontrava no fórum da comunidade brasileira do Endian, neste link e no Bugs do Endian, neste outro link.

A ocorrência deste bug, era um tanto inconsistente e foi meio complicado ter que reproduzir o mesmo, já que o firewall estava em produção.
Após várias tentantivas, análise de log, força de vontade e tempo, consegui parar os serviços e resolver esta pendência.

Depois de várias tentativas de aplicar as políticas de acesso no proxy o mesmo deixava de funcionar adequadamente, aplicando políticas erradas ou bloqueando tudo.

Depois de várias análises de log e de arquivos de configuração, ficou evidente que o problema estava no script restartdansguardian.py (feito em python).
O problema estava basicamente na listagem de diretórios, que estava sendo considerada como string.

Quando o número de content filters ultrapassava 9, chegando a 10 ou mais, a listagem ficava invertida, como descrito abaixo.

Listagem normal em numeral: 1, 2, 3, 4, 5, 6, 7, 8, 9 e 10.

Listagem utilizando string: 1, 10, 2, 3, 4, 5, 6, 7, 8 e 9.

Isso fez com que o dansguardian gerasse as configurações de forma incorreta, jogando para a variável groupname um valor totalmente diferente das configurações do content filter.
Por exemplo, o arquivo de configuração dansguardianf10.conf responsável pelo grupo Segurança, tinha a variável groupname com o valor “Custo content2“.

A resolução do problema se deu, seguindo os seguintes passos, que deram norte para o debug do script python:

# ls -1 /etc/dansguardian/profiles/ [ Aqui ele mostra a listagem como se fosse string. ]
# ls -1 /etc/dansguardian/profiles/ | sed “s/^\(.\)$/0\1/” | sort | sed “s/^0\(.\)$/\1/” [ Aqui vimos como a listagem deveria ser. ]

OBS.: A listagem pode ser feita usando, sort -n.

Mesmo ao ler o script, não foi achado nada.
Ao executar o comando com a opção de debug, tivemos a resposta:

# restartdansguardian -d [ Mostrou onde se encontrava o erro do script. ]

Agora ao entrar no arquivo /usr/local/bin/restartdansguardian.py.

# vi /usr/local/bin/restartdansguardian.py

Procuramos pela linha que continha “.Include” e chegando a função, def getprofiles() responsável pela criação dos content filters.
O processo de debug se deu ao executar linha por linha da função getprofiles.

def getprofiles():
       if file_exists(DANSGUARDIAN_SETTINGS):
          profiles = glob(DANSGUARDIAN_SETTINGS)
      else:
          profiles = glob(DANSGUARDIAN_SETTINGS_DEFAULT)
      profiles += glob("%s/*/settings" % DANSGUARDIAN_PROFILES)
      profiles = sorted(map(lambda p: os.path.dirname(p), profiles))
      debug(profiles)
      return profiles

O processo.

# python

Python 2.4.6 (#1, Nov 10 2009, 07:02:03)
[GCC 3.4.6 20060404 (e 3.4.6-10.endian8)] on linux2
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import os
>>> import glob
>>> profile = glob.glob (“/var/efw/dansguardian/settings”)
>>> profiles = glob.glob (“/var/efw/dansguardian/settings”)
>>> profiles += glob.glob (“%s/*/settings” % “/var/efw/dansguardian/profiles”)
>>> profiles
[‘/var/efw/dansguardian/settings’, ‘/var/efw/dansguardian/profiles/content2/settings’,
‘/var/efw/dansguardian/profiles/content3/settings’, ‘/var/efw/dansguardian/profiles/content4/settings’,
‘/var/efw/dansguardian/profiles/content5/settings’, ‘/var/efw/dansguardian/profiles/content6/settings’,
‘/var/efw/dansguardian/profiles/content7/settings’, ‘/var/efw/dansguardian/profiles/content8/settings’,
‘/var/efw/dansguardian/profiles/content9/settings’, ‘/var/efw/dansguardian/profiles/content10/settings’,
‘/var/efw/dansguardian/profiles/content11/settings’, ‘/var/efw/dansguardian/profiles/content12/settings’,
‘/var/efw/dansguardian/profiles/content13/settings’, ‘/var/efw/dansguardian/profiles/content14/settings’,
‘/var/efw/dansguardian/profiles/content15/settings’, ‘/var/efw/dansguardian/profiles/content16/settings’]
>>> profiles = sorted(map(lambda p: os.path.dirname(p), profiles))
>>> profiles
[‘/var/efw/dansguardian’, ‘/var/efw/dansguardian/profiles/content10’,
‘/var/efw/dansguardian/profiles/content11’, ‘/var/efw/dansguardian/profiles/content12’,
‘/var/efw/dansguardian/profiles/content13’, ‘/var/efw/dansguardian/profiles/content14’,
‘/var/efw/dansguardian/profiles/content15’, ‘/var/efw/dansguardian/profiles/content16’,
‘/var/efw/dansguardian/profiles/content2’, ‘/var/efw/dansguardian/profiles/content3’,
‘/var/efw/dansguardian/profiles/content4’, ‘/var/efw/dansguardian/profiles/content5’,
‘/var/efw/dansguardian/profiles/content6’, ‘/var/efw/dansguardian/profiles/content7’,
‘/var/efw/dansguardian/profiles/content8’, ‘/var/efw/dansguardian/profiles/content9’]

A descoberta.

>>> profile = glob.glob (“/var/efw/dansguardian/settings”)
>>> profiles = glob.glob (“/var/efw/dansguardian/settings”)
>>> profiles += glob.glob (“%s/*/settings” % “/var/efw/dansguardian/profiles”)
>>> profiles
[‘/var/efw/dansguardian/settings’, ‘/var/efw/dansguardian/profiles/content2/settings’,
‘/var/efw/dansguardian/profiles/content3/settings’, ‘/var/efw/dansguardian/profiles/content4/settings’,
‘/var/efw/dansguardian/profiles/content5/settings’, ‘/var/efw/dansguardian/profiles/content6/settings’,
‘/var/efw/dansguardian/profiles/content7/settings’, ‘/var/efw/dansguardian/profiles/content8/settings’,
‘/var/efw/dansguardian/profiles/content9/settings’, ‘/var/efw/dansguardian/profiles/content10/settings’,
‘/var/efw/dansguardian/profiles/content11/settings’, ‘/var/efw/dansguardian/profiles/content12/settings’,
‘/var/efw/dansguardian/profiles/content13/settings’, ‘/var/efw/dansguardian/profiles/content14/settings’,
‘/var/efw/dansguardian/profiles/content15/settings’, ‘/var/efw/dansguardian/profiles/content16/settings’]
>>> profiles = map(lambda p: os.path.dirname(p), profiles)
>>> profiles
[‘/var/efw/dansguardian’, ‘/var/efw/dansguardian/profiles/content2’,
‘/var/efw/dansguardian/profiles/content3’, ‘/var/efw/dansguardian/profiles/content4’,
‘/var/efw/dansguardian/profiles/content5’, ‘/var/efw/dansguardian/profiles/content6’,
‘/var/efw/dansguardian/profiles/content7’, ‘/var/efw/dansguardian/profiles/content8’,
‘/var/efw/dansguardian/profiles/content9’, ‘/var/efw/dansguardian/profiles/content10’,
‘/var/efw/dansguardian/profiles/content11’, ‘/var/efw/dansguardian/profiles/content12’,
‘/var/efw/dansguardian/profiles/content13’, ‘/var/efw/dansguardian/profiles/content14’,
‘/var/efw/dansguardian/profiles/content15’, ‘/var/efw/dansguardian/profiles/content16’]
>>>

OBS.: The glob module finds all the pathnames matching a specified pattern according to the rules used by the Unix shell. (Tirado das referências do python.)

E ao debugar a linha 174 do script, temos o responsável pelo problema, o sorted.

A solução foi a seguinte. Substituímos a linha abaixo:

profiles = sorted(map(lambda p: os.path.dirname(p), profiles))

Por essas:

#profiles = sorted(map(lambda p: os.path.dirname(p), profiles))
profiles = map(lambda p: os.path.dirname(p), profiles)

Restart no dansguardian e verificamos que as políticas estavam corretas.
Testes foram realizados e mostraram que as políticas agora estavam sendo aplicadas corretamente.

Gostaria de agradecer ao Enderson Maia, que ajudou a debugar o script python. x)

Em brever, mais algumas coisas sobre Endian, Oracle e Arch Linux. Enjoy and happy Arching.

Restaurando backup no Endian em um novo hardware.

Olá,

Hoje tive um contratempo ao tentar restaurar as configurações do Endian Firewall, através de um backup feito.

A máquina a qual o Endian estava instalado apresentou problemas na placa mãe e foi necessário a troca de hardware. Sendo assim, instalei o Endian e fiz a restauração do backup. Ao tentar logar o sistema não funcionava e fui verificar onde o problema estava.

Ao executar o comando ifconfig constatei que as interfaces tinham sido renomeadas para eth3, eth4 e eth5. Ao pesquisar um pouco, achei esta solução.

O problema estava sendo causado pelo /etc/busbusinfotab gerado pelo ethconfig que fica armazenado no arquivo de backup. Editei o arquivo, deixando apenas as interfaces eth3, eth4 e eth5 e modificando os nomes para eth0, eth1 e eth2. Executei um reboot, pronto. Nosso Endian voltando ao seu funcionamento normal.
Caso tenha interesse em remover este arquivo dos próximos backups, faça:

# vi /var/efw/backup/exclude.system

E adiciona a seguinte linha:

etc/businfotab

Até a próxima!

PS.: Tenho algumas dicas, que vou postando aos poucos, pois tem muita informação atrasada para ser colocada no blog. Este ano foi corrido. 😉