Howto IPFW2 pt_BR |
Por Guilherme Rosrio | ||||
12/06/2006 | ||||
Firewall IPFW2
Atualmente podemos ativar o suporte a IPFW2. O IPFW2 é uma nova versão do IPFW, com maior flexibilidade no formato das regras e algumas funcionalidades a mais, entre elas: suporte a regras não específicas para TCP ou UDP com número de porta, suporte a blocos OR, keepalives para sessões stateful e filtragem por cabeçalho MAC.
Ativando o IPFW2 Para habilitar o suporte ao ipfirewall e o ipfw2, devemos seguir alguns passos. Inicialmente, o próprio ipfw deverá ser recompilado, para suportar ipfw2. Execute os seguintes comandos: # cd /usr/src/sbin/ipfw Para que quando formos atualizar o sistema e executar um "make buildworld" o make saiba deste detalhe no momento de compilar o ipfw, adicione a linha abaixo ao arquivo /etc/make.conf: IPFW2=TRUE Edite o arquivo de configuração do kernel e insira as seguintes linhas, descritas abaixo: Primeira linha: ativa o ipfirewall, carregando-o estaticamente no kernel.
firewall_enable="YES" Isto fará com que na inicialização seja carregada a configuração "OPEN" do arquivo /etc/rc.firewall. Esta configuração irá adicionar uma regra que libera todo o tráfego. Após reiniciada a máquina, digite o seguinte comando: # ipfw list Será mostrada a lista de regras ativas, que de acordo com a configuração OPEN do arquivo /etc/rc.firewall deverá ser a seguinte: 00100 allow ip from any to any via lo0 Neste momento, todos os pacotes que entram e saem da máquina estão passando por estas regras, na ordem em que estão, definida pelo número da regra (que vai de 1 a 65535). A primeira regra que for atendida irá definir o que fazer com o pacote, e as demais são geralmente ignoradas (em alguns casos específicos o pacote é reinjetado). Regra 100: permite que qualquer pacote IP trafegue na interface lo0 (localhost). Estas regras estão no formato do ipfw1, que também é suportado, para compatibilidade, pelo ipfw2. Lembre-se que todas estas regras foram definidas pelo rc.firewall, exceto a regra de número 65535 (máximo), que é o padrão do ipfirewall, bloquear tudo. Caso seja conveniente que o padrão do firewall seja liberar tudo, ou seja, a regra 65535 seria "allow all from any to any", então deve ser adicionada a seguinte linha na configuração do kernel: options IPFIREWALL_DEFAULT_TO_ACCEPT
Comando IPFW O comando ipfw, de uma forma sucinta, possui os seguintes parâmetros: ipfw [-q] add regra -> Adiciona a regra (ver o formato abaixo). A opção "-q" indica que deverá ser uma operação "silenciosa", não gerando saídas nem relatando as ações. ipfw delete número_regra -> Remove a regra com o número especificado. ipfw list -> Lista as regras ativas. ipfw [-t -d] show -> Lista as regras ativas, incluindo os contadores número de pacotes e número de bytes. O parâmetro -t inclui ainda a data/hora da última ocorrência. O parâmetro -d lista também as regras dinâmicas. ipfw [-q] flush -> Deleta todas as regras. ipfw [-q] zero -> Zera todos os contadores (número de pacotes, número de bytes, número de logs e timestamp). ipfw [-q] resetlog -> Zera o contador número de logs.
Formato das Regras As regras que vimos anteriormente, como foi mencionado, estão no formato do ipfw1, que atualmente também é aceito pelo ipfw2. Pode-se usar este formato para escrever as regras, no entanto é bom se habituar com o novo formato. Quando forem acrescentadas regras no formato novo, o ipfw2 irá automaticamente inserir as palavras "ip from any to any", que fazem parte do formato antigo, e não irão mudar em nada a regra, já que não impões nenhuma restrição, e quem vai ditar a especificação dos pacotes são as opções, explicadas adiante. Este esquema é feito para manter uma certa compatibilidade com o ipfw1. A partir de agora, já podem ser definidas regras para controlar o Firewall. É muito importante se familiarizar com a sintaxe e forma de uso do ipfw, que será o único comando utilizado para controlar o ipfirewall. A formato das regras é o seguinte: [número_regra] [prob probalilidade] ação [log [logamount número] ] corpo_regra [número_regra] [prob probabilidade]
allow count deny divert porta fwd ip[,porta] pipe número queue número reset skipto número tee porta unreach código
A seguir as opções mais importantes: // comentário dst-ip endereço dst-port porta established frag gid grupo icmptypes tipo in | out keep-state limit {ip-origem | porta-origem | ip-destino | porta-destino} número mac mac-destino mac-origem proto protocolo recv interface | xmit interface | via interface setup src-ip endereço src-port porta tcpflags flags uid usuário vrrevpath
Firewall Stateful O funcionamento stateful permite que o firewall crie regras dinâmicas para fluxos específicos de pacotes. Pode-se fazer algumas coisas interessantes, como por exemplo manter o firewall fechado, bloqueando todo tráfego de fora para dentro e permitindo apenas que pacotes da rede interna saiam para a rede externa, passando por uma regra "keep-state". Assim, cada conexão feita de dentro para fora irá criar uma regra dinâmica, que irá liberar aquele tráfego nas duas direções, permitindo que os dados de resposta, por exemplo, uma página web que um usuário acessou, cheguem até a máquina do usuário, na rede interna. Exemplo: # ipfw add 1000 check-state Este conjunto de regras irá, para cada pacote:
Log Para direcionar os logs do ipfw para o arquivo /var/log/ipfw/ipfw.log, primeiramente crie este diretório e este arquivo: # mkdir /var/log/ipfw Então adicione as seguintes linhas ao arquivo /var/log/syslog.conf: !ipfw Após isso, reinicie o syslog, através do comando "killall -HUP syslog". Talvez seja interessante também criar um script que faça a rotação deste log e agendar no Cron, ou adicionar uma entrada no newsyslog.conf, para que o arquivo não fique demasiado grande.
Arquivo de Regras Não é recomendado editar o arquivo /etc/rc.firewall, que vem com o sistema. O seu conjunto de regras deverá ficar em um arquivo separado, exclusivo para isso. Este arquivo poderá ser um script shell ou poderá ser apenas uma listagem de regras, que o ipfw irá interpretar. O tipo de arquivo é uma escolha pessoal, e não fará diferença no funcionamento do firewall.
Deverá ser criado um arquivo, por exemplo /etc/firewall, com dono root e permissão 600. Neste arquivo serão colocadas as regras, que são iguais às passadas via linha de comando ao ipfw, mas sem o comando "ipfw" no começo. Exemplo: add 1000 allow src-ip 10.10.0.0/16 dst-ip 192.168.0.0/16 Para efetuar a inicialização destas regras no momento da inicialização, adicione ou modifique as seguintes linhas no /etc/rc.conf:
A opção firewall_quiet faz com que seja executado o comando "ipfw -q" ao invés de simplesmente "ipfw", ao ler cada regra do arquivo. Dessa forma ocorrerá uma operação "silenciosa", não gerando saídas na tela. Para interpretar um arquivo deste tipo via linha de comando, simplesmente execute "ipfw /etc/firewall".
Script de regras No caso de criamos um script shell com as regras, também deverá ser criado um arquivo exclusivo para isso, como por exemplo /etc/firewall.sh, com dono root e permissão 700. O conteúdo deste arquivo pode ser como você quiser, pois trata-se de um script comum. Quando for passar as regras, o comando ipfw deve ser exatamente como se fosse via linha de comando. É recomendado usar a opção "-q", do comando ipfw, em scripts. firewall_enable="YES" e adicione a seguinte linha: firewall_script="/etc/firewall.sh" Deste ponto em diante, cabe a você decidir como deverá ser o comportamento do seu firewall, tendo em vista a que ele se destina. Sugiro a leitura do livro "Building Internet Firewalls", de D. Brent Chapman e Elizabeth D. Zwicky, da editora O'Reilly. Seguem abaixo algumas regras e um script simples, a título de exemplo.
Exemplos de Regras (não esquecer do comando "ipfw" antes delas): add 100 allow via lo0 Observe os espaços após a "{" e antes da "}". Se não houver este espaço será retornado o seguinte erro: ipfw in free(): warning: modified (chunk-) pointer Estas duas regras acima terão o mesmo efeito que as regras abaixo, no formato antigo, descritas anteriormente: add 100 pass all from any to any via lo0 add 1000 allow src-ip 10.10.0.0/16 dst-port 80 Irá permitir que máquinas da rede 10.10.0.0/16 enviem pacotes com destino a porta 80 e irá permitir que pacotes cheguem até a rede 10.10.0.0/16 com destino a portas entre 1024 e 65535, permitindo por exemplo a resposta de um pedido HTTP. add 1000 allow proto tcp dst-port ssh recv xl0 Irá permitir que a máquina receba conexões TCP pela interface de rede xl0, à porta do ssh, que é a porta 22, conforme definido no arquivo /etc/services. Também irá negar a saída de qualquer pacote com protocolo TCP e com destino a porta do ssh. add 1000 check-state Irá permitir que a rede 10.10.0.0/16 estabeleça qualquer conexão, cujo tráfego de resposta será liberado pelas regras dinâmicas que serão criadas pela regra 1100 e que serão checadas pela regra 1000. Qualquer outro tráfego será bloqueado e logado no arquivo de log. add 50 deny not vrrevpath in Irá bloquear ip-spoofing, conforme explicado anteriormente. add 500 deny log { src-ip 10.0.0.0/8 or dst-ip 10.0.0.0/8 } via xl0 Irá proibir o tráfego de pacotes de redes privadas, conforme definido na RFC1918, na interface de rede xl0. Também irá fazer log quando a regra coincidir com algum pacote. add 100 prob 0.05 deny in Irá bloquear 5% dos pacotes de entrada, como se houvesse perda de pacotes.
#!/bin/sh ipfw="/sbin/ipfw -q" # IP local # Portas de entrada permitidas $ipfw flush
Referencia: http://www2.unijui.tche.br/~heini/freebsd/ipfw2.html
|
||||
ltima Atualizao ( 12/06/2006 ) |