Manual do iptables: IPtables (8) - Manual do IPtables
Nome:
iptables - Ferramenta de administração para filtragem de pacotes IPv4 e NAT
Nota do tradutor: Para pacotes IPv6 deve-se utilizar
ip6tables.
Sinopse:
iptables [-t table] {-A|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
Descrição
O iptables é utilizado para configurar, manter e inspecionar as tabelas de regras de filtragem de pacotes IPv4 no kernel do
Linux. Várias tabelas diferentes podem ser definidas. Cada tabela contém um número de
chains (correntes, cadeias) internas e também pode conter chains definidas pelo usuário.
Cada chain é uma lista de regras que podem combinar com um conjunto de pacotes. Cada regra especifica o que fazer com um pacote que combina com a regra. Isto é chamado de
target, que pode ser um salto na mesma tabela para uma chain definida pelo utilizador.
Alvos (Targets)
Uma regra de firewall especifica os critérios para um pacote e um alvo. Se o pacote não corresponder, a regra seguinte na chain é examinada e, se o pacote for igual, então a próxima regra é especificada pelo valor do alvo, o que pode ser o nome de uma chain definida pelo utilizador ou por um dos valores especiais ACCEPT, DROP, QUEUE ou RETURN:
- ACCEPT: significa deixar o pacote passar.
- DROP: significa descartar o pacote.
- QUEUE: significa passar o pacote para o userspace - espaço do usuário - (o modo como o pacote será recebido por um processo de userspace difere de acordo como determinada fila é manipulada. Os kernels 2.4.x e 2.6.x até 2.6.13, incluem o manipulador de fila "ip_queue". Kernels 2.6.14 e posteriores, incluem o manipulador de fila "nfnetlink_queue". Pacotes com um alvo de fila serão enviados para a fila número '0'. Consulte também o alvo NFQUEUE descrito posteriormente nesta página do manual).
- RETURN: significa parar de atravessar a chain e continuar na próxima regra da chain anterior. Se o final de uma chain "built-in" (embutida) for alcançado ou uma regra de uma chain "built-in" com alvo RETURN for correspondida, o alvo especificado pela política da chain determina o destino do pacote.
Tabelas (Tables)
Geralmente, há três tabelas independentes (as tabelas que estão presentes em qualquer momento dependem das configurações do kernel e dos módulos que estão presentes).
-t, --table table :: Esta opção especifica a tabela correspondente ao pacote que o comando deve executar. Se o kernel estiver configurado com módulo de carga automático, uma tentativa será feita para carregar o módulo apropriado para essa tabela, se ele já não estiver carregado.
As tabelas são, como se segue:
filter :: Esta é a tabela padrão (se a opção "-t" não definir outra tabela, será utilizada esta tabela). Ela contém a chain "built-in INPUT" (entrada - para pacotes destinados a sockets locais, pacotes destinados para a própria máquina), FORWARD (para pacotes sendo roteados através da máquina, pacotes que passam pela máquina) e OUTPUT (para pacotes gerados localmente, pacotes oriundos da própria máquina com destino para fora dela).
* Nota do tradutor: "máquina" significa o servidor ou o desktop no qual o iptables estiver instalado e configurado. O iptables vem em praticamente todas as distribuições
GNU/Linux e para configurá-lo, basta somente criar um arquivo em modo texto, dar permissão de execução e colocá-lo para iniciar junto com o sistema.
A seguir, para os preguiçosos de plantão, três sugestões de ferramentas gráficas (onde aparecem as janelinhas bonitinhas para sair clicando feito um maluco) para administração do iptables:
O iptables lê as regras de cima para baixo, de acordo com cada tabela, ou seja, se uma regra bloquear tudo numa determinada tabela, as exceções (liberações) devem ser colocadas acima desta regra.
Exemplo:
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j REJECT
iptables -A INPUT -p tcp --dport 443 -j DROP
A primeira regra libera, a segunda rejeita e a terceira regra, nega o acesso. A primeira regra é que terá o privilégio, então, o acesso na porta 443 será liberado para todos, mesmo rejeitando e negando o acesso nas regras subsequentes.
Caso queiramos negar o acesso à porta 443 somente para alguns IPs, por exemplo, devemos colocar essas regras ACIMA da primeira regra.
Lembrando que nas regras acima não foi determinada nenhuma tabela (-t), então, elas serão aplicadas somente na tabela padrão, a filter, e, no caso, somente na chain INPUT.
Lembrando também, que o iptables é um módulo do kernel do Linux, portanto, deve estar sendo executado pelo sistema para que possa funcionar. Ou seja, no início do script do iptables deve constar
modprobe: "e_o_nome_do_módulo_o_qual_se_quer_levantar".
Caso você compilar um novo kernel, uma boa prática é colocar o módulo "IP:netfilter configuration" e suplementares (IPv4 NAT, MASQUERADE target support, NETMAP target support, REDIRECT target support etc) como "built-in (*)".
* As chains devem ser sempre colocadas em letras maiúsculas.
nat :: Esta tabela é consultada quando for encontrado um pacote que criou uma nova conexão. É composta de três built-ins: PREROUTING (para alterar pacotes no momento que eles chegam, antes do roteamento ou compartilhamento.), OUTPUT (para alterar pacotes gerados localmente antes do roteamento ou compartilhamento), POSTROUTING (para alterar pacotes quando eles estão prestes a sair, depois do roteamento ou compartilhamento).
mangle :: Esta tabela é usada para a alteração especializada do pacote. Até o kernel 2.4.17 tinha duas chains: PREROUTING (para alterar pacotes recebidos antes do roteamento) e OUTPUT (para alterar pacotes gerados localmente antes do roteamento). Desde o kernel 2.4.18, outras três chains embutidas também são suportadas: INPUT (para pacotes entrando na própria máquina), FORWARD (para alterar pacotes sendo roteados/compartilhados através da máquina), POSTROUTING (para alterar pacotes quando eles estão prestes a sair depois do roteamento/compartilhamento).
raw :: Esta tabela é usada principalmente para a configuração de isenções de rastreamento de conexões em combinação com o alvo NOTRACK. Ela registra os ganchos
netfilter com maior prioridade e é chamada pelo ip_conntrack, ou quaisquer outras tabelas IP.
Ela oferece as seguintes chains:
- PREROUTING: Para pacotes que chegam através de qualquer interface de rede.
- OUTPUT: Para pacotes gerados por processos locais.
Opções: As opções que são reconhecidas pelo iptables, podem ser divididas em vários grupos diferentes.
Comandos
Estas opções especificam a ação que se quer executar. Apenas uma delas pode ser especificada na linha de comando, a menos que seja indicado de outra forma abaixo no script do iptables.
Para versões longas dos nomes de comandos e opções, você precisa usar apenas letras suficientes para garantir que o iptables pode diferenciá-los de todas as outras opções.
-A, --append chain rule-specification :: Anexa uma ou mais regras para o final da chain. Quando a origem e/ou nomes de destino resolverem mais de um endereço, uma regra será adicionada para cada combinação de endereços possíveis.
-D, --delete chain rule-specification
-D, --delete chain rulenum :: Exclui uma ou mais regras da chain especificada. Existem duas versões deste comando: a regra pode ser especificada como um número na chain (rulenum - começando em 1 para a primeira regra) ou o nome da regra para combinar (rule-specification).
-I, --insert chain [rulenum] rule-specification :: Insire uma ou mais regras na chain especificada, pode ser um número para determinada regra. Assim, se o número da regra é um, a regra ou as regras serão inseridas no topo da chain. Este é o padrão se nenhum número de regra for especificado.
-R, --replace chain rulenum rule-specification :: Substitui uma regra na chain especificada. Se a fonte e/ou nomes de destino resolvem vários endereços, o comando irá falhar. As regras são numeradas a partir de 1.
-L, --list [chain] :: Lista todas as regras da chain especificada. Se nenhuma chain for especificada, todas as chains serão listadas. Como qualquer outro comando iptables, é aplicado na tabela especificada (a tabela filter é o padrão).
Então, as regras NAT serão listadas por:
# iptables -t nat -n -L
Note que é geralmente usado com a opção "-n" a fim de evitar longas consultas de DNS reverso. É interessante especificar a opção "-Z" (zero), daí a(s) chain(s) serão atomicamente listadas e zeradas. A saída exata é afetada pelos outros argumentos utilizados.
As regras exatas são então suprimidas até utilizar:
# iptables -L -v
-S, --list-rules [chain] :: Mostra todas as regras da chain especificada. Se nenhuma chain for especificada, todas as chains serão mostradas como o comando iptables-save. Como qualquer outro comando iptables, é aplicado na tabela especificada (a tabela filter é a padrão).
-F, --flush [chain] :: Limpa a chain especificada (limpa todas as chains da tabela se não for passado nenhum argumento). Isto é equivalente a apagar todas as regras, uma por uma.
-Z, --zero [chain [rulenum]] :: Zera os contadores de pacotes e bytes em todas as chains, ou apenas na chain de dados, ou apenas na regra dada em uma chain. É aconselhável usar a opção -L, --list para ver os contadores imediatamente antes das regras serem apagadas (veja acima).
-N, --new-chain chain :: Cria uma nova chain definida pelo usuário. Não deve haver nenhuma chain com o mesmo nome.
-X, --delete-chain [chain] :: Elimina uma específica chain criada pelo usuário. Não deve haver referências na chain. Se houver, você deve excluir ou substituir as regras referentes antes da chain ser excluída. A chain deve estar vazia, ou seja, não pode conter quaisquer regras. Se nenhum argumento for passado, o comando tentará apagar cada chain não embutida na tabela.
-P, --policy chain target
Define a política da chain para o alvo especificado. Veja seção TARGETS para os alvos possíveis. Apenas chains "built-in" (não definidas pelo usuário) podem ter políticas. Chains definidas pelo usuário não podem ser alvo de políticas.
-E, --rename-chain old-chain new-chain :: Muda o nome da chain especificada pelo usuário para um novo nome. Trata-se de uma perfumaria e não tem efeito sobre a estrutura da tabela.
-h :: Ajuda. Dá uma descrição (geralmente muito breve) da sintaxe do comando.
Parâmetros
Os parâmetros a seguir, constituem uma especificação de regras (são utilizados como os comandos:
add, delete, insert, replace e
append).
[!] -p, --protocol protocol :: Especifica o protocolo da regra ou do pacote. O protocolo especificado pode ser:
- tcp,
- udp,
- udplite,
- icmp,
- esp,
- ah,
- sctp,
- all.
Ou, pode ser um valor numérico representando um destes protocolos ou um outro protocolo. Um nome de protocolo do arquivo
/etc/protocols também é permitido. O argumento "!", antes do protocolo, inverte a regra. O número zero é equivalente a "all". O protocolo "all" combina todos os protocolos e é tomado como padrão quando esta opção for omitida.
[!] -s, --source address[/mask][,...] :: Especificação da origem. "Address" pode ser um nome de rede, um host, um endereço IP de rede (com "/mask", máscara), ou um endereço IP simples.
Os hostnames serão resolvidos apenas uma vez antes da regra ser apresentada ao kernel. Note que especificar qualquer nome a ser resolvido com uma consulta remota, como ao DNS, é uma ideia muito ruim.
A máscara pode ser uma máscara de uma rede ou um número simples especificando o número no lado esquerdo da máscara de rede. Assim, uma máscara "/24" é equivalente a 255.255.255.0.
O argumento "!" antes da especificação de endereço, inverte a regra. A flag "--src" é um alias para esta opção. Vários endereços podem ser especificados, mas isso vai se expandir para várias regras (quando for acrescentado "-A") ou causará várias regras a serem excluídas (com "-D").
[!] -d, --destination address[/mask][,...] :: Especificação do destino. Ver a descrição do sinalizador "-s" (source, origem) para uma descrição detalhada da sintaxe. A flag (bandeira) "-dst" é um alias para essa opção.
-j, --jump target :: Especifica o alvo da regra, isto é, o que fazer se o pacote combinar com a regra. O alvo pode ser uma chain definida pelo usuário, pode ser um dos alvos embutidos especiais (chains que vem por padrão) que decidem o destino do pacote imediatamente ou pode ser uma extensão (ver EXTENSIONS abaixo).
Se esta opção for omitida em uma regra (e "-g" não for usado com a regra) não terá efeito sobre o destino do pacote, mas os contadores sobre a regra serão incrementados.
-g, --goto chain :: Especifica que o processamento deve continuar em uma chain especificada. Ao contrário da opção "--jump", não vai continuar o processamento nesta chain, mas sim na chain que chamou via "--jump".
[!] -i, --in-interface name :: Nome de uma interface através da qual um pacote foi recebido (somente para pacotes que entram nas chains INPUT, FORWARD e PREROUTING).
Quando o argumento "!" for utilizado antes do nome da interface, o sentido é invertido. Se o nome da interface termina em "+", então qualquer interface que começa com o mesmo nome irá corresponder. Se esta opção for omitida, qualquer nome de interface irá corresponder.
Nota do tradutor: "eth+" refere-se a eth0, eth1, eth2, etc. Ou seja, a todas as placas de rede da máquina que começam com
eth. Wireless seria "wlan+".
[!] -o, --out-interface name :: Nome de uma interface através da qual um pacote vai ser enviado (para pacotes que entram nas chains OUTPUT, FORWARD e POSTROUTING).
Quando o argumento "!" for utilizado antes do nome da interface, o sentido é invertido. Se o nome da interface termina em "+", então qualquer interface que começa com este nome irá corresponder. Se esta opção for omitida, qualquer nome de interface irá corresponder.
[!] -f, --fragment :: Significa que a regra se refere ao segundo fragmento em diante dos pacotes fragmentados. Como não há maneira de dizer as portas de origem ou destino de um tal pacote (tipo ICMP), tal pacote não irá corresponder a todas as regras especificadas.
Quando o argumento "!" precede a flag "-f", a regra só vai coincidir com o cabeçalho dos fragmentos ou dos pacotes não fragmentados.
-c, --set-counters packets bytes :: Isso permite que o administrador inicialize os contadores de pacotes e os bytes de uma regra (durante as operações INSERT, APPEND e REPLACE).