iptables/ip6tables — ferramenta de administração para filtragem de pacotes IPv4/IPv6 e NAT
SINTAXE
iptables [-t table] {-A|-C|-D|-V} chain rule-specification
ip6tables [-t table] {-A|-C|-D|-V} 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 policy
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
Iptables e ip6tables são usados para configurar, manter e inspecionar as tabelas de regras de filtro de pacotes IPv4 e IPv6 no kernel Linux. Várias tabelas diferentes podem ser definidas. Cada tabela contém um número de cadeias internas e também pode conter cadeias definidas pelo usuário.
Cada cadeia é uma lista de regras que podem corresponder a um conjunto de pacotes. Cada regra especifica o que fazer com um pacote que corresponda. Isso é chamado de "target", que pode ser um salto para uma cadeia definida pelo usuário na mesma tabela.
TARGETS
Uma regra de firewall especifica critérios para um pacote e um target. Se o pacote não corresponder, a próxima regra na cadeia é examinada; se corresponder, a próxima regra é especificada pelo valor do target, que pode ser o nome de uma cadeia definida pelo usuário, um dos targets descritos em iptables-extensions(8), ou um dos valores especiais ACCEPT, DROP ou RETURN.
ACCEPT significa permitir que o pacote passe. DROP significa descartar o pacote. RETURN significa parar de percorrer esta cadeia e retomar na próxima regra na cadeia anterior (chamadora). Se o final de uma cadeia interna for alcançado ou uma regra em uma cadeia interna com target RETURN for correspondida, o target especificado pela política da cadeia determina o destino do pacote.
TABELAS
Atualmente, existem cinco tabelas independentes (as tabelas presentes em um determinado momento dependem das opções de configuração do kernel e dos módulos presentes).
-t, --table table
Esta opção especifica a tabela de correspondência de pacotes na qual o comando deve operar. Se o kernel for configurado com carregamento automático de módulos, uma tentativa será feita de carregar o módulo apropriado para essa tabela, caso ainda não esteja lá.
As tabelas são as seguintes:
filter:
Esta é a tabela padrão (se nenhuma opção -t for passada). Ela contém as cadeias integradas INPUT (para pacotes destinados a sockets locais), FORWARD (para pacotes que estão sendo roteados pela máquina) e OUTPUT (para pacotes gerados localmente).
nat:
Esta tabela é consultada quando um pacote que cria uma nova conexão é encontrado. Ela consiste em quatro cadeias integradas: PREROUTING (para alterar pacotes assim que eles chegam), INPUT (para alterar pacotes destinados a sockets locais), OUTPUT (para alterar pacotes gerados localmente antes do roteamento) e POSTROUTING (para alterar pacotes quando eles estão prestes a sair). O suporte a IPv6 NAT está disponível desde o kernel 3.7.
mangle:
Esta tabela é usada para alterações de pacotes especializadas. Até o kernel 2.4.17, ela tinha duas cadeias integradas: PREROUTING (para alterar pacotes de entrada antes do roteamento) e OUTPUT (para alterar pacotes gerados localmente antes do roteamento). Desde o kernel 2.4.18, três outras cadeias integradas também são suportadas: INPUT (para pacotes que chegam à máquina), FORWARD (para alterar pacotes que estão sendo roteados pela máquina) e POSTROUTING (para alterar pacotes quando eles estão prestes a sair).
raw:
Esta tabela é usada principalmente para configurar exceções do rastreamento de conexão em combinação com o alvo NOTRACK. Ela se registra nos hooks netfilter com prioridade mais alta e, portanto, é chamada antes de ip_conntrack ou qualquer outra tabela IP. Ela fornece as seguintes cadeias integradas: PREROUTING (para pacotes que chegam por qualquer interface de rede) e OUTPUT (para pacotes gerados por processos locais).
security:
Esta tabela é usada para regras de rede de Controle de Acesso Obrigatório (MAC), como aquelas habilitadas pelos alvos SECMARK e CONNSECMARK. O Controle de Acesso Obrigatório é implementado pelos Módulos de Segurança do Linux, como o SELinux. A tabela de segurança é chamada após a tabela de filtro, permitindo que quaisquer regras de Controle de Acesso Discricionário (DAC) na tabela de filtro entrem em vigor antes das regras MAC. Esta tabela fornece as seguintes cadeias integradas: INPUT (para pacotes que chegam à máquina), OUTPUT (para alterar pacotes gerados localmente antes do roteamento) e FORWARD (para alterar pacotes que estão sendo roteados pela máquina).
OPÇÕES
As opções reconhecidas por iptables e ip6tables podem ser divididas em vários grupos diferentes.
COMANDOS
Essas opções especificam a ação desejada a ser executada. Apenas uma delas pode ser especificada na linha de comando, a menos que especificado de outra forma abaixo. Para as versões longas dos nomes de comando e opção, você precisa usar apenas letras suficientes para garantir que o iptables possa diferenciá-lo de todas as outras opções.
-A, --append chain rule-specification
Anexa uma ou mais regras ao final da cadeia selecionada. Quando os nomes de origem e/ou destino se resolvem em mais de um endereço, uma regra será adicionada para cada combinação de endereço possível.
-C, --check chain rule-specification
Verifica se uma regra correspondente à especificação existe na cadeia selecionada. Este comando usa a mesma lógica do -D para encontrar uma entrada correspondente, mas não altera a configuração existente do iptables e usa seu código de saída para indicar sucesso ou falha.
-D, --delete chain rule-specification
-D, --delete chain rulenum
Exclui uma ou mais regras da cadeia selecionada. Existem duas versões deste comando: a regra pode ser especificada como um número na cadeia (começando em 1 para a primeira regra) ou uma regra a ser correspondida.
-I, --insert chain [rulenum] rule-specification
Insere uma ou mais regras na cadeia selecionada como o número de regra fornecido. Assim, se o número da regra for 1, a regra ou regras serão inseridas no início da cadeia. Este também é o padrão se nenhum número de regra for especificado.
-R, --replace chain rulenum rule-specification
Substitui uma regra na cadeia selecionada. Se os nomes de origem e/ou destino resolverem para vários endereços, o comando falhará. As regras são numeradas começando em 1.
-L, --list [chain]
Lista todas as regras na cadeia selecionada. Se nenhuma cadeia for selecionada, todas as cadeias serão listadas. Como todos os outros comandos iptables, ele se aplica à tabela especificada (o filtro é o padrão), então as regras NAT são listadas por iptables -t nat -n -L Observe que é frequentemente usado com a opção -n, a fim de evitar pesquisas reversas de DNS demoradas. É legal especificar a opção -Z (zero) também, caso em que a cadeia(s) serão listadas e zeradas atomicamente. A saída exata é afetada pelos outros argumentos fornecidos. As regras exatas são suprimidas até que você use iptables -L -v ou iptables-save(8).
-S, --list-rules [chain]
Imprime todas as regras na cadeia selecionada. Se nenhuma cadeia for selecionada, todas as cadeias serão impressas como iptables-save. Como todos os outros comandos iptables, ele se aplica à tabela especificada (o filtro é o padrão).
-F, --flush [chain]
Limpa a cadeia selecionada (todas as cadeias na tabela se nenhuma for fornecida). Isso é equivalente a excluir todas as regras uma por uma.
-Z, --zero [chain [rulenum]]
Zera os contadores de pacotes e bytes em todas as cadeias, ou apenas na cadeia fornecida, ou apenas na regra fornecida em uma cadeia. É legal especificar a opção -L, --list (lista) também, para ver os contadores imediatamente antes de serem limpos. (Veja acima.)
-N, --new-chain chain
Cria uma nova cadeia definida pelo usuário com o nome fornecido. Não deve haver nenhum alvo com esse nome já.
-X, --delete-chain [chain]
Exclui a cadeia especificada. Não deve haver referências à cadeia. Se houver, você deve excluir ou substituir as regras de referência antes que a cadeia possa ser excluída. A cadeia deve estar vazia, ou seja, não deve conter nenhuma regra. Se nenhum argumento for fornecido, ele excluirá todas as cadeias vazias na tabela. As cadeias internas vazias só podem ser excluídas com iptables-nft.
-P, --policy chain target
Define a política para a cadeia interna (não definida pelo usuário) para o alvo fornecido. O alvo de política deve ser ACCEPT ou DROP.
-E, --rename-chain old-chain new-chain
Renomeia a cadeia especificada pelo usuário para o nome fornecido pelo usuário. Isso é puramente cosmético e não afeta a estrutura da tabela.
-h Ajuda. Fornece uma descrição (atualmente muito breve) da sintaxe do comando.
PARAMETROS
Os seguintes parâmetros compõem uma especificação de regra (conforme usado nos comandos adicionar, excluir, inserir, substituir e anexar).
-4, --ipv4
Esta opção não tem efeito no iptables e no iptables-restore. Se uma regra que usa a opção -4 for inserida com (e apenas com) o ip6tables-restore, ela será ignorada silenciosamente. Qualquer outro uso lançará um erro. Esta opção permite regras IPv4 e IPv6 em um único arquivo de regras para uso com iptables-restore e ip6tables-restore.
-6, --ipv6
Se uma regra que usa a opção -6 for inserida com (e apenas com) o iptables-restore, ela será ignorada silenciosamente. Qualquer outro uso lançará um erro. Esta opção permite regras IPv4 e IPv6 em um único arquivo de regras para uso com iptables-restore e ip6tables-restore. Esta opção não tem efeito no ip6tables e no ip6tables-restore.
[!] -p, --protocol protocol
O protocolo da regra ou do pacote a ser verificado. O protocolo especificado pode ser um dos seguintes: tcp, udp, udplite, icmp, icmpv6, esp, ah, sctp, mh ou a palavra-chave especial "all", ou pode ser um valor numérico, representando um desses protocolos ou um protocolo diferente. Um nome de protocolo de /etc/protocols também é permitido. Um argumento "!" antes do protocolo inverte o teste. O número zero é equivalente a todos. "all" corresponderá a todos os protocolos e será considerado o padrão quando esta opção for omitida. Observe que, no ip6tables, os cabeçalhos de extensão IPv6, exceto esp, não são permitidos. esp e ipv6-nonext podem ser usados com a versão do kernel 6.11 ou posterior. O número zero é equivalente a todos, o que significa que você não pode testar o campo de protocolo para o valor 0 diretamente. Para corresponder a um cabeçalho HBH, mesmo que seja o último, você não pode usar -p 0, mas sempre precisa usar -m hbh.
[!] -s, --source address[/mask][,...]
Especificação de origem. O endereço pode ser um nome de rede, um nome de host, um endereço IP de rede (com /máscara) ou um endereço IP simples. Os nomes de host serão resolvidos apenas uma vez, antes que a regra seja enviada ao kernel. Observe que especificar qualquer nome a ser resolvido com uma consulta remota, como DNS, é uma má ideia. A máscara pode ser uma máscara de rede IPv4 (para iptables) ou um número simples, especificando o número de 1s no lado esquerdo da máscara de rede. Assim, uma máscara iptables de 24 é equivalente a 255.255.255.0. Um argumento "!" antes da especificação do endereço inverte o sentido do endereço. A flag --src é um alias para esta opção. Vários endereços podem ser especificados, mas isso se expandirá para várias regras (ao adicionar com -A) ou fará com que várias regras sejam excluídas (com -D).
[!] -d, --destination address[/mask][,...]
Especificação de destino. Consulte a descrição da flag -s (origem) para obter uma descrição detalhada da sintaxe. A flag --dst é um alias para esta opção.
-m, --match match
Especifica um padrão a ser usado, ou seja, um módulo de extensão que testa uma propriedade específica.
O conjunto de padrões constitui a condição sob a qual um destino é invocado. Os padrões são
avaliados de cima para baixo, conforme especificado na linha de comando, e funcionam em modo de curto-circuito, ou seja, se uma extensão retornar falso, a avaliação será interrompida.
-j, --jump target
Isso especifica o destino da regra; ou seja, o que fazer se o pacote corresponder. O
destino pode ser uma cadeia definida pelo usuário (diferente da cadeia em que esta regra está), um dos destinos internos especiais que decidem o destino do pacote imediatamente ou uma extensão (consulte EXTENSÕES DE PADRÃO E DESTINO abaixo). Se esta opção for omitida em uma regra (e -g não for
usado), corresponder à regra não terá efeito no destino do pacote, mas os contadores
da regra serão incrementados.
-g, --goto chain
Isso especifica que o processamento deve continuar em uma cadeia especificada pelo usuário. Ao contrário da opção --jump, RETURN não continuará o processamento nesta cadeia, mas sim na
cadeia que nos chamou via --jump.
[!] -i, --in-interface name
Nome da interface pela qual um pacote foi recebido (apenas para pacotes que entram nas cadeias INPUT,
FORWARD e PREROUTING). Quando o argumento "!" é usado antes do nome da interface,
o sentido é invertido. Se o nome da interface terminar com um "+", qualquer interface que comece com este nome corresponderá. Se esta opção for omitida, qualquer nome de interface corresponderá.
[!] -o, --out-interface name
Nome da interface pela qual um pacote será enviado (para pacotes que entram nas cadeias FORWARD, OUTPUT e POSTROUTING). Quando o argumento "!" é usado antes do nome da interface,
o sentido é invertido. Se o nome da interface terminar com um "+", qualquer interface que comece com este nome corresponderá. Se esta opção for omitida, qualquer nome de interface corresponderá.
[!] -f, --fragment
Isso significa que a regra se refere apenas aos segundos e subsequentes fragmentos IPv4 de pacotes fragmentados.
Como não há como dizer a porta de origem ou destino de um pacote como este
(ou o tipo ICMP), tal pacote não corresponderá a nenhuma regra que os especifique. Quando o argumento "!"
precede o sinalizador "-f", a regra corresponderá apenas aos fragmentos de cabeçalho ou pacotes não fragmentados. Esta opção é específica para IPv4 e não está disponível em ip6tables.
-c, --set-counters packets bytes
Isso permite que o administrador inicialize os contadores de pacotes e bytes de uma regra (durante as operações INSERT, APPEND, REPLACE).
OUTRAS OPÇÕES
As seguintes opções adicionais podem ser especificadas:
-v, --verbose
Saída detalhada. Esta opção faz com que o comando list exibir o nome da interface, as opções da regra (se houver) e as máscaras TOS. Os contadores de pacotes e bytes também são listados, com
o sufixo 'K', 'M' ou 'G' para multiplicadores de 1000, 1.000.000 e 1.000.000.000, respectivamente (mas
veja o sinalizador -x para alterar isso). Para anexar, inserir, excluir e substituir, isso
faz com que informações detalhadas sobre a regra ou regras sejam impressas. -v pode ser especificado várias vezes para possivelmente emitir declarações de depuração mais detalhadas: especificado duas vezes, iptableslegacy despejará informações da tabela e entradas em libiptc, iptables-nft despejará regras em apresentação netlink
(código VM). Especificado três vezes, iptables-nft também despejará quaisquer mensagens netlink
enviadas para o kernel.
-V, --version
Exibe a versão do programa e a API do kernel utilizada.
-w, --wait [segundos]
Aguarde o bloqueio xtables. Para evitar que várias instâncias do programa sejam executadas simultaneamente, uma tentativa será feita para obter um bloqueio exclusivo no início. Por padrão, o programa será encerrado se o bloqueio não puder ser obtido. Esta opção fará com que o programa aguarde (indefinidamente ou por um número opcional de segundos) até que o bloqueio exclusivo possa ser obtido.
-n, --numeric
Saída numérica. Os endereços IP e os números de porta serão exibidos em formato numérico. Por padrão, o programa tentará exibi-los como nomes de host, nomes de rede ou serviços (sempre que aplicável).
-x, --exact
Expande os números. Exibe o valor exato dos contadores de pacotes e bytes, em vez de apenas o número arredondado em K's (múltiplos de 1000), M's (múltiplos de 1000K) ou G's (múltiplos de 1000M). Esta opção é relevante apenas para o comando -L.
--line-numbers
Ao listar as regras, adiciona números de linha ao início de cada regra, correspondendo à posição dessa regra na cadeia.
--modprobe=comando
Ao adicionar ou inserir regras em uma cadeia, use o comando para carregar quaisquer módulos necessários (alvos, extensões de correspondência, etc.).
ARQUIVO DE BLOQUEIO
iptables usa o arquivo /run/xtables.lock para obter um bloqueio exclusivo no início.
A variável de ambiente XTABLES_LOCKFILE pode ser usada para substituir a configuração padrão.
EXTENSÕES DE CORRESPONDÊNCIA E ALVO
iptables pode usar módulos de correspondência e alvo de pacotes estendidos. Uma lista destes está disponível no
manual iptables-extensions(8).
DIAGNÓSTICOS
Várias mensagens de erro são impressas no erro padrão. O código de saída é 0 para o funcionamento correto. Erros que parecem ser causados por parâmetros de linha de comando inválidos ou mal utilizados resultam em um código de saída de 2. Erros que indicam uma incompatibilidade entre o kernel e o espaço do usuário resultam em um código de saída de 3. Erros que indicam um problema de recurso, como um bloqueio ocupado, falha na alocação de memória ou mensagens de erro do kernel, resultam em um código de saída de 4. Finalmente, outros erros resultam em um código de saída de 1.
BUGS
Bugs? O quê? Bem, você pode querer dar uma olhada em https://bugzilla.netfilter.org/ iptables será encerrado imediatamente com um código de erro de 111 se detectar que foi chamado como um programa setuid para root. iptables não pode ser usado com segurança desta forma porque confia nas bibliotecas compartilhadas (correspondências, alvos) carregadas em tempo de execução, o caminho de pesquisa pode ser definido usando variáveis de ambiente.
COMPATIBILIDADE COM IPCHAINS
Este iptables é muito semelhante ao ipchains de Rusty Russell. A principal diferença é que as cadeias INPUT e OUTPUT são percorridas apenas para pacotes que chegam ao host local e que se originam do host local, respectivamente. Portanto, cada pacote passa por apenas uma das três cadeias (exceto o tráfego de loopback, que envolve ambas as cadeias INPUT e OUTPUT); anteriormente, um pacote encaminhado passava por todas as três.
A outra principal diferença é que -i se refere à interface de entrada; -o se refere à interface de saída, e ambos estão disponíveis para pacotes que entram na cadeia FORWARD.
As várias formas de NAT foram separadas; o iptables é um filtro de pacotes puro quando se usa a tabela filter padrão, com módulos de extensão opcionais. Isso deve evitar grande parte da confusão sobre a combinação de mascaramento IP e filtragem de pacotes que se via anteriormente. Portanto, as seguintes opções são tratadas de forma diferente:
-j MASQ
-M -S
-M -L
Existem várias outras mudanças no iptables.
VEJA TAMBÉM
iptables-apply(8), iptables-save(8), iptables-restore(8), iptables-extensions(8),
O packet-filtering-HOWTO detalha o uso do iptables para filtragem de pacotes, o NAT-HOWTO detalha NAT, o netfilter-extensions-HOWTO detalha as extensões que não estão na distribuição padrão e o netfilter-hacking-HOWTO detalha o funcionamento interno do netfilter. Veja https://www.netfilter.org/.
AUTORES
Rusty Russell escreveu originalmente o iptables, em consulta inicial com Michael Neuling.
Marc Boucher fez com que Rusty abandonasse o ipnatctl, defendendo um framework genérico de seleção de pacotes no iptables, e então escreveu a tabela mangle, o match owner, o mark stuff e andou por aí fazendo coisas interessantes.
James Morris escreveu o alvo TOS e o match tos.
Jozsef Kadlecsik escreveu o alvo REJECT.
Harald Welte escreveu os alvos ULOG e NFQUEUE, o novo libiptc, bem como os matches e alvos TTL, DSCP, ECN.
A Equipe Central do Netfilter é: Jozsef Kadlecsik, Pablo Neira Ayuso, Eric Leblond, Florian Westphal e Arturo Borrero Gonzalez. Os membros eméritos da Equipe Central são: Marc Boucher, Martin Josefsson, Yasuyuki Kozakai, James Morris, Harald Welte e Rusty Russell.
A página do manual foi escrita originalmente por Herve Eychenne <_>.
VERSÃO
Esta página do manual se aplica ao iptables/ip6tables 1.8.11.