<sect id="fw-iptables-mod">Outros módulos do iptables
 <p>
Os módulos do iptables são especificados com a opção <em>-m módulo</em> 
ou <em>--match módulo</em> e permitem expandir a funcionalidade do firewall 
através de novas conferências e recursos de filtragem adicionais, como limitar a 
conferência de regras do firewall (um método útil de limitar 
ping floods, syn floods, etc). 


<sect1 id="fw-iptables-mod-state">Conferindo de acordo com o estado da conexão
 <p>
Este módulo permite especificar regras de acordo com o estado da conexão do 
pacote, isto é feito através da interpretação da saída do módulo 
<file>ip_conntrack</file>. O parâmetro <em>--state OPÇÕES</em> deve acompanhar
este módulo. As opções permitidas são as seguintes: 
<list>
 <item>
<tt>NEW</tt> - Confere com pacotes que criam novas conexões

 <item>
<tt>ESTABLISHED</tt> - Confere com conexões já estabelecidas

 <item>
<tt>RELATED</tt> - Confere com pacotes relacionados indiretamente 
a uma conexão, como mensagens de erro icmp, etc. 

 <item>
<tt>INVALID</tt> - Confere com pacotes que não puderam ser identificados 
por algum motivo. Como respostas de conexões desconhecidas. 

</list>
Caso seja necessário especificar mais de uma opções estas devem ser separadas
por vírgulas. 
<example>
iptables -A INPUT -m state --state NEW -i ppp0 -j DROP

</example>
Bloqueia qualquer tentativa de nova conexão vindo da interface ppp0. 

<example>
iptables -A INPUT -m state --state NEW,INVALID -i ppp0 -j LOG

</example>
Permite registrar novas conexões e pacotes inválidos vindos da interface 
ppp0. 


<sect1 id="fw-iptables-mod-limit">Limitando o número de vezes que a regra confere
 <p>
A opção <em>-m limit</em> permite especificar o número de vezes que uma regra 
conferirá quando todas as outras condições forem satisfeitas. O número 
padrão de conferência é de 3 por hora, a não ser que seja modificado através 
dos argumentos aceitos pelo <em>limit</em>:
<list>
 <item>
<tt>--limit num/tempo</tt> - Permite especificar a taxa de conferências do limit.
O parâmetro <em>num</em> especifica um número e <em>tempo</em> pode ser 
 <list compact>
  <item><tt>s</tt> - Segundo
  <item><tt>m</tt> - Minuto
  <item><tt>h</tt> - Hora
  <item><tt>d</tt> - Dia
 </list>
Assim uma regra como <tt>iptables -A INPUT -m limit --limit 5/m -j ACCEPT</tt> 
permitirá que a regra acima confira apenas 5 vezes por minuto (<em>--limit 2/s</em>).
Este limite pode ser facilmente adaptado para uma regra de log que confere 
constantemente não causar uma avalanche em seus logs. O valor padrão é 3/h. 


 <item>
<tt>--limit-burst num</tt> - Especifica o número inicial máximo de pacotes que 
irão conferir, este número é aumentado por 1 a cada vez que o parâmetro 
<em>--limit</em> acima não for atingido. O valor padrão é 5. 
</list>


<sect1 id="fw-iptables-mod-limit-ping">Proteção contra ping da morte
 <p>
A regra abaixo pode tomada como base para proteção contra ping flood: 
<example>
iptables -t filter -A ping-chain -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -t filter -A ping-chain -j DROP

</example>
A regra acima limita em 1 vez por segundo (--limit 1/s) a passagem de pings 
(echo requests) para a máquina <prgn>Linux</prgn>. 

<example>
iptables -t filter -A ping-chain -i ppp0 -p icmp --icmp-type echo-reply -m limit --limit 1/s -j RETURN
iptables -t filter -A ping-chain -j DROP

</example>
Limita respostas a pings (echo reply) vindos da interface ppp0 (-i ppp0) a 1 por 
segundo.
<![ %OBS [
 <p>
<strong>ATENÇÃO:</strong> O exemplo acima é somente para a criação de suas 
próprias regras com limitações, caso um pacote não confira 
ele será bloqueado pela próxima regra. Se uma regra como esta
for colocada no chain INPUT sem modificações, ela não terá o efeito 
desejado, podendo colocar em risco a sua instalação pela falsa 
impressão de segurança. Portanto, é recomendável sempre testar as 
modificações para ter certeza que elas tem efeito. ]]>


<sect1 id="fw-iptables-mod-limit-synflood">Proteção contra syn flood
 <p>
A regra abaixo é uma boa proteção para os ataques syn floods:
<example>
iptables -t filter -A syn-chain -p tcp --syn -m limit --limit 2/s -j ACCEPT
iptables -t filter -A syn-chain -j DROP

</example>
Esta regra limita o atendimento de requisições de conexões a 2 por segundo. Outra
forma de aumentar a segurança contra syn-floods é através do próprio kernel 
ativando a opção "TCP Synflood" na compilação e depois executando: 
<tt>echo "1" >/proc/sys/net/ipv4/tcp_synflood</tt>. No entanto, utilize estas 
opções com cautela em servidores que possuem um grande número de acessos para
não ter problemas que afetem seu clientes.
<![ %OBS [
 <p>
<strong>ATENÇÃO:</strong> Os exemplos acima devem são somente exemplos para 
criação de suas próprias regras com limitações, caso um pacote não confira 
com a regra ele será bloqueado pela próxima regra. Se uma regra como esta
for colocada no chain INPUT sem modificações, ela não terá o efeito 
desejado, podendo colocar em risco a sua instalação pela falsa 
impressão de segurança. Portanto, é recomendável sempre testar as 
modificações para ter certeza que elas tem efeito. ]]>


<sect1 id="fw-iptables-outras-ipspoof">Proteção contra IP spoofing
 <p>
A especificação de endereços de origem/destino junto com a interface
de rede pode ser usado como um detector de ataques spoofing. A lógica
é que todos os endereços que NUNCA devem vir da interface X devem ser 
negados imediatamente. As regras abaixo são colocadas no inicio do chain
INPUT para detectar tais ataques:
<example>
iptables -A INPUT -s 192.168.1.0/24 -i ! eth0 -j DROP
iptables -A INPUT ! -s 192.168.1.0/24 -i eth0 -j DROP

</example>
A primeira regra diz para bloquear todos os endereços da faixa de 
rede 192.168.1.* que NÃO vem da interface eth0, a segunda regra diz para 
bloquear todos os endereços que não sejam 192.168.1.* vindos da 
interface eth0. O símbolo "!" serve para especificar exceções 
(veja <ref id="fw-iptables-outras-excessoes">.
O kernel do <prgn>Linux</prgn> automaticamente bloqueia a passagem de pacotes
que dizem ser de 127.0.0.1 e não está vindo da interface loopback. 
 <p>
O método preferido para controlar o ip spoofing é através do código de roteamento
do kernel (a não ser que esteja usando algum tipo de roteamento de origem 
assimétrico necessário por alguns programas especiais):
<example>
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
 echo 1 &gt;$i
done

</example>
Desta forma qualquer endereço dizendo ser 192.168.1.5 vindo de <file>ppp0</file> será 
imediatamente rejeitado. Uma checagem adicional contra IP spoofing pode 
ser feita no arquivo <file>/etc/host.conf</file> <![ %CAPJUNTOS [ (veja 
<ref id="rede-dns-a-hostconf">)]]>. 


<sect1 id="fw-iptables-mod-multiport">Especificando múltiplas portas de origem/destino
 <p>
O módulo <file>multiport</file> permite que seja especificado múltiplas portas 
para um alvo. Podem ser especificadas até 15 portas em um único parâmetro e 
basta que uma porta confira para que a regra entre em ação, pois a comparação
é feita usando condições "or". O parâmetro <file>multiport</file> deve ser 
acompanhado de um dos argumentos abaixo:
<list compact>
 <item>
<tt>--source-port [porta1, porta2...]</tt> - Faz a regra conferir se a 
porta de origem estiver presente entre as portas especificadas. 
 <item>
<tt>--destination-port [porta1, porta2...]</tt> - Faz a regra conferir se 
a porta de destino estiver presente entre as portas especificadas. 
 <item>
<tt>--port [porta1, porta2...]</tt> - Faz a regra conferir caso a porta 
de origem ou destino esteja presente no parâmetro. 
</list>
Este módulo pode eliminar muitas regras de firewall que fazem o mesmo tratamento 
de pacotes para diversas portas diferentes. 
<example>
iptables -A INPUT -p tcp -i ppp0 -m multiport --destination-port 21,23,25,80,110,113,6667 -j DROP

</example>
Bloqueia todos os pacotes vindo de ppp0 para as portas 21 (ftp), 23 (telnet), 
25 (smtp), 80 (www), 110 (pop3), 113 (ident), 6667 (irc).


<sect1 id="fw-iptables-mod-mac">Especificando o endereço MAC da interface
 <p>
O módulo <file>mac</file> serve para conferir com o endereço Ethernet dos pacotes 
de origem. Somente faz sentido se usado nos chains de PREROUTING (da tabela nat) ou 
INPUT (da tabela filter). Aceita como argumento a opção 
<em>--mac-source endereço</em>. O símbolo "!" pode ser usado para especificar 
uma exceção. 
<example>
iptables -t filter -A INPUT -m mac --mac-source 00:80:AD:B2:60:0B -j DROP

</example>
Confere com a máquina com endereço ethernet igual a <tt>00:80:AD:B2:60:0B</tt>. 


<sect1 id="fw-iptables-mod-owner">Conferindo com quem criou o pacote
 <p>
Este módulo confere com o usuário que iniciou a conexão. É somente válido
no chain <em>OUTPUT</em> da tabela filter. Os seguintes argumentos são válidas
para este módulo: 
<list>
 <item>
<tt>--uid-owner UID</tt> - Confere se o pacote foi criado por um processo
com o UID especificado. Até o momento somente UID numéricos são aceitos.

 <item>
<tt>--gid-owner GID</tt> - Confere se o pacote foi criado por um usuário
pertencente ao grupo GID. Até o momento somente GID numéricos são aceitos. 

 <item>
<tt>--pid-owner PID</tt> - Confere se o pacote foi criado por um 
processo com o PID especificado. 

 <item>
<tt>--sid-owner ID</tt> - Confere se o pacote foi criado por um processo
no grupo de seção especificado. 
 
</list> 
<![ %OBS [
 <p>
<strong>OBS:</strong> - Lembre-se que pacotes que não possuem detalhes suficientes
de cabeçalho nunca conferirão! ]]>
<example>
iptables -A OUTPUT -m owner --gid-owner 100 -p udp -j DROP

</example>
Rejeita um conexões indo para portas UDP de pacotes criados pelo usuários 
pertencentes ao grupo 100. 


<sect1 id="fw-iptables-mod-string">Conferindo com o conteúdo do pacote
 <p>
O módulo <file>string</file> do <prgn>iptables</prgn> permite a 
inspeção de conteúdo de um pacote e tomar uma ação se determinado tipo de 
tráfego for encontrado em um pacote. Esta técnica pode ser usada tanto para 
segurança como para economia de banda dentro da rede. Esta opção *NÃO* torna 
o iptables como um firewall proxy, pois o proxy tem a habilidade de 
inspecionar o conteúdo, protocolo, comandos do pacote e decidir se o seu 
conteúdo é nocivo ou não. O firewall em nível de pacotes fazendo inspeção de 
conteúdo, chega a ser 3 a 10 vezes mais rápido do que um proxy, assim seu uso 
deve ser analisado dependendo do tráfego que circula pelo link e da segurança 
dos dados que trafegam através dele.
 <p>
Uma boa prática é aliar esta opção a um IDS externo usando o alvo 
<em>QUEUE</em> e deixando o trabalho de espeção de conteúdo para ele.
Um exemplo de restrição direta é o bloqueio do envio de qualquer informação 
confidencial sigilosa para fora da rede interna (número de contas, tudo que 
conferir com CPF, CGC, endereços de e-mail, memorandos, etc). De qualquer forma, 
analise o tráfego de sua rede antes de querer implementar qualquer solução 
baseada neste método sob o risco de afetar tráfego legítimo.
 <p>
Outra utilidade eficiente é a diminuição de tráfego, pois podemos barrar programas 
que sobrecarregam o link em uma rede com muitos usuários como, por exemplo, usando 
o <prgn>Kazaa</prgn> ou qualquer outro programa para cópia de arquivos via 
Internet. Veja alguns exemplos:
<example>
# Bloqueia qualquer tentativa de acesso ao programa Kazaa
iptables -A INPUT -m string --string "X-Kazaa" -j DROP

# Não permite que dados confidenciais sejam enviados para fora da empresa
# e registra o ocorrido.
iptables -A OUTPUT -m string --string "conta" -j LOG --log-prefix "ALERTA: dados confidencial "
iptables -A OUTPUT -m string --string "conta" -j DROP

# Somente permite a passagem de pacotes que não contém ".exe" em seu conteúdo
iptables -A INPUT -m string --string ! ".exe" -j ACCEPT

</example>


<sect1 id="fw-iptables-mod-ttl">Conferindo com o tempo de vida do pacote
 <p>
O módulo <file>ttl</file> pode ser usado junto com as seguintes
opções para conferir com o tempo de vida (TTL) de um pacote:
 <list compact>
  <item><tt>--ttl-eq [num]</tt>
  <item><tt>--ttl-lt [num]</tt>
  <item><tt>--ttl-gq [num]</tt>
 </list>
Veja alguns exemplos:
<example>
# Confere com todos os pacotes que tem o TTL maior que 100
iptables -A INPUT -m ttl --ttl-gt 100 -j LOG --log-prefix "TTL alto"

# Confere com todos os pacotes que tem o TTL igual a 1
iptables -A INPUT -m ttl --ttl-eq 1 -j DROP

</example>
<![ %OBS [
 <p>
<strong>OBS:</strong> Tenha um especial cuidado durante a programação de 
regras que usem TTL, como elas estão especialmente associadas com o estado 
da comunicação estabelecida entre as duas pontas e o tipo de protocolo, 
cuidados especiais devem ser tomados para que seu firewall não 
manipule de forma incorreta tráfego válido.  ]]>


<sect1 id="fw-iptables-mod-rpc">Conferindo com números RPC
 <p>
O módulo <file>rpc</file> permite um controle especial sobre o 
tráfego RPC que chega até a sua máquina. Um uso útil é 
restringir a chamada a determinados números RPC e permitir 
outros (por exemplo, permitindo somente o serviço <em>keyserv</em>
e bloqueando outros como o <em>ypserv</em> ou <em>portmapper</em>). As 
seguintes opções podem ser usadas com o módulo <file>nfs</file>:
<list compact>
 <item>
<tt>--rpcs [procedimentos]</tt> - Confere com a lista de 
chamadas RPC especificadas. Mais de um procedimento RPC pode 
ser especificado como <tt>nome</tt> ou <tt>número</tt> separando-os 
com vírgulas. Um arquivo útil que contém esta lista é o <file>/etc/rpc</file>. 

 <item>
<tt>--strict</tt> - Ignora serviços RPC que não contenham a chamada 
<em>get</em> do portmapper. Em situações normais, o inicio de qualquer 
solicitação RPC.
 
</list>
Veja alguns exemplos:
<example>
# Para conferir com todas as chamadas RPC referentes a conexões iniciadas
# para o portmapper
iptables -A INPUT -m rpc --rpcs portmapper --strict -j DROP

# Para permitir que somente as chamadas para status e statmon sejam
# aceitas
iptables -A INPUT -m rpc --rpcs 100023,100024 -j ACCEPT

</example>

<sect1 id="fw-iptables-mod-pkttype">Conferindo com tipo de pacote
 <p>
O módulo <file>pkttype</file> permite identificar um pacote do tipo 
<em>unicast</em> (direcionado a você), <em>broadcast</em> 
(direcionado a uma determinada rede, definida pela netmask) ou 
<em>multicast</em> (destinado a grupos de redes) e desta forma realizar 
ações em cima destes. O tipo de pacote é identificado logo após a 
opção <em>--pkt-type</em>. Veja alguns exemplos:
<example>
# Bloqueia a passagem de pacotes multicast de uma rede para outra
iptables -A FORWARD -i eth0 -o eth0 -m pkttype --pkt-type multicast -j DROP 

# Como deve ter notado, é possível fazer a associação com diversas especificações
# de módulos, bastando apenas especificar uma opção "-m" para cada módulo
# adicional:
# Permite a passagem de pacotes broadcast de uma rede para outra com
# limitação de 5/s.
iptables -A FORWARD -i eth0 -o eth0 -m pkttype --pkt-type broadcast -m limit --limit 5/s -j ACCEPT

</example>


<sect1 id="fw-iptables-mod-length">Conferindo com o tamanho do pacote
 <p>
O tamanho do pacote pode ser usado como condição de filtragem através do 
módulo <file>length</file>. O tamanho do pacote é especificado através da 
opção <em>--length</em> e o argumento segue a mesma sintaxe da especificação 
de portas no <prgn>iptables</prgn> sendo separados por <em>:</em>. Veja 
alguns exemplos:
<example>
# Bloqueia qualquer pacote ICMP maior que 30Kb
iptables -A INPUT -i eth0 -m length --length 30000: -j DROP

# Bloqueia qualquer pacote com o tamanho entre 20 e 2000 bytes
iptables -A INPUT -i eth0 -m length --length 20:2000 -j DROP

</example>
