Esta é a página do programa fwchange. Um shell-script feito para facilitar mudanças rápidas em um firewall.
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:
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.
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 |
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:
fwhistory='/root/fwchange_history.txt'
ipt='/sbin/iptables'
ipc='/sbin/ipchains'
fw='_ipt'
verbose='1'
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.
Para executar é só chamar a função desejada com as suas opções.
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
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
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
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
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
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
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
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
A idéia deste script foi inspirada no artigo de Daniel Robbins Dynamic iptables firewalls .
Se tiver alguma sugestão/comentário/aviso de bug... me envie um mail:
<thobias at thobias dot org> |