fwchange

Thobias Salazar Trevisan
Atualizado em 02 Feb 2005



Oi

Esta é a página do programa fwchange. Um shell-script feito para facilitar mudanças rápidas em um firewall.

Introdução

Hoje em dia, firewalls são utilizados desde pequenas/grandes empresas a usuários domésticos. Os administradores têm seus scripts de firewall que podem ter centenas/milhares de linhas. Para realizar mudanças no comportamento do firewall é necessário abrir o script em um editor de texto, procurar onde se deve incorporar a mudança e recarregar as regras. Neste processo perde-se tempo, ainda mais se forem mudanças temporárias. Com o intuito de facilitar e economizar a execução deste processo surgiu o fwchange.

Alguns exemplos de como este script pode ajudar na manutenção:

  1. imagine que você tem um servidor cheio de músicas e vídeos e um amigo pede para você liberar o acesso para ele neste servidor. Realizar todo o processo descrito acima para uma tarefa tão simples é chato.

  2. você tem um servidor de mail que começa a ser bombardeado por spams que estão sendo enviados por um determinado IP e você quer bloqueá-lo no seu firewall.

Para estas e outras situações o fwchange é ideal, pois permite você realizar estas mudanças de maneira extremanente rápida. Ele mantém ainda um histórico das regras que foram executadas através do script e estão ativas no firewall.


fwchange

O fwcange é implementado de maneira genérica, deste modo pode-se adicionar facilmente suporte a diversos tipos de firewalls, como por exemplo: iptables, ipchains, ipfw etc. A interface do programa é a mesma, independente do tipo de firewall utilizado.

Os firewalls suportados atualmente são: iptables e ipchains.

Se o fwchange não tem suporte para o tipo de firewall que você utiliza me envie um mail para adicionarmos.

Atualmente as funções disponíveis são:

ajuda mostra a ajuda de todas as funções
ipblock bloqueia um IP ou uma sub-rede
ipaccept libera um IP ou uma sub-rede
porblock bloqueia uma porta TCP ou UDP
portaccept libera uma porta TCP ou UDP
iplimit limita o número de conexões abertas para um IP ou sub-rede
portlimit limita o número de conexões abertas para uma porta TCP ou UDP


Download & Instalação

O fwchange é implentado no shell bash. As ferramentas necessárias para a sua execução são: bash, sed e grep.

O script está todo em um único arquivo, basta baixá-lo: fwchange. Depois dê permissão de execução:

  prompt> chmod +x fwchange

Dependendo do seu Sistema Operacional algumas variáveis, talvez, precisem ser ajustadas:

Após os ajustes basta executar o fwchange na linha de comando.

OBS: fwchange precisa de permissão de root para ser executado.

  prompt> ./fwchange -h
  Uso: fwchange <função> [<parâmetros>]
       fwchange [--help|--version]
  
       Dica: Para listar as funções disponíveis e a sua ajuda use:
       prompt$ fwchange ajuda
  
       As funções disponíveis atualmente são:
  
  ipblock, ipaccept, portblock, portaccept, iplimit, portlimit, ajuda

Dica: Podem ser utilizados aliases para digitar direto o nome da função na linha de comando:

  prompt> alias ipblock='/root/fwchange ipblock'
  prompt> ipblock --help

Adicione os aliases no seu arquivo .bashrc para serem carregados no login.

Hora da diversão.


As Funções

Para executar é só chamar a função desejada com as suas opções.

Opções Gerais

Algumas considerações sobre as opções que existem em todas as funções:

OBS: Nas opções que têm como parâmetro IP/máscara, a máscara pode ser informada tanto no formato CIDR quanto no dotted decimal. Exemplo: 10.10.10.0/24 ou 10.10.10.0/255.255.255.0


ipblock

Esta função bloqueia um IP ou uma sub-rede. Se nenhum parâmetro for passado ou for '--list' são listados todos os IPs bloqueados. Se a máscara não for especificada é utilizada a /32.

  Uso: ipblock [--chain ...] IP[/netmask] on|off [-c comentário]
               [--list|--help]

Alguns exemplos:

Bloquear um IP:

  prompt>  ./fwchange ipblock 10.10.10.3 on
  fwchange executou os seguintes comandos:
  /sbin/iptables -I INPUT -s 10.10.10.3/32 -j DROP
  /sbin/iptables -I OUTPUT -s 10.10.10.3/32 -j DROP
  /sbin/iptables -I FORWARD -s 10.10.10.3/32 -j DROP

Bloquear uma sub-rede:

  prompt> ./fwchange ipblock 10.10.10.0/24 on
  fwchange executou os seguintes comandos:
  /sbin/iptables -I INPUT -s 10.10.10.0/24 -j DROP
  /sbin/iptables -I OUTPUT -s 10.10.10.0/24 -j DROP
  /sbin/iptables -I FORWARD -s 10.10.10.0/24 -j DROP

Cancelar as regras anteriores:

  prompt> ./fwchange ipblock 10.10.10.3 off
  fwchange executou os seguintes comandos:
  /sbin/iptables -D INPUT -s 10.10.10.3/32 -j DROP
  /sbin/iptables -D OUTPUT -s 10.10.10.3/32 -j DROP
  /sbin/iptables -D FORWARD -s 10.10.10.3/32 -j DROP
  
  prompt> ./fwchange ipblock 10.10.10.0/24 off
  fwchange executou os seguintes comandos:
  /sbin/iptables -D INPUT -s 10.10.10.0/24 -j DROP
  /sbin/iptables -D OUTPUT -s 10.10.10.0/24 -j DROP
  /sbin/iptables -D FORWARD -s 10.10.10.0/24 -j DROP

Especificar quais chains devem ser afetadas pela regra:

  prompt> ./fwchange ipblock --chain forward 10.10.10.3 on
  fwchange executou os seguintes comandos:
  /sbin/iptables -I FORWARD -s 10.10.10.3/32 -j DROP

Adicionar regra com comentário:

  prompt> ./fwchange ipblock 192.168.10.0/24 on -c bloqueia rede do lab
  fwchange executou os seguintes comandos:
  /sbin/iptables -I INPUT -s 192.168.10.0/24 -j DROP
  /sbin/iptables -I OUTPUT -s 192.168.10.0/24 -j DROP
  /sbin/iptables -I FORWARD -s 192.168.10.0/24 -j DROP

Mostrar as regras ativas:

  prompt> ./fwchange ipblock
  ipblock:10.10.10.3/32:FORWARD:
  ipblock:192.168.10.0/24:INPUT,OUTPUT,FORWARD:bloqueia rede do lab


ipaccept

Possui as mesmas opções da função ipblock, mas libera um IP ou uma sub-rede.

  prompt> ./fwchange ipaccept --help
  
  Libera um determinado endereço IP ou uma sub-rede
  OBS1: Se nenhum parâmetro for passado ou for '--list' são listados
  todos os IPs bloqueados por esta função
  OBS2: Os valores possíveis para a opção chain são: INPUT,OUTPUT,FORWARD
  As chains devem estar separadas por vírgula e não pode ter espaços
  entre elas
  
  Uso: ipaccept [--chain ...] IP[/netmask] on|off [-c comentário]
                [--list|--help]
  Ex.: ipaccept 10.10.10.3 on -c bloqueia ip do fulano
  Ex.: ipaccept 10.10.10.3 off
  Ex.: ipaccept 10.10.10.0/24 on
  Ex.: ipaccept --chain INPUT,OUTPUT 10.10.10.0/24 on
  Ex.: ipaccept --list
  


portblock

Bloqueia uma determinada porta TCP ou UDP. Se não for especificado, o protocolo utilizado é o TCP.

  Uso: portblock [--chain ...] [--proto tcp|udp] porta on|off [-c comentário]
                 [--list|--help]

Exemplos:

Bloquear a porta TCP 80:

  prompt> ./fwchange portblock 80 on
  fwchange executou os seguintes comandos:
  /sbin/iptables -I INPUT -p tcp --dport 80 -j DROP
  /sbin/iptables -I OUTPUT -p tcp --dport 80 -j DROP
  /sbin/iptables -I FORWARD -p tcp --dport 80 -j DROP

Bloquear a porta UDP 53:

  prompt> ./fwchange portblock --proto udp 53 on
  fwchange executou os seguintes comandos:
  /sbin/iptables -I INPUT -p udp --dport 53 -j DROP
  /sbin/iptables -I OUTPUT -p udp --dport 53 -j DROP
  /sbin/iptables -I FORWARD -p udp --dport 53 -j DROP

Especificar as chains da regra:

  prompt> ./fwchange portblock --chain input 22 on
  fwchange executou os seguintes comandos:
  /sbin/iptables -I INPUT -p tcp --dport 22 -j DROP

Mostrar as regras ativas desta função:

  prompt> ./fwchange portblock --list
  portblock:tcp-80:INPUT,OUTPUT,FORWARD:
  portblock:udp-53:INPUT,OUTPUT,FORWARD:
  portblock:tcp-22:INPUT:

Apagar as regras anteriores:

  prompt> ./fwchange portblock 80 off
  fwchange executou os seguintes comandos:
  /sbin/iptables -D INPUT -p tcp --dport 80 -j DROP
  /sbin/iptables -D OUTPUT -p tcp --dport 80 -j DROP
  /sbin/iptables -D FORWARD -p tcp --dport 80 -j DROP
  
  prompt> ./fwchange portblock --proto udp 53 off
  fwchange executou os seguintes comandos:
  /sbin/iptables -D INPUT -p udp --dport 53 -j DROP
  /sbin/iptables -D OUTPUT -p udp --dport 53 -j DROP
  /sbin/iptables -D FORWARD -p udp --dport 53 -j DROP
  
  prompt> ./fwchange portblock 22 off
  fwchange executou os seguintes comandos:
  /sbin/iptables -D INPUT -p tcp --dport 22 -j DROP


portaccept

Possui as mesmas opções da função portblock, mas libera uma porta TCP ou UDP.

  prompt> ./fwchange portaccept -h
  
  Libera uma determinada porta tcp ou udp
  OBS: se não for especificado, o protocolo utilizado é o tcp
  
  Uso: portaccept [--chain ...] [--proto tcp|udp] porta on|off [-c comentário]
                  [--list|--help]
  Ex.: portaccept 80 on
  Ex.: portaccept --proto udp 53 on
  Ex.: portaccept --proto udp 53 off
  Ex.: portaccept --chain input 22 on
  Ex.: portaccept --list
  


iplimit

Limita o número de conexões abertas (NEW) de um IP ou sub-rede.

OBS: Esta opção só está disponível para firewall iptables.

  Uso: iplimit [--chain ...] IP[/netmask] intervalo escala on|off [-c comentário]
               [--list|--help]

A escala pode ser: 'second', 'minute', 'hour' ou 'day'

Exemplos:

Limitar um IP para 2 conexões por dia:

  prompt> ./fwchange iplimit 10.10.10.3 2 day on
  fwchange executou os seguintes comandos:
  /sbin/iptables -N fwchange-10.10.10.3/32
  /sbin/iptables -A fwchange-10.10.10.3/32 -s 10.10.10.3/32 -m limit --limit 2/day --limit-burst 2 -j RETURN
  /sbin/iptables -A fwchange-10.10.10.3/32 -s 10.10.10.3/32 -j REJECT
  /sbin/iptables -I INPUT -s 10.10.10.3/32 -m state --state NEW -j fwchange-10.10.10.3/32
  /sbin/iptables -I OUTPUT -s 10.10.10.3/32 -m state --state NEW -j fwchange-10.10.10.3/32
  /sbin/iptables -I FORWARD -s 10.10.10.3/32 -m state --state NEW -j fwchange-10.10.10.3/32

Limitar uma sub-rede na chain input para 5 conexões por segundo:

  prompt> ./fwchange iplimit --chain input 10.10.10.0/255.255.255.0 5 second on
  fwchange executou os seguintes comandos:
  /sbin/iptables -N fwchange-10.10.10.0/24
  /sbin/iptables -A fwchange-10.10.10.0/24 -s 10.10.10.0/24 -m limit --limit 5/second --limit-burst 5 -j RETURN
  /sbin/iptables -A fwchange-10.10.10.0/24 -s 10.10.10.0/24 -j REJECT
  /sbin/iptables -I INPUT -s 10.10.10.0/24 -m state --state NEW -j fwchange-10.10.10.0/24

Mostrar as regras:

  prompt> ./fwchange iplimit
  iplimit:10.10.10.3/32:2:day:INPUT,OUTPUT,FORWARD:
  iplimit:10.10.10.0/24:5:second:INPUT:

Apagar as regras anteriores:

  prompt> ./fwchange iplimit 10.10.10.3 2 day off
  fwchange executou os seguintes comandos:
  /sbin/iptables -D INPUT -s 10.10.10.3/32 -m state --state NEW -j fwchange-10.10.10.3/32
  /sbin/iptables -D OUTPUT -s 10.10.10.3/32 -m state --state NEW -j fwchange-10.10.10.3/32
  /sbin/iptables -D FORWARD -s 10.10.10.3/32 -m state --state NEW -j fwchange-10.10.10.3/32
  /sbin/iptables -F fwchange-10.10.10.3/32
  /sbin/iptables -X fwchange-10.10.10.3/32
  
  prompt> ./fwchange iplimit 10.10.10.0/255.255.255.0 5 second off
  fwchange executou os seguintes comandos:
  /sbin/iptables -D INPUT -s 10.10.10.0/24 -m state --state NEW -j fwchange-10.10.10.0/24
  /sbin/iptables -F fwchange-10.10.10.0/24
  /sbin/iptables -X fwchange-10.10.10.0/24


portlimit

Limita o número de conexões abertas de uma porta TCP ou UDP.

OBS: Esta opção só está disponível para firewall iptables.

  Uso: portlimit [--chain ...] [--proto tcp|udp] porta intervalo escala on|off [-c comentário]
                 [--list|--help]

A escala pode ser: 'second', 'minute', 'hour' ou 'day'

Exemplos de uso:

Limitar o número de conexões na porta 80 para 5 por segundo:

  prompt> ./fwchange portlimit 80 5 second on
  fwchange executou os seguintes comandos:
  /sbin/iptables -N fwchange-tcp:80
  /sbin/iptables -A fwchange-tcp:80 -p tcp --dport 80 -m limit --limit 5/second --limit-burst 5 -j RETURN
  /sbin/iptables -A fwchange-tcp:80 -p tcp --dport 80 -j REJECT
  /sbin/iptables -I INPUT -p tcp --dport 80 -m state --state NEW -j fwchange-tcp:80
  /sbin/iptables -I OUTPUT -p tcp --dport 80 -m state --state NEW -j fwchange-tcp:80
  /sbin/iptables -I FORWARD -p tcp --dport 80 -m state --state NEW -j fwchange-tcp:80

Limitar o número de conexõs na chain input da porta udp 123 para 2 por dia:

  prompt> ./fwchange portlimit --chain input --proto udp 123 2 day on
  fwchange executou os seguintes comandos:
  /sbin/iptables -N fwchange-udp:123
  /sbin/iptables -A fwchange-udp:123 -p udp --dport 123 -m limit --limit 2/day --limit-burst 2 -j RETURN
  /sbin/iptables -A fwchange-udp:123 -p udp --dport 123 -j REJECT
  /sbin/iptables -I INPUT -p udp --dport 123 -m state --state NEW -j fwchange-udp:123

Listar as regras:

  prompt> ./fwchange portlimit
  portlimit:tcp-80:5:second:INPUT,OUTPUT,FORWARD:
  portlimit:udp-123:2:day:INPUT:

Apagar as regras:

  prompt> ./fwchange portlimit 80 5 second off
  fwchange executou os seguintes comandos:
  /sbin/iptables -D INPUT -p tcp --dport 80 -m state --state NEW -j fwchange-tcp:80
  /sbin/iptables -D OUTPUT -p tcp --dport 80 -m state --state NEW -j fwchange-tcp:80
  /sbin/iptables -D FORWARD -p tcp --dport 80 -m state --state NEW -j fwchange-tcp:80
  /sbin/iptables -F fwchange-tcp:80
  /sbin/iptables -X fwchange-tcp:80
  
  prompt> ./fwchange portlimit --proto udp 123 2 day off
  fwchange executou os seguintes comandos:
  /sbin/iptables -D INPUT -p udp --dport 123 -m state --state NEW -j fwchange-udp:123
  /sbin/iptables -F fwchange-udp:123
  /sbin/iptables -X fwchange-udp:123


Controle de Mudanças

O fwchange tem total controle através do arquivo de histórico de quais regras estão ativas. Deste modo não deixa você bloquear/aceitar/limitar duas vezes o mesmo IP/porta bem como retirar regras que não estão ativas.

  prompt> ./fwchange ipblock 10.10.10.3 on
  fwchange executou os seguintes comandos:
  /sbin/iptables -I INPUT -s 10.10.10.3/32 -j DROP
  /sbin/iptables -I OUTPUT -s 10.10.10.3/32 -j DROP
  /sbin/iptables -I FORWARD -s 10.10.10.3/32 -j DROP
  
  prompt> ./fwchange ipblock 10.10.10.3 on
  IP 10.10.10.3/32 ja esta bloqueado
  
  prompt> ./fwchange ipblock 192.168.1.1 off
  IP 192.168.1.1/32 nao esta bloqueado
  
  prompt> ./fwchange ipaccept 192.168.1.1 off
  IP 192.168.1.1/32 nao esta liberado
  
  prompt> ./fwchange portlimit --proto udp 53 10 second off
  Porta udp 53 nao esta limitada

Para manter consistência das chains do arquivo de histórico e das regras do firewall, quando uma função é chamada com a opção off, as chains são lidas do arquivo de históricos do fwchange, ou seja, ele não respeita as chains passadas na linha de comando:

  prompt> ./fwchange ipblock --chain input,output 10.10.10.3 on
  fwchange executou os seguintes comandos:
  /sbin/iptables -I INPUT -s 10.10.10.3/32 -j DROP
  /sbin/iptables -I OUTPUT -s 10.10.10.3/32 -j DROP
  
  prompt> ./fwchange ipblock --chain forward 10.10.10.3 off
  fwchange executou os seguintes comandos:
  /sbin/iptables -D INPUT -s 10.10.10.3/32 -j DROP
  /sbin/iptables -D OUTPUT -s 10.10.10.3/32 -j DROP


Inspiração

A idéia deste script foi inspirada no artigo de Daniel Robbins Dynamic iptables firewalls .


Fim

Se tiver alguma sugestão/comentário/aviso de bug... me envie um mail:

<thobias at thobias dot org>