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 adequadamente
usando uma plataforma LFS 11.3.
Informação do Pacote
Dependências do iptables
Opcionais
libpcap-1.10.3 (exigido para suporte ao
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
Observações de Usuário(a): https://wiki.linuxfromscratch.org/blfs/wiki/iptables
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 ---> [CONFIG_NET]
Networking Options --->
[*] Network packet filtering framework (Netfilter) ---> [CONFIG_NETFILTER]
[*] Advanced netfilter configuration [CONFIG_NETFILTER_ADVANCED]
Core Netfilter Configuration --->
<*/M> Netfilter connection tracking support [CONFIG_NF_CONNTRACK]
<*/M> Netfilter Xtables support (required for ip_tables) [CONFIG_NETFILTER_XTABLES]
<*/M> LOG target support [CONFIG_NETFILTER_XT_TARGET_LOG]
IP: Netfilter Configuration --->
<*/M> IP tables support (required for filtering/masq/NAT) [CONFIG_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
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
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.
cat > /etc/rc.d/rc.iptables << "EOF"
#!/bin/sh
# Início do rc.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 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 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 $rc_base/rc.iptables
EOF
chmod 700 /etc/rc.d/rc.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).
cat > /etc/rc.d/rc.iptables << "EOF"
#!/bin/sh
# Início do rc.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 kernel).
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
# 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/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
EOF
chmod 700 /etc/rc.d/rc.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
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.
Script de
Inicialização
Para configurar o firewall iptables na inicialização, instale o
script de inicialização /etc/rc.d/init.d/iptables
incluso no pacote
blfs-bootscripts-20230101.
make install-iptables