iptables-1.8.9

Introdução a iptables

O iptables é um aplicativo de linha de comando do espaço do(a) usuário(a) usado para configurar o conjunto de regras de filtragem de pacote do núcleo Linux 2.4 e posteriores.

Esse pacote é conhecido por construir e funcionar corretamente usando uma plataforma LFS 12.0.

Informação do Pacote

Dependências do iptables

Opcionais

libpcap-1.10.4 (exigido para suporte ao compilador BPF ou nfsynproxy), bpf-utils (exigido para suporte ao Berkeley Packet Filter), libnfnetlink (exigido para suporte ao connlabel), libnetfilter_conntrack (exigido para suporte ao connlabel) e nftables

Configuração do Núcleo

Um firewall no Linux é realizado por meio da interface netfilter. Para usar o iptables para configurar a netfilter, os seguintes parâmetros de configuração do núcleo são exigidos:

[*] Networking support --->                                                [NET]
  Networking options --->
    [*] Network packet filtering framework (Netfilter) --->          [NETFILTER]
      [*] Advanced netfilter configuration                  [NETFILTER_ADVANCED]
      Core Netfilter Configuration --->
        <*/M> Netfilter connection tracking support               [NF_CONNTRACK]
        <*/M> Netfilter Xtables support (required for ip_tables)
                                                        ...  [NETFILTER_XTABLES]
        <*/M>   LOG target support                     [NETFILTER_XT_TARGET_LOG]
      IP: Netfilter Configuration --->
        <*/M> IP tables support (required for filtering/masq/NAT)
                                                           ...  [IP_NF_IPTABLES]

Inclua quaisquer protocolos de rastreamento de conexão que serão usados, bem como quaisquer protocolos que você desejar usar para corresponder ao suporte sob a seção "Configuração Central da Netfilter". As opções acima são suficientes para se executar o Criando um Firewall Pessoal Com o iptables abaixo.

Instalação do iptables

[Nota]

Nota

A instalação abaixo não inclui a construção de algumas bibliotecas de extensão especializadas que exigem os cabeçalhos crus no código fonte do Linux. Se desejar construir as extensões adicionais (se não tiver certeza, então provavelmente não deseja), [então] você pode olhar no arquivo INSTALL para ver um exemplo do como mudar o parâmetro KERNEL_DIR= para apontar para o código fonte do Linux. Observe que, se atualizar a versão do núcleo, [então] possivelmente precisará também recompilar o iptables e isso a equipe do BLFS não testou usando os cabeçalhos crus do núcleo.

Instale iptables executando os seguintes comandos:

./configure --prefix=/usr     \
            --disable-nftables \
            --enable-libipq    &&
make

Esse pacote não vem com uma suíte de teste.

Agora, como o(a) usuário(a) root:

make install

Explicações do Comando

--disable-nftables: Essa chave desabilita a construção da compatibilidade do nftables.

--enable-libipq: Essa chave habilita a construção da libipq.so a qual pode ser usada por alguns pacotes fora do BLFS.

--enable-nfsynproxy: Essa chave habilita a instalação da ferramenta de configuração do SYNPROXY nfsynproxy.

Configurando iptables

[Nota]

Nota

Nas seguintes configurações de exemplo, LAN1 é usada para a interface interna da LAN e WAN1 é usada para a interface externa conectada com a Internet. Você precisará substituir esses valores por nomes apropriados de interface para o seu sistema.

Firewall Pessoal

Um Firewall Pessoal é projetado para permitir que você acesse todos os serviços oferecidos na Internet enquanto mantém o seu computador seguro e os seus dados privados.

Abaixo está uma versão ligeiramente modificada da recomendação do Rusty Russell oriunda do Linux 2.4 Packet Filtering HOWTO. Ela ainda é aplicável aos núcleos Linux 5.x.

install -v -dm755 /etc/systemd/scripts

cat > /etc/systemd/scripts/iptables << "EOF"
#!/bin/sh

# Início do /etc/systemd/scripts/iptables

# Insere módulos de rastreamento de conexão (não necessário se 
# construído internamente ao kernel)
modprobe nf_conntrack
modprobe xt_LOG

# Habilita difusão echo Protection
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

# Desabilita Pacotes Fonte Roteados
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
echo 0 > /proc/sys/net/ipv4/conf/default/accept_source_route

# Habilita a Proteção SYN Cookie do TCP
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

# Desabilita a Aceitação de Redireção de ICMP
echo 0 > /proc/sys/net/ipv4/conf/default/accept_redirects

# Não envia Mensagens de Redireção
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects

# Descarta Pacotes Falsificados entrantes em uma interface, onde as 
# respostas resultariam na resposta indo para uma interface diferente.
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter

# Registra pacotes com endereços impossíveis.
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
echo 1 > /proc/sys/net/ipv4/conf/default/log_martians

# Seja verboso acerca de endereços dinâmicos de IP (não necessário no caso de IP estático)
echo 2 > /proc/sys/net/ipv4/ip_dynaddr

# Desabilita a Notificação Explícita de Congestão
# roteadores demais ainda são ignorantes
echo 0 > /proc/sys/net/ipv4/tcp_ecn

# Configura um estado conhecido
iptables -P INPUT   DROP
iptables -P FORWARD DROP
iptables -P OUTPUT  DROP

# Estas linhas estão aqui no caso das regras já estiverem no lugar e o script for mesmo
# reexecutado em tempo real.  Nós queremos remover todas as regras e cadeias preexistentes
# definidas por usuário(a) antes de implementarmos novas regras.
iptables -F
iptables -X
iptables -Z

iptables -t nat -F

# Permite conexões locais somente
iptables -A INPUT  -i lo -j ACCEPT

# Libera a saída gerada em qualquer interface para qualquer IP para 
# qualquer serviço (igual a -P ACCEPT)
iptables -A OUTPUT -j ACCEPT

# Permite respostas em conexões já estabelecidas e permite novas 
# conexões relacionadas às estabelecidas (por exemplo, modo de porta 
# ftp)
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Registra tudo o mais.
iptables -A INPUT -j LOG --log-prefix "FIREWALL:INPUT "

# Fim do /etc/systemd/scripts/iptables
EOF
chmod 700 /etc/systemd/scripts/iptables

Esse script é bastante simples; ele descarta todo o tráfego entrante no seu computador que não foi iniciado a partir do seu computador; porém, considerando que você está simplesmente surfando na Internet, é improvável que exceda os limites dele.

Se você encontrar frequentemente certos atrasos ao acessar servidores FTP, [então] dê uma olhada em Exemplo número quatro de BusyBox com o iptables.

Mesmo se você tiver processos de segundo plano ou serviços executando em seu sistema, esses estarão inacessíveis em todos os lugares, exceto a partir do seu próprio computador. Se quiser permitir o acesso a serviços na sua máquina, tais como o ssh ou o ping, [então] dê uma olhada em Criando um BusyBox Com o iptables.

Roteador de Mascaramento

Um Firewall de Rede de Comunicação tem duas interfaces, uma conectada com uma intranet, neste exemplo LAN1 e uma conectada com a Internet, aqui WAN1. Para fornecer a máxima segurança para o próprio firewall, tenha certeza de que não existem servidores desnecessários executando nele, tais como o X11. Como um princípio geral, o próprio firewall não deveria acessar qualquer serviço não confiável (pense em um servidor remoto dando respostas que fazem com que um processo de segundo plano no seu sistema quebre; ou ainda pior, que implementa um verme via um estouro do buffer).

install -v -dm755 /etc/systemd/scripts

cat > /etc/systemd/scripts/iptables << "EOF"
#!/bin/sh

# Inicia /etc/systemd/scripts/iptables

echo
echo "Você está usando a configuração de exemplo para uma configuração de um firewall"
echo "oriunda do Beyond Linux From Scratch."
echo "Este exemplo está longe de ser completo; ele é entendido para ser"
echo "somente uma referência."
echo "A segurança do firewall é um problema complexo, que excede o escopo"
echo "das regras de configuração abaixo."

echo "Você pode encontrar informação adicional"
echo "acerca de firewalls no Capítulo 4 do livro BLFS."
echo "https://www.linuxfromscratch.org/blfs"
echo

# Insere módulos do iptables (não necessário se construído internamente ao núcleo).

modprobe nf_conntrack
modprobe nf_conntrack_ftp
modprobe xt_conntrack
modprobe xt_LOG
modprobe xt_state

# Habilita difusão echo Protection
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

# Desabilita Pacotes Fonte Roteados
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route

# Habilitar Proteção de "Cookies" "SYN" do "TCP"
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

# Desabilitar Aceitação de Redirecionamento "ICMP"
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects

# Não envia Mensagens de Redireção
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects

# Descarta Pacotes Falsificados entrantes em uma interface, onde as
# respostas resultariam na resposta indo para uma interface diferente.
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter

# Registra pacotes com endereços impossíveis.
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians

# Seja verboso a respeito de endereços de IP dinâmicos (não necessário no caso de IP estático)
echo 2 > /proc/sys/net/ipv4/ip_dynaddr

# Desabilita a Notificação Explícita de Congestão
# roteadores demais ainda são ignorantes
echo 0 > /proc/sys/net/ipv4/tcp_ecn

# Configura um estado conhecido
iptables -P INPUT   DROP
iptables -P FORWARD DROP
iptables -P OUTPUT  DROP

# Estas linhas estão aqui no caso das regras já estiverem no lugar e o script for
# mesmo reexecutado em tempo real. Nós queremos remover todas as regras e
# cadeias preexistentes definidas por usuário(a) antes de implementarmos novas regras.
iptables -F
iptables -X
iptables -Z

iptables -t nat -F

# Permite conexões locais
iptables -A INPUT  -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Permite o encaminhamento se a iniciada na intranet
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD ! -i WAN1 -m conntrack --ctstate NEW       -j ACCEPT

# Faz o mascaramento (não necessário se a intranet não estiver usando
# endereços IP privados)
iptables -t nat -A POSTROUTING -o WAN1 -j MASQUERADE

# Registra tudo para depuração (última de todas as regras, porém antes
# das regras de política)
iptables -A INPUT   -j LOG --log-prefix "FIREWALL:INPUT "
iptables -A FORWARD -j LOG --log-prefix "FIREWALL:FORWARD "
iptables -A OUTPUT  -j LOG --log-prefix "FIREWALL:OUTPUT "

# Habilita o Encaminhamento de IP
echo 1 > /proc/sys/net/ipv4/ip_forward

# As seções seguintes permitem pacotes de entrada para exemplos específicos;
# descomente as linhas de exemplo e ajuste conforme necessário

# Permite ping na interface externa
#iptables -A INPUT  -p icmp -m icmp --icmp-type echo-request -j ACCEPT
#iptables -A OUTPUT -p icmp -m icmp --icmp-type echo-reply   -j ACCEPT

# Rejeita pacotes idênticos com reconfiguração de TCP para evitar atrasos com o FTP ou o IRC
#iptables -A INPUT  -p tcp --dport 113 -j REJECT --reject-with tcp-reset

# Permite HTTP e HTTPS para 192.168.0.2
#iptables -A PREROUTING -t nat -i WAN1 -p tcp --dport 80 -j DNAT --to 192.168.0.2
#iptables -A PREROUTING -t nat -i WAN1 -p tcp --dport 443 -j DNAT --to 192.168.0.2
#iptables -A FORWARD -p tcp -d 192.168.0.2 --dport 80 -j ACCEPT
#iptables -A FORWARD -p tcp -d 192.168.0.2 --dport 443 -j ACCEPT

# Termina /etc/systemd/scripts/iptables
EOF
chmod 700 /etc/systemd/scripts/iptables

Com esse script sua intranet deveria estar razoavelmente segura contra ataques externos. Ninguém deveria estar apto(a) a configurar uma conexão nova para qualquer serviço interno e, se estiver mascarada, torna a sua intranet invisível para a Internet. Além disso, o seu firewall deveria estar relativamente a salvo, pois não existem serviços executando que um cracker pudesse atacar.

BusyBox

Este cenário não é muito diferente do Criando um Roteador de Mascaramento Com o iptables, porém, adicionalmente, oferece alguns serviços para a sua intranet. Exemplos disto podem ser quando você quer administrar o seu firewall a partir de outro dispositivo na sua intranet ou usá-lo como um proxy ou como um servidor de nome.

[Nota]

Nota

Delinear especificamente como proteger um servidor que oferece serviços na Internet vai bem além do escopo deste documento. Vejam-se as referências em “Informação Extra” para mais informação.

Seja cauteloso(a). Cada serviço que você tenha habilitado torna a sua configuração mais complexa e o seu firewall menos seguro. Você está exposto(a) aos riscos dos serviços mal configurados ou de executar um serviço com um defeito explorável. Um firewall geralmente não deveria executar quaisquer serviços extras. Veja-se a introdução ao Criando um Roteador de Mascaramento Com o iptables para mais alguns detalhes.

Se você quiser acrescentar serviços, tais como servidores internos Samba ou de nome, que não precisem acessar eles próprios a Internet, [então] as declarações adicionais são bastante simples e ainda deveriam ser aceitáveis a partir de um ponto de vista da segurança. Apenas acrescente as seguintes linhas no script antes das regras de registro.

iptables -A INPUT -i ! WAN1  -j ACCEPT
iptables -A OUTPUT -o ! WAN1  -j ACCEPT

Se processos de segundo plano, tais como o squid, tiverem que acessar eles próprios a Internet, [então] você geralmente poderia abrir OUTPUT e restringir INPUT.

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -j ACCEPT

Entretanto, geralmente não é aconselhável deixar OUTPUT irrestrito. Você perde algum controle sobre trojans que gostariam de "chamar home", e um monte de redundância no caso de você tiver (mal) configurado um serviço, de forma que difunda a existência dele para o mundo.

Para realizar isso, você deveria restringir INPUT e OUTPUT em todas as portas, exceto naquelas que sejam absolutamente necessárias ter abertas. Quais portas você tem de abrir depende das suas necessidades: a maioria você as encontrará procurando por acessos falhos nos seus arquivos de registro.

Dê Uma Olhada nos Seguintes Exemplos:

  • O Squid está armazenando a web em cache:

    iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
    iptables -A INPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED \
      -j ACCEPT
  • Seu servidor de nome de cache (por exemplo, named) faz as pesquisas dele via UDP:

    iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
  • Você quer executar ping em seu computador para garantir que ele ainda esteja ativo:

    iptables -A INPUT -p icmp -m icmp --icmp-type echo-request -j ACCEPT
    iptables -A OUTPUT -p icmp -m icmp --icmp-type echo-reply   -j ACCEPT
  • Se frequentemente estiver acessando servidores FTP ou curte chat, [então] você poderia notar atrasos, pois algumas implementações desses processos de segundo plano consultam um processo de segundo plano identd no seu sistema para obter nomes de usuário(a). Embora exista realmente pouco dano nisso, ter-se um identd executando não é recomendado, pois muitos especialistas em segurança entendem que o serviço dá muito mais informação adicional.

    Para evitar tais atrasos, você poderia rejeitar as solicitações com uma resposta 'tcp-reset':

    iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
  • Para registrar e descartar pacotes inválidos (pacotes que vieram depois de um tempo esgotado do netfilter ou de alguns tipos de escaneamentos de rede de comunicação) insira estas regras no topo da cadeia:

    iptables -I INPUT 0 -p tcp -m conntrack --ctstate INVALID \
     -j LOG --log-prefix "FIREWALL:INVALID "
    iptables -I INPUT 1 -p tcp -m conntrack --ctstate INVALID -j DROP
  • Qualquer coisa vinda a partir do lado de fora não deveria ter um endereço privado; isso é um ataque comum chamado de falsificação de IP:

    iptables -A INPUT -i WAN1 -s 10.0.0.0/8    -j DROP
    iptables -A INPUT -i WAN1 -s 172.16.0.0/12  -j DROP
    iptables -A INPUT -i WAN1 -s 192.168.0.0/16 -j DROP

    Existem outros endereços que você possivelmente também queira descartar: 0.0.0.0/8, 127.0.0.0/8, 224.0.0.0/3 (multicast e experimental), 169.254.0.0/16 (Redes de Comunicação Link Local) e 192.0.2.0/24 (rede de comunicação de teste definida pela IANA).

  • Se o seu firewall for um cliente DHCP, [então] você precisa permitir aqueles pacotes:

    iptables -A INPUT -i WAN1 -p udp -s 0.0.0.0 --sport 67 \
       -d 255.255.255.255 --dport 68 -j ACCEPT
  • Para simplificar a depuração e ser justo(a) com qualquer um(a) que gostaria de acessar um serviço que você tenha desabilitado, propositalmente ou por erro, você poderia REJEITAR aqueles pacotes que são descartados.

    Obviamente, isso precisa ser feito diretamente depois do registro, como as ultimíssimas linhas antes dos pacotes serem descartados pela política:

    iptables -A INPUT -j REJECT

Esses são somente exemplos para mostrar para você algumas das capacidades do código do firewall no Linux. Dê uma olhada na página de manual do iptables. Lá você encontrará muito mais informação. Os números de porta necessários para isso podem ser encontrados em /etc/services, caso você não os encontrou por tentativa e erro no seu arquivo de registro.

Unidade do systemd

Para configurar o firewall iptables na inicialização, instale a unidade iptables.service inclusa no pacote blfs-systemd-units-20230816.

make install-iptables

Conteúdo

Aplicativos Instalados: ip6tables, ip6tables-apply, ip6tables-legacy, ip6tables-legacy-restore, ip6tables-legacy-save, ip6tables-restore, ip6tables-save, iptables, iptables-apply, iptables-legacy, iptables-legacy-restore, iptables-legacy-apply, iptables-restore, iptables-save, iptables-xml, nfsynproxy (opcional) e xtables-multi
Bibliotecas Instaladas: libip4tc.so, libip6tc.so, libipq.so, libiptc.so e libxtables.so
Diretórios Instalados: /lib/xtables e /usr/include/libiptc

Descrições Curtas

iptables

é usado para configurar, manter e inspecionar as tabelas de regras de filtro de pacote IP no núcleo Linux

iptables-apply

é uma maneira mais segura para atualizar o iptables remotamente

iptables-legacy

é usado para interagir com o iptables usando o conjunto legado de comandos

iptables-legacy-restore

é usado para restaurar um conjunto de regras legadas do iptables

iptables-legacy-save

é usado para salvar um conjunto de regras legadas do iptables

iptables-restore

é usado para restaurar as Tabelas de IP a partir de dados especificados na STDIN. Use o redirecionamento de Entrada/Saída fornecida pelo seu shell para ler a partir de um arquivo

iptables-save

é usado para despejar o conteúdo de uma Tabela de IP em formato facilmente analisável para a STDOUT. Use o redirecionamento de Entrada/Saída fornecido pelo seu shell para escrever em um arquivo

iptables-xml

é usado para converter a saída gerada do iptables-save para um formato XML. Usar a folha de estilo iptables.xslt converte o XML de volta para o formato do iptables-restore

ip6tables*

é um conjunto de comandos para IPv6 que paraleliza os comandos do iptables acima

nfsynproxy

ferramenta de configuração (opcional). O alvo SYNPROXY torna o manuseio de grandes inundações SYN possível sem as grandes penalidades de desempenho impostas pelo rastreio de conexão em tais casos

xtables-multi

é um binário que se comporta de acordo com o nome pelo qual ele for chamado