Professional Documents
Culture Documents
Paul Russell
Gleydson Mazioli da Silva
Alexandre Folle de Menezes
Linux IPCHAINS-HOWTO
Copyright © 1999 – Paul Russell, <ipchains@rustcorp.com>
Tradução para o português por Gleydson Mazioli da Silva, <gleydson@linuxbr.com.br>
Este material foi totalmente montado com fins didáticos, sem objetivo
comercial. Foram acrescentados exemplos e exercícios desenvolvidos
pela Alfamídia Ltda.
CONTEÚDO
CONTEÚDO ................................................................................................................... 5
1 TCP/IP ..................................................................................................................... 11
1.1 A CAMADA FÍSICA ................................................................................................. 11
1.2 A CAMADA DE ENLACE DE DADOS ....................................................................... 12
1.3 A CAMADA DE REDE ............................................................................................. 12
1.3.1 O DATAGRAMA IP............................................................................................... 13
1.3.2 FRAGMENTAÇÃO DOS DATAGRAMAS .................................................................. 14
1.4 CAMADA DE TRANSPORTE .................................................................................... 14
1.4.1 TCP..................................................................................................................... 14
1.4.1.1 O pacote TCP .................................................................................................. 15
1.4.2 UDP .................................................................................................................... 16
1.4.3 ICMP .................................................................................................................. 16
1.5 MONTAGEM DOS PACOTES .................................................................................... 17
1.6 ROTEAMENTO ....................................................................................................... 18
1.6.1 REEMPACOTAMENTO ........................................................................................... 20
EXERCÍCIOS.................................................................................................................... 21
2 ENDEREÇAMENTO............................................................................................. 22
2.1 ENDEREÇAMENTO DE ENLACE (MAC) ................................................................ 22
2.2 ENDEREÇAMENTO DE REDE (IP) .......................................................................... 22
2.2.1 MULTIHOMING .................................................................................................... 23
2.2.2 CLASSES DE REDE IP ........................................................................................... 23
2.2.3 ENDEREÇOS RESERVADOS PARA USO EM REDES PRIVADAS ................................. 24
2.2.4 ENDEREÇOS ESPECIAIS ........................................................................................ 24
2.2.4.1 O endereço de Rede......................................................................................... 24
2.2.4.2 O endereço de Broadcast................................................................................. 25
2.2.4.3 O endereço de Loopback ................................................................................. 25
2.2.5 DIVISÃO EM SUB-REDES ....................................................................................... 25
2.2.5.1 Máscaras de Sub-Rede .................................................................................... 25
2.2.6 SUPER-REDES E CDIR......................................................................................... 26
2.2.7 REFERÊNCIA RÁPIDA DE MÁSCARA DE REDES ...................................................... 26
2.3 ENDEREÇAMENTO DE SESSÃO (PORTAS) ............................................................. 27
EXERCÍCIOS.................................................................................................................... 28
5 FIREWALL IPCHAINS........................................................................................ 39
5.1 INTRODUÇÃO ......................................................................................................... 39
5.1.1 O QUE? ................................................................................................................ 39
5.1.2 POR QUE? ............................................................................................................ 39
5.1.3 COMO? ................................................................................................................ 39
5.1.4 ONDE? ................................................................................................................. 40
5.2 BÁSICO SOBRE A FILTRAGEM DE PACOTES........................................................... 40
5.2.1 O QUE É? ............................................................................................................. 40
5.2.2 POR QUE? ............................................................................................................ 40
5.2.3 COMO? ................................................................................................................ 41
5.2.3.1 Um kernel com filtragem de pacotes............................................................... 41
5.2.3.2 O ipchains .................................................................................................. 42
5.2.3.3 Fazendo regras permanentes............................................................................ 42
5.3 ROTEAMENTO, MASQUERADING, PORTFORWARDING, IPAUTOFW...................... 43
5.3.1 GUIA RÁPIDO DE TRÊS LINHAS PARA MASQUERADING ......................................... 43
5.3.2 CONFIGURAÇÕES DE FIREWALL SIMPLES ............................................................. 44
5.3.2.1 Rede Pública .................................................................................................... 44
5.3.2.2 Rede Privada: Masquerading........................................................................... 45
5.3.2.3 Rede Privada: Proxies Transparentes .............................................................. 46
5.3.2.4 Rede Privada: Proxies Tradicionais................................................................. 47
6
5.3.2.5 Serviços Internos Limitados ............................................................................ 48
5.3.3 MAIS DETALHES SOBRE MASQUERADING ............................................................ 48
5.4 IP FIREWALLING CHAINS ..................................................................................... 49
5.4.1 COMO OS PACOTES ATRAVESSAM OS FILTROS ...................................................... 49
5.4.1.1 Usando ipchains......................................................................................... 50
5.4.1.2 Operações em uma regra Simples ................................................................... 51
5.4.1.3 Especificações de Filtragem ............................................................................ 53
5.4.1.4 Efeitos do Lado da Filtragem .......................................................................... 57
5.4.1.5 Operações em Masquerading .......................................................................... 64
5.4.1.6 Checando um Pacote ....................................................................................... 65
5.4.1.7 Multiplas Regras at Once and Watching What Happens ................................ 65
5.4.2 EXEMPLOS ÚTEIS ................................................................................................. 66
5.4.2.1 Usando ipchains-save............................................................................. 68
5.4.2.2 Usando ipchains-restore...................................................................... 68
5.5 DIVERSOS .............................................................................................................. 69
5.5.1 COMO ORGANIZAR SUAS REGRAS DE FIREWALL ................................................... 69
5.5.2 O QUE NÃO FILTRAR ............................................................................................ 69
5.5.2.1 Pacotes ICMP .................................................................................................. 69
5.5.2.2 Conexões TCP para DNS (servidores de nomes)............................................ 70
5.5.2.3 Pesadelos FTP ................................................................................................. 70
5.5.3 FILTRANDO O PING OF DEATH (PING DA MORTE) ................................................. 71
5.5.4 FILTRANDO O TEARDROP E BONK........................................................................ 71
5.5.5 FILTRANDO BOMBAS DE FRAGMENTO ................................................................. 71
5.5.6 MODIFICANDO REGRAS DO FIREWALL ................................................................. 71
5.5.7 COMO EU CONFIGURO A PROTEÇÃO IP SPOOF?.................................................... 72
5.6 PROBLEMAS COMUNS ............................................................................................ 73
5.6.1 IPCHAINS -L TRAVA! ........................................................................................... 73
5.6.2 MASQUERADING/FORWARDING NÃO FUNCIONA!................................................. 73
5.6.3 -J REDIR NÃO FUNCIONA!.............................................................................. 73
5.6.4 CORINGAS NAS INTERFACES NÃO FUNCINAM! ..................................................... 74
5.6.5 TOS NÃO FUNCIONA! .......................................................................................... 74
5.6.6 IPAUTOFW E IPPORTFW NÃO FUNCIONAM! ........................................................... 74
5.6.7 XOSVIEW ESTÁ QUEBRADO! ................................................................................. 74
5.6.8 FALTA DE SEGMENTAÇÃO COM “-J REDIRECT”! ............................................ 74
5.6.9 EU NÃO POSSO CONFIGURAR TEMPO LIMITE NO MASQUERADE! ........................... 74
5.6.10 EU DESEJO PROTEGER IPX! ............................................................................... 75
6 FIREWALL IPTABLES........................................................................................ 76
6.1 INTRODUÇÃO ......................................................................................................... 76
6.1.1 VERSÃO ............................................................................................................... 77
6.1.2 UM RESUMO DA HISTÓRIA DO IPTABLES............................................................... 77
7
6.1.3 CARACTERÍSTICAS DO FIREWALL IPTABLES ......................................................... 77
6.1.4 FICHA TÉCNICA .................................................................................................... 78
6.1.5 REQUERIMENTOS ................................................................................................. 78
6.1.6 ARQUIVOS DE LOGS CRIADOS PELO IPTABLES ...................................................... 79
6.1.7 INSTALAÇÃO ........................................................................................................ 79
6.1.8 ENVIANDO CORREÇÕES/CONTRIBUINDO COM O PROJETO .................................... 79
6.1.9 O QUE ACONTECEU COM O IPCHAINS E IPFWADM? ............................................... 79
6.1.10 TIPOS DE FIREWALLS ......................................................................................... 79
6.1.11 O QUE PROTEGER?............................................................................................. 80
6.1.12 O QUE SÃO REGRAS?.......................................................................................... 81
6.1.13 O QUE SÃO CHAINS? .......................................................................................... 81
6.1.14 O QUE SÃO TABELAS?........................................................................................ 81
6.1.15 HABILITANDO O SUPORTE AO IPTABLES NO KERNEL .......................................... 82
6.1.16 LIGANDO SUA REDE INTERNA A INTERNET ......................................................... 84
6.2 MANIPULANDO CHAINS ......................................................................................... 84
6.2.1 ADICIONANDO REGRAS - A.................................................................................. 84
6.2.2 LISTANDO REGRAS - L ......................................................................................... 85
6.2.3 APAGANDO UMA REGRA - D ................................................................................ 87
6.2.4 INSERINDO UMA REGRA - I................................................................................... 88
6.2.5 SUBSTITUINDO UMA REGRA - R ........................................................................... 88
6.2.6 CRIANDO UM NOVO CHAIN - N............................................................................. 88
6.2.7 LISTANDO OS NOMES DE TODOS OS CHAINS ATUAIS ............................................. 90
6.2.8 LIMPANDO AS REGRAS DE UM CHAIN - F.............................................................. 90
6.2.9 APAGANDO UM CHAIN CRIADO PELO USUÁRIO - X............................................... 90
6.2.10 ZERANDO CONTADOR DE BYTES DOS CHAINS - Z ............................................... 90
6.2.11 ESPECIFICANDO O POLICIAMENTO PADRÃO DE UM CHAIN - P............................. 91
6.3 OUTRAS OPÇÕES DO IPTABLES.............................................................................. 92
6.3.1 ESPECIFICANDO UM ENDEREÇO DE ORIGEM/DESTINO........................................... 92
6.3.2 ESPECIFICANDO A INTERFACE DE ORIGEM/DESTINO ............................................. 92
6.3.3 ESPECIFICANDO UM PROTOCOLO ......................................................................... 94
6.3.3.1 Especificando portas de origem/destino .......................................................... 94
6.3.3.2 Especificando mensagens do protocolo ICMP................................................ 94
6.3.3.3 Especificando pacotes syn ............................................................................... 95
6.3.4 ESPECIFICANDO FRAGMENTOS ............................................................................. 96
6.3.5 ESPECIFICANDO UMA EXCEÇÃO ........................................................................... 96
6.3.6 ESPECIFICANDO UM ALVO.................................................................................... 97
6.3.6.1 Alvo REJECT .................................................................................................. 98
6.3.6.2 Especificando LOG como alvo........................................................................ 98
6.3.6.3 Especificando RETURN como alvo.............................................................. 101
6.4 A TABELA NAT (NETWORK ADDRESS TRANSLATION) - FAZENDO NAT ............. 101
6.4.1 CRIANDO UM NOVO CHAIN NA TABELA NAT..................................................... 102
8
6.4.2 FAZENDO IP MASQUERADING (PARA OS APRESSADOS) ...................................... 102
6.4.3 FAZENDO SNAT................................................................................................ 102
6.4.3.1 Fazendo IP Masquerading ............................................................................. 104
6.4.4 FAZENDO DNAT ............................................................................................... 105
6.4.4.1 Redirecionamento de portas .......................................................................... 105
6.4.5 MONITORANDO CONEXÕES FEITAS NA TABELA NAT .......................................... 106
6.5 A TABELA MANGLE ............................................................................................. 106
6.5.1 ESPECIFICANDO O TIPO DE SERVIÇO ................................................................... 106
6.5.1.1 Especificando o TOS para tráfego de saída................................................... 107
6.5.1.2 Especificando o TOS para o tráfego de entrada ............................................ 107
6.6 OUTROS MÓDULOS DO IPTABLES ........................................................................ 107
6.6.1 CONFERINDO DE ACORDO COM O ESTADO DA CONEXÃO .................................... 108
6.6.2 LIMITANDO O NÚMERO DE VEZES QUE A REGRA CONFERE ................................. 108
6.6.3 PROTEÇÃO CONTRA PING DA MORTE .................................................................. 109
6.6.4 PROTEÇÃO CONTRA SYN FLOOD ......................................................................... 109
6.6.5 PROTEÇÃO CONTRA IP SPOOFING ...................................................................... 109
6.6.6 ESPECIFICANDO MÚLTIPLAS PORTAS DE ORIGEM/DESTINO................................. 110
6.6.7 ESPECIFICANDO O ENDEREÇO MAC DA INTERFACE........................................... 110
6.6.8 CONFERINDO COM QUEM CRIOU O PACOTE ........................................................ 111
6.7 CAMINHO PERCORRIDO PELOS PACOTES NAS TABELAS E CHAINS .................... 111
6.7.1 PING DE 192.168.1.1 PARA 192.168.1.1 ............................................ 112
6.7.2 CONEXÃO FTP DE 192.168.1.1 PARA 192.168.1.1 ............................................ 112
6.7.3 CONEXÃO FTP DE 192.168.1.1 PARA 192.168.1.4 ............................................ 113
6.7.4 CONEXÃO FTP DE 200.217.29.67 PARA FTP.DEBIAN.ORG.BR ................. 114
6.7.5 PING DE 192.168.1.4 PARA 192.168.1.1 ............................................................ 115
6.7.6 CONEXÃO FTP DE 192.168.1.4 PARA 192.168.1.1 ............................................ 116
6.7.7 CONEXÃO FTP DE 192.168.1.4 PARA FTP.DEBIAN.ORG.BR ................................ 117
6.7.8 CONEXÃO FTP DE 200.198.129.162 PARA 200.217.29.167 .............................. 118
6.7.9 GRÁFICO GERAL DA PASSAGEM DOS PACOTES ................................................... 118
6.8 EXEMPLOS DE CONFIGURAÇÕES DO IPTABLES ................................................... 119
6.8.1 BLOQUEANDO CONEXÕES DE FORA PARA SUA MÁQUINA ................................... 119
6.8.2 MONITORANDO TENTATIVA DE CONEXÃO DE TROJANS EM SUA MÁQUINA ......... 119
6.8.3 CONECTANDO SUA REDE INTERNA A INTERNET ................................................. 120
6.8.4 UM EXEMPLO DE FIREWALL SIMPLES ................................................................. 120
9
7.5 EXEMPLOS DE CONFIGURAÇÃO .......................................................................... 130
7.5.1 PERMITIR HTTP_ACCESS PARA APENAS UMA MÁQUINA COM MAC ADDRESS IGUAL
A 00:08:C7:9F:34:41 :.................................................................................................... 130
7.5.2 PARA RESTRINGIR ACESSO NAS HORAS DE TRABALHO (9 HORAS - 17 HORAS, DE
SEGUNDA SEXTA) DA FAIXA DE IP 192.168.2.0 MÁSCARA 255.255.255.0 :................... 130
7.5.3 POSSO USAR UMA LISTA DE CONTROLE COM MULTIPLOS HORÁRIOS PARA
DIFERENTES USUÁRIOS?................................................................................................. 130
7.5.4 QUERO CRIAR UMA ACL PARA BLOQUEAR SITES COM A PALAVRA SEXO POIS MEUS
FUNCIONÁRIOS FICAM BAIXANDO FILMES EM DIVX DE PORNOGRAFIA:.......................... 131
7.5.5 A IDÉIA ACIMA E ÓTIMA, MAS EU TENHO UMA LISTA DE PALAVRAS PARA FAZER O
MESMO. TEREI QUE REPETIR ESSE COMANDO VÁRIAS VEZES?........................................ 131
7.5.6 AINDA EXISTEM SITES QUE ESCAPAM A ESSE CONTROLE. GOSTARIA DE BLOQUEÁ-
LOS DIRETAMENTE......................................................................................................... 131
7.5.7 MEU DIRETOR RECLAMA QUE AGORA NÃO CONSEGUE MAIS LER AS ENTREVISTAS
NO SITE DA PLAYBOY..................................................................................................... 132
7.5.8 E UMA LISTA DE DIRETÓRIOS? ........................................................................... 132
7.6 RECURSOS NA INTERNET .................................................................................... 132
10
1 TCP/IP
O TCP/IP é um protocolo que conecta redes LAN ou WAN, homogêneas
ou heterogêneas. Ele pode fazer tanto a comunicação entre hosts ponto-a-
ponto, como a comunicação entre cliente e servidor.
Existem dois tipos de interação entre aplicações.
Comunicação Orientada à Conexão é apropriada quando as aplicações
precisam de uma troca contínua de dados.
Em contraste, a Comunicação Não Orientada à Conexão é apropriada
quando as aplicações trocam mensagens isoladas, geralmente com
quantidades pequenas de dados.
Para conseguir uma troca de dados confiável entre os nós, são
necessários vários procedimentos: empacotamento dos dados, determinação
do caminho a ser seguido pelos pacotes, transmissão dos dados, adaptação da
taxa de transmissão de acordo com a capacidade do destino de receber dados,
gerenciamento de erros e retransmissão de dados.
Isso resulta em uma implementação complicada. Para facilitar essa
tarefa, pode se usar uma implementação modular, agrupando as tarefas
relacionadas em camadas distintas.
Para o TCP/IP foi adotado um modelo de comunicação dividido em
camadas, que depois viria a influenciar o modelo OSI que hoje é considerado
padrão.
Aplicações Aplicação
e
Serviços Apresentação
Sessão
TCP
UDP Transporte
IP Rede
PPP Enlace
Ethernet
V.90 Físico
11
1.2 A camada de Enlace de Dados
A camada de enlace de dados usa a capacidade de transmissão de
dados brutos da camada física e transforma-a em uma linha que pareça à
camada de rede ser livre de erros de transmissão. O protocolo PPP é um
exemplo de camada de enlace de dados.
Na camada de Enlace de Dados, os dados são organizados em quadros.
Cabeçalho IP
Endereço IP Origem Informação
Endereço IP Destino
12
1.3.1 O Datagrama IP
O cabeçalho de um datagrama IP pode ser visto na figura abaixo:
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
Versão Header Precedência Length of Datagram
Endereço IP Origem
Endereço IP Destino
Opções
Dados
13
identificação contém um único inteiro que identifica o datagrama, é
um campo muito importante porque quando um gateway fragmenta
um datagrama, ele copia a maioria dos campos do cabeçalho do
datagrama em cada fragmento, então a identificação também deve
ser copiada, com o propósito de que o destino saiba quais
fragmentos pertencem a quais datagramas. Cada fragmento tem o
mesmo formato que um datagrama completo.
• FRAGMENT OFFSET: especifica o início do datagrama original dos
dados que estão sendo transportados no fragmento. É medido em
unidades de 8 bytes.
1.4.1 TCP
O TCP (Transmission Control Protocol) proporciona conexões de dados
confiáveis para as aplicações. O TCP conta com mecanismos que garantem
que os dados são entregues às suas aplicações locais:
• Íntegros
• Em seqüência
• Completos
• Sem duplicatas
Os mecanismos básicos que o TCP usa para conseguir isso são:
• Numeração dos segmentos
14
• Estabelecimento de Timeout
• Retransmissão dos segmentos
O lado que recebe os dados deve colocá-los em na seqüência correta,
descartando duplicatas e confirmando o recebimento dos mesmos.
O TCP é implementado apenas nos hosts. O TCP é um protocolo full-
duplex, ou seja, ambos os lados podem enviar dados ao mesmo tempo.
O TCP adiciona um cabeçalho ao pacote de dados da aplicação,
formando um segmento.
O TCP passa os segmentos ao IP, que então roteia os mesmos até seu
destino. O TCP aceita segmentos do IP, determina qual aplicação é o destino,
e passa os dados para a aplicação apropriada.
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
Porta Origem Porta Destino
Número de Seqüência
Número de Reconhecimento
Opções
Dados
15
• Offset: contém um inteiro que especifica o início da porção de dados
do segmento. Este campo é necessário já que o campo Options varia
em comprimento dependendo de quais opções tenham sido
incluídas.
• Reserv: reservado para uso futuro.
• Flags (6 bits): determina o propósito e conteúdo do segmento,
codificado assim:
o URG - Campo de ponteiro Urgente é válido
o ACK - Campo de Reconhecimento é válido
o PSH - Este segmento solicita um PUSH
o RST - Reset da conexão
o SYN - Sincroniza numeros de sequências
o FIN - O transmissor chega ao fim do fluxo de bytes.
• WINDOW: através deste campo o software TCP indica quantos
dados ele tem capacidade de receber em seu buffer.
• URGENT POINTER: TCP através deste campo permite que o
transmissor especifique que alguns dados são urgentes, isto significa
que os dados serão expedidos tão rápido quanto seja possível.
• OPTIONS: o software TCP usa este campo para se comunicar com o
software do outro extremo da conexão.
• CHECKSUM: é usado para verificar a integridade tanto do cabeçalho
como dos dados do segmento TCP.
1.4.2 UDP
O UDP não faz nenhuma garantia quanto à entrega dos dados, e é
dever da aplicação trocar informações que confirmem a chegada dos dados. O
UDP é implementado apenas nos hosts.
Com o UDP (User Datagram Protocol), uma aplicação manda uma
mensagem isolada para outra aplicação. O UDP adiciona um cabeçalho,
formando um datagrama UDP.
O UDP passa os segmentos ao IP, que então roteia os mesmos até seu
destino. O UDP aceita segmentos do IP, determina qual aplicação é o destino,
e passa os dados para a aplicação apropriada.
1.4.3 ICMP
O IP tem um projeto simples e elegante. Em condições normais, o IP faz
um uso muito eficiente da memória e recursos de transmissão.
Como IP provê um serviço de expedição de datagramas sem conexão e
não confiável, e além disso um datagrama viaja de um gateway a outro até
alcançar um gateway que possa expedí-lo diretamente à estação destino; é
16
necessário um mecanismo que emita informações de controle e de erros
quando acontecerem problemas na rede. Alguns dos problemas típicos que
podem acontecer são:
• Um gateway não pode expedir ou rotear um datagrama;
• Um gateway detecta uma condição não usual, tal como
congestionamento.
O mecanismo de controle que emite mensagens quando acontece algum
erro é a função principal do protocolo ICMP. O ICMP permite aos gateways
enviar mensagens de erros ou de controle a outros gateways ou hosts. ICMP
provê comunicação entre o software de IP numa máquina e o software de IP
numa outra máquina.
Tabela 1-1 Mensagens ICMP
Tipo Mensagem
0 Echo Reply
3 Destination Unreachable
4 Source Quench
5 Redirect
8 Echo
11 Time Exceeded
12 Parameter Problem
13 Time Stamp
14 Time Stamp Reply
ICMP somente reporta condições de erros à fonte original. A fonte deve
relatar os erros aos programas de aplicação individuais e tomar ação para
corrigir o problema. Uma das mensagens que o ICMP pode enviar é:
Destination Unreachable, o qual, por sua vez pode ser dos seguintes tipos:
• Network Unreachable (rede não alcançável)
• Host Unreachable (máquina não alcançável)
• Port Unreachable (porta não alcançável)
• Destination Host Unknown (máquina destino desconhecido)
• Destination Network Unknown (rede destino desconhecida)
17
Obviamente não é justo que um único usuário da domine os recursos da
rede por muito tempo. Com a divisão da informação em pacotes, cada um dos
pacotes pode ser enviado/recebido individualmente, permitindo assim que
outros pacotes possam trafegar pela rede. Isso possibilita um
compartilhamento justo dos recursos.
Na maioria dos casos, os dispositivos são conectados através de cabos.
Em alguns casos, usa-se ondas de rádio ou mesmo luz infravermelha. Ambas
as formas de conexão física estão sujeitas a interferências, que podem
corromper os dados que trafegam na rede. Grande parte do trabalho complexo
em redes é detectar e solucionar os erros no tráfego dos dados.
A maioria das técnicas de detecção e correção de erros é baseada no
uso de checksums. Quando a informação é enviada, é anexado em seu final
um número indicando a soma de todos os bytes da mesma. Na recepção, esse
número é comparado com a soma dos dados recebidos. Se houver diferença,
a informação está corrompida e deve ser retransmitida.
Caso o bloco de dados seja muito grande, o reenvio vai tomar muito
tempo, degradando a performance da rede. Para minimizar este problema,
divide-se a informação em pacotes. Se houver algum erro, basta retransmitir
apenas os pacotes corrompidos.
Aplicaçao Dados
Dados
{
Transporte TCP Dados
Segmento TCP Header
1.6 Roteamento
O TCP/IP pode ser usado em redes locais e para interligação de redes.
As diversas redes locais conversam através dos roteadores. Pode haver mais
de um caminho entre dois pontos.
18
As redes isoladas são conectadas por meio de Roteadores IP.
Roteadores modernos são equipados com vários slots que podem receber
diferentes tipos de adaptadores de rede: Ethernet, Token-Ring, FDDI, PPP, etc.
O software de IP roda nos hosts e nos roteadores.
• Se o destino está no mesmo enlace, manda-se o datagrama
diretamente para ele;
• Se o destino não está no mesmo enlace, manda-se o pacote para o
roteador local;
• Se o destino não estiver no mesmo enlace do roteador, este irá
repassá-lo ao próximo roteador. Este processo continua até que o
destino seja atingido.
Pode ser útil ilustrar isto com um exemplo. Imagine um simples roteador
de escritório, ele pode ter um link intermitente com a Internet, um número de
segmentos Ethernet alimentando as estações de trabalho e outro link PPP
intermitente fora de outro escritório. Quando o roteador recebe um datagrama
de qualquer de suas conexões de rede, o mecanismo que usa determina qual a
Roteador Nó
Nó
Roteador
Nó Roteador
Nó
Rede Nó
Nó Local
Internet
Nó
Nó
Nó
próxima interface deve enviar o datagrama. Computadores simples também
precisam rotear, todos os computadores na Internet têm dois dispositivos de
rede. Um é a interface loopback (explicada acima), o outro é usado para falar
com o resto da rede, talvez uma interface Ethernet, talvez uma interface serial
PPP ou SLIP.
19
seu próximo passo através da rede. No GNU/Linux você pode ver a tabela de
roteamento usando um dos seguintes comandos:
cat /proc/net/route
route -n
netstat -r
1.6.1 Reempacotamento
Existe um evento olímpico onde um competidor nada uma parte do
percurso, pega uma bicicleta e pedala outra parte, e corre uma terceira etapa.
O IP funciona da mesma maneira. O datagrama foi projetado para poder ser
mudado de uma mídia para outra até chegar ao seu destino.
Antes de um datagrama ser transmitido por um enlace, ele é
empacotado em um quadro apropriado para o enlace. Quando um roteador
recebe o quadro:
• O roteador desempacota o quadro e extrai o datagrama
• O roteador analisa o endereço de destino e descobre a mídia do
próximo trecho
• O roteador reempacota o datagrama em um novo quadro, apropriado
para o próximo laço
20
Exercícios
1. Em que nível de TCP/IP rodam o telnet e o ftp?
a) Físico
b) Sessão
c) Aplicação
d) Transporte
e) Enlace
21
2 ENDEREÇAMENTO
Em uma rede, o endereço de um dispositivo é uma forma de identificar
esse dispositivo como sendo único. Normalmente, os endereços de rede
possuem um formato padronizado e bem definido.
22
endereços em comum. A porção dos endereços que são comuns entre todos
os endereços de uma rede é chamada de porção da rede. O conjunto dos
dígitos restantes é chamado de porção dos hosts. O número de bits que são
compartilhados por todos os endereços dentro da rede é chamado de netmask
(máscara da rede) e o papel da netmask é determinar quais endereços
pertencem ou não a rede. Por exemplo, considere o seguinte:
Tabela 2-1 Formação de Endereços IP
2.2.1 Multihoming
Os sistemas não tem endereços IP, as suas interfaces é que os têm.
Um roteador com quatro interfaces de rede precisa de quatro endereços IP.
Um sistema que está ligado a mais de uma sub-rede é chamado de
multihomed.Classes de Rede IP
Por razões administrativas após pouco tempo no desenvolvimento do
protocolo IP alguns grupos arbitrários de endereços foram formados em redes
e estas redes foram agrupadas no que foram chamadas de classes. Estas
classes armazenam um tamanho padrão de redes que podem ser usadas. As
faixas alocadas são:
23
Tabela 2-2 Classes de Endereçamento
Você deve decidir primeiro qual será a largura de sua rede e então
escolher a classe de rede que será usada.
Pode-se obter um software de Proxy que repassa a informação entre os
computadores internos e o mundo exterior através do endereço de Classe C
registrado.
24
2.2.4.2 O endereço de Broadcast
O endereço IP 255.255.255.255 é reservado para broadcast para todos
os sistemas no link local.
Se os bits da estação forem todos 1, é feito um broadcast para a sub-
rede correspondente. Por exemplo, o Endereço 192.18.7.255 significa um
broadcast para a rede 192.18.7.0.
Se os bits da estação e sub-rede forem todos 1, é feito um broadcast
para todas as estações da rede indicada.
Um boa regra é nunca usar endereços de rede ou estação cujos bits
sejam todos iguais (0 ou 1). Daí pode-se deduzir que um campo nunca pode ter
menos do que 2 bits.
25
11111111 11111111 11111111 11110000
Ou, na forma decimal, 255.255.255.240.
Bits de Números de Bits da Número de
Sub-Rede Sub-Rede Estação Máquinas Máscara
0 0 8 254 255.255.255.0
1 2 7 128 255.255.255.128
2 4 6 62 255.255.255.192
3 8 5 30 255.255.255.224
4 16 4 14 255.255.255.240
5 32 3 6 255.255.255.248
6 64 2 2 255.255.255.252
7 - 1 - Inválido
A tabela acima mostra as várias maneiras em que um endereço local de
classe C pode ser dividido. Ele também mostra o número de sub-redes e
estações para cada partição. O número de sub-redes e estações é menor do
que o que se espera porque alguns endereços são reservados para propósitos
específicos.Super-Redes e CDIR
O método de atribuir blocos de endereços de classe A, B e C era muito
ineficiente. Um bloco de Classe C proporciona 254 endereços, que pode ser
muito ou pouco, dependendo do tamanho da organização. Pode haver
escassez ou desperdício de endereços.
Faria mais sentido atribuir às organizações o número de bits que elas
realmente precisam. Isso é feito facilmente. Se uma organização precisa de
4000 endereços, ela ganha 12 bits para usar como parte local de seu
endereçamento. Os 20 bits restantes são o prefixo, usado como endereço de
super-rede ou prefixo. A maneira de nomear esse endereço “sem classe” é
“/20”. Obter um prefixo de 20 bits é equivalente a obter 16 blocos contínuos de
classe C.
Para rotear para uma organização, o roteador precisa saber o número
de bits no prefixo e o padrão de bits designado para o prefixo da organização.
O roteador pode então enviar tráfego para a organização com uma única
entrada na tabela de roteamento. Isto é chamado Classless Internet-Domain
Routing (CDIR).Referência rápida de máscara de redes
A tabela abaixo faz referência às máscaras de rede mais comuns e a
quantidade de máquinas máximas que ela atinge. Note que a especificação da
máscara tem influência direta na classe de rede usada:
Máscara Máscara Número de
(octal) (32 bits) Máquinas
Classe A:
/8 /255.0.0.0 16,777,214
/9 /255.128.0.0 8,388,606
/10 /255.192.0.0 4,194,302
26
/11 /255.224.0.0 2,197,150
/12 /255.240.0.0 1,048,574
/13 /255.148.0.0 524,286
/14 /255.252.0.0 262,142
/15 /255.254.0.0 131,070
Classe B:
/16 /255.255.0.0 65,534
/17 /255.255.128.0 32,766
/18 /255.255.192.0 16,382
/19 /255.255.224.0 8,190
/20 /255.255.240.0 4,094
/21 /255.255.248.0 2,046
/22 /255.255.252.0 1,022
/23 /255.255.254.0 510
Classe C:
/24 /255.255.255.0 254
/25 /255.255.255.128 126
/26 /255.255.255.192 62
/27 /255.255.255.224 30
/28 /255.255.255.240 14
/29 /255.255.255.248 6
/30 /255.255.255.252 2
/32 /255.255.255.255 1
Qualquer outra máscara fora desta tabela (principalmente para a classe
A), deverá ser redimensionada com uma calculadora de IP para chegar a um
número aproximado de redes/máquinas aproximados que deseja.
Portas
TCP UDP
27
incluídos no cabeçalho de cada segmento TCP ou pacote UDP.
Exercícios
1. O que significa a sigla MAC?
a) Media Assynchronous Connection
b) Master Assynchronous Connection
c) Media Access Connection
d) Media Access Control
e) Master Access Control
28
3 CONECTANDO REDES
Adaptado de
http://www.conectiva.com/doc/livros/online/8.0/servidor/conectividade.html#CONECTANDO-
REDES
A criação de grandes redes de computadores é possível graças à
interligação de pequenas redes de computadores. No entanto, essa divisão de
redes em pequenas unidades gera a necessidade de se criar meios que
permitam que essas unidades sejam capazes de se conectar e trocar
informações.
Além dos meios físicos (cabos, hubs, roteadores, etc.) são necessários
também os meios lógicos que permitam essa troca de informação. Serão
estudados a seguir os conceitos básicos sobre roteamento, e em seguida será
visto um tipo particular de roteamento chamado NAT (Network Address
Translation).
3.1 Roteamento
Para entender melhor como funciona o processo de transmissão de um
pacote de dados dentro de uma rede, pode ser feita uma analogia com o
processo de uma ligação telefônica. Ao se discar o número do telefone com
quem se deseja falar, a sua central telefônica verifica se o número está
conectado a ela, se não estiver ela "encaminha" a sua ligação para outra
central que por sua vez faz o mesmo teste, até chegar a central onde se
localiza o número de destino. Os códigos de país, área e o prefixo do telefone
são utilizados para determinar para qual central sua ligação deve ser
encaminhada. Cada central por onde a ligação passa, além de decidir para
onde encaminhar a ligação, funciona também como uma espécie de
retransmissora ao receber sua ligação de uma central e repassá-la para outra.
Um processo bastante semelhante acontece em uma rede de
computadores, ou seja, quando um computador tenta se comunicar com outro
que não esteja diretamente ligado a ele (ou em sua sub-rede), ele deve enviar
seus datagramas para uma máquina especial, ligada a duas ou mais redes e
que encaminhará os datagramas para o destino. Essa máquina especial recebe
o nome de gateway ou roteador, e ao processo de decidir para onde repassar
os datagramas chamamos de roteamento.
A idéia básica do roteamento é a criação de regras que estabeleçam que
caminho um datagrama deve tomar baseado no endereço de destino dele. Em
uma máquina cliente essa regra é bastante simples: tudo que não for para a
rede local deve ser enviado para a máquina gateway (essa regra é chamada
rota padrão). Já em uma máquina gateway podem ser necessárias muito mais
regras, principalmente se essa máquina está conectada a um grande número
de redes.
29
pelo administrador, enquanto que as rotas dinâmicas podem ser "aprendidas"
através da utilização de um serviço especial para esse fim.
As rotas dinâmicas utilizam protocolos especiais como o RIP (Routing
Information Protocol), OSPF (Open Shortest Path First) e BGP (Border
Gateway Protocol) para divulgar e aprender rotas. O Linux possui o serviço
routed que é capaz de utilizar estes protocolos.
As rotas estáticas podem ser configuradas com o auxílio do Linuxconf, e
não necessitam de nenhum serviço adicional. Será visto aqui apenas a
configuração de rotas estáticas, já que a utilização de rotas dinâmicas
normalmente só é necessária em grandes redes e Sistemas Autonômos (AS).
3.1.2 Gateway
Um gateway ou roteador funciona como uma porta de saída de uma
rede; ele é um máquina equipada com duas ou mais interfaces ou dispositivos
de rede e é capaz de fazer o repasse de datagramas para fora ou para dentro
da rede.
Essa máquina possui diferentes números IPs associados a cada
interface. O Linux é capaz de decidir automaticamente por qual interface de
rede ele deve enviar datagramas baseado nos IPs de cada interface e na
definição da rota padrão.
Existem alguns casos nos quais é necessário informar ao seu gateway
como alcançar uma determinada rede, por exemplo, no caso dessa rede estar
por trás de um outro gateway. Para esses casos especiais é necessário inserir
uma rota estática para esta rede (caso não se esteja usando um serviço de
rotas dinâmicas).
3.2 Netfilter
O kernel do Linux possui recursos bastante sofisticados para filtrar e
transformar pacotes IP. Esses recursos, agrupados sob o nome de netfilter,
podem ser configurados com o auxílio do comando iptables. O netfilter permite
a construção de firewalls e de gateways com NAT (Network Address
Translation). O site oficial do netfilter é http://netfilter.gnumonks.org/.
• Serão estudados aqui os conceitos básicos do netfilter e como utilizar o
recurso de NAT.
30
3.2.1 Anatomia do netfilter
O netfilter possui um conjunto de ganchos (também chamados de
cadeias ou chain) em vários pontos da pilha de um protocolo (será considerado
aqui somente o protocolo IPv4). Cada gancho é um ponto no caminho que um
pacote IP percorre ao entrar ou sair de uma máquina, conforme a figura abaixo:
3.2.2 NAT
Os números IPs da Internet são finitos e cada número deve ser único. O
crescimento explosivo da Internet tem transformado estes números em um
31
recurso escasso, e para se obter um número ou conjunto de IPs válidos é
necessário requisitá-los a um órgão regulador e pagar por eles. Logo, em
muitos casos não se justifica construir redes locais utilizando-se números IPs
válidos.
Como alternativa certos intervalos de números IPs são considerados
inválidos, isto é, não são utilizados na Internet, permitindo assim que eles
possam ser utilizados em intranets sem problemas, ou seja, várias intranets
podem utilizá-los desde que não estejam diretamente conectadas umas às
outras. No entanto, isso cria um dilema: como conectar uma intranet que utiliza
números IPs inválidos à Internet?
A resposta a essa pergunta é através da utilização de um roteador que
possua um número IP válido e que seja capaz de fazer uma tradução de
endereços de rede (NAT). Para entender melhor o que isso significa considere
o seguinte cenário: uma rede local ligada à Internet através de um roteador
com conexão discada. Ao se conectar na Internet, a máquina gateway recebe
um número IP válido do provedor de acesso. Quando uma máquina da intranet
precisa se conectar a um site (por exemplo), ela envia seus pacotes IPs com a
requisição à máquina gateway, que por sua vez altera os cabeçalhos destes
pacotes inserindo o número IP que ela recebeu do provedor e os envia através
de sua conexão. O site responde à requisição enviando a resposta para a
máquina gateway que altera novamente os cabeçalhos dos pacotes e os envia
à máquina que originalmente os requisitou. Dessa forma, cada máquina da
intranet se comporta como se estivesse ligada diretamente à Internet, enquanto
que as várias máquinas na Internet "enxergam" apenas a sua máquina
gateway.
32
4 VULNERABILIDADES NO PROTOCOLO TCP/IP
Ultimamente temos presenciado um novo fenômeno no underground
digital. O fenômeno em si não é novo, mas tornou-se muito fácil acessar as
ferramentas necessárias para fazer más ações, temos experimentado muitas
instâncias.O fenômeno é conhecido por diferentes nomes (Smurph, Land,
Bonk,etc). O intuito de todos, contudo, é o mesmo: impedir computadores
desabilitando seu uso como pretendido.
Esse capítulo tenta explicar esses ataques.
33
4.3 IP Spoofing
Um ataque spoofing envolve a falsificação do endereço de origem. É o
ato de usar uma máquina para representar o papel de outra. A maioria das
aplicações e ferramentas no UNIX baseam-se na autenticação do IP de origem.
Muitos programadores têm usado controle de acesso baseado na máquina
para segurança das suas redes. O endereço IP de origem é um identificador
único mas não é fiável. Ele pode facilmente ser forjado (spoofed). Para
entender o processo de spoofing, Primeiro vou explicar o o processo de
autenticação do TCP e do IP e depois como um atacante pode enganar a
sua rede.
O sistema cliente começa por enviar uma mensagem SYN para o
servidor. O servidor então confirma a mensagem SYN enviando uma
mensagem de SYN-ACK para o cliente. O cliente então completa
estabelecendo a conexão respondendo com uma mensagem de ACK. A
conexão entre o cliente e o servidor é então aberta, e os dados específicos do
serviço podem ser trocado entre o cliente e o servidor. Cliente e servidor
podem agora enviar dados específicos do serviço.
O TCP usa números seqüenciais. Quando um circuito virtual é
estabelecido entre duas máquinas, o TCP designa para cada pacote um
número com um índice identificador. Amboa as máquinas usam este número
para verificarem erros e fazerem relatórios.
Rik Farrow, no seu artigo "Sequence Number Attacks", explica o sistema de
números seqüenciais como sendo o seguinte:
"Os números seqüenciais são usados para confirmar a
recepção de dados. No início de uma ligação TCP, o cliente envia
um pacote TCP com uma número seqüencial inicial, mas nenhum
reconhecimento. Se existir um servidor de aplicação a correr na
outra ponta da ligação, o servidor envia de volta um pacote TCP
com o seu próprio número seqüencial, e o reconhecimento; o
número inicial do pacote do cliente mais um. Quando o sistema
cliente recebe este pacote, ele deve enviar de volta o seu próprio
reconhecimento; a sequência de número inicial do servidor mais
um."
Desta forma um atacante tem dois problemas:
1) Ele deve falsificar o endereço origem.
2) Ele deve manter um número seqüencial com o destino.
A segunda tarefa é a mais complicada porque quando o destino ajusta o
número seqüencial inicial, o agressor deve responder corretamente. Assim que
o agressor adivinhe o número seqüencial correcto, pode então sincronizar com
o destino e estabelecer uma sessão válida.
34
• Qualquer serviço que use autenticação de endereço IP
• O sistema X Window
• O conjunto de serviços R (rlogin, rsh, etc.)
4.4.2 Land
Aqui o ataque acontece enviando-se um pacote com a flag SYN setada
(i.e. requisitando a abertura de uma conexão) para qualquer porta da máquina
35
alvo. O pacote é modificado de tal maneira que os endereços de envio e de
recebimento do pacote são idênticos (spoofing). Essa situação não é
corretamente manipulada por algumas implementações do TCP/IP - o
computador pára. Esse ataque é direcionado à porta 139 de máquinas
rodando o sistema operacional Windows.
4.4.3 WinNuke
O nuke tem sido uma atividade popular, principalmente em escolas.
Esse tipo de ataque é voltado principalmente para computadores rodando
Windows. O efeito principal é o congelamento do computador, que precisa ser
reiniciado.
A razão pela qual o computador trava é que a Microsoft não manipula
um flag especial de status no protocolo TCP - a flag URG(para urgente). Esse
flag é setado em um pacote enviado para um computador rodando um sistema
operacional Windows. O computador irá esperar por uma stream (cadeia de
dados) da chamada Out-of-Band (OOB) banda de tráfego do computador que
envia. Esse tipo de tráfego tem prioridade mais alta que o tráfego ordinário da
rede. O problema surge quando tais mensagens não são enviadas: o
computador para. Parece que se trata de resultado de uma má implementação
do protocolo TCP/IP da Microsoft, onde essa situação não é tratada
satisfatoriamente.
Esse ataque é muito simples de ser realizado (utiliza um canal legítimo)-
tem sido até mesmo implementado com uma linha de código na linguagem
Perl. Normalmente, o ataque é direcionado contra a porta 139 (Serviço
NetBIOS Session) do computador.
Por exemplo: suponhamos que um computador com IP 200.133.10.126
esteja com a porta 139 aceitando conexões. Na barra de endereços do
Browser, podemos digitar: http://200.133.10.126:139 e se ficarmos
atualizando a página, estaremos atacando essa máquina. Um simples
JavaScript pode automatizar essa tarefa.
Felizmente, é fácil proteger um computador contra esse tipo de ataque.
A Microsoft desenvolveu patches para download. Quando esse patches são
instalados, você está protegido contra esse tipo de ataque.
4.4.4 TearDrop
Esse ataque utiliza outra vulnerabilidade na implementação do protocolo
TCP/IP. O resultado desse ataque pode variar, mas, normalmente o
computador trava e precisa ser reiniciado. Os sistemas operacionais mais
vulneráveis são Windows(95/98/NT) e Linux.
A razão pela qual o ataque acontece deve-se a um erro em parte do
protocolo TCP/IP que toma conta de pacotes fragmentados. A fragmentação
do pacote pode ocorrer se o pacote que está sendo recebido for maior do que o
tamanho permitido pela rede. Caso positivo, o pacote é dividido em pacotes
menores, consistindo em partes do pacote original. Quando os pacotes
36
menores chegam ao computador recipiente, ele tenta colocá-los juntos -aqui
ocorre o erro e o computador pára.
Tecnicamente, o ataque é conduzido mandando uma combinação
especial de dois pacotes UDP/IP. O primeiro tem deslocamento 0, a flag MF
(mais fragmentos) setada para 1 e tamanho N. O segundo tem deslocamento
menor que N, flag MF resetada para 0 e tamanho menor que N. O segundo
pacote sobrepões-se ao primeiro. Uma implementação errônea do TCP/IP
interpreta o fim do pacote antes do seu começo e o computador pára.
4.4.5 NewTear
Esse ataque é parecido com o TearDrop. A diferença é o tamanho da
sobreposição dos pacotes (20 bytes, enquanto o TearDrop usa 28) e a
manipulação do tamanho do UDP. Esse ataque funciona contra máquinas
rodando Windows95/98 e NT mesmo que o patch TearDrop esteja instalado, o
que demonstra que a Microsoft não levou as variações do ataque em conta
quando o patch foi programado.
4.4.6 Bonk/Boink
Outra variação do ataque TearDrop. O deslocamento do fragmento do
segundo pacote é ajustado para ser maior do que o comprimento do cabeçalho
IP. Semelhante aos outros ataques, o computador pára. Não se sabe porquê
esse ataque funciona.
O Bonk ataca a porta 55 das máquinas. O Boink é uma variação do
Bonk - a diferença é que esse último permite ataques em outras portas, além
da 55.
4.4.7 Ssping
Uma variação do ataque chamado "Ping da Morte". Uma pessoa
manda um pacote ICMP (ECHO_REQUEST) com um tamanho anormal para a
máquina alvo. O tamanho máximo para datagramas TCP/IP é 65536 octetos (1
octeto = 8 bits). Contudo, é possível mandar datagramas maiores do que o
tamanho máximo definido. Quando a máquina alvo recebe tal pacote pode
parar. Mais uma vez, o erro deve-se a má implementação na secção do
TCP/IP que manipula pacotes fragmentados. Um teste simples para testar se
você é vulnerável é pingar seu próprio computador. Use o comando ping -s
65510 seu_ip. Se sua máquina parar você é vulnerável a esse tipo de
ataque.
4.4.8 Smurf
Smurfing é outro tipo de ataque semelhante aos que foram discutidos
aqui. Esse tipo de ataque Smurf pode ser considerado mais perigoso que os
outros.
37
O ataque Smurf não tem intenção de parar um computador, mas sim
uma rede inteira. É realizado enviando contínuas stream (cadeias) de pacote
ICMP modificados para a rede alvo.
Os pacotes são modificados de modo que o endereço da máquina que
envia os dados é idêntico ao endereço do alvo (spoofing). Além disso, os
pacotes são enviados para os chamados endereços broadcast, o que resulta
em os pacotes modificados serem enviados para todos os computadores de
uma rede. Os computadores dessa rede irão responder enviando uma
mensagem de ICMP ECHO_RESPONSE para o computador que eles
assumem ter enviado a mensagem ( o computador alvo da rede).Se o atacante
tiver uma conexão rápida,não é preciso ser um grande matemático para saber
que a quantidade de dados gerados pode parar a rede atacada. A rede irá
parar até que o atacante pare de enviar os pacotes ou o tráfego seja
bloqueado.
Esse tipo de ataque tem sido usado para parar vários Provedores de
Acesso à Internet e todos os seus usuários. Efetivamente, é difícil se proteger
desse tipo de ataque.
38
5 FIREWALL IPCHAINS
Adaptado do Linux IPCHAINS-HOWTO, Paul Russell, <ipchains@rustcorp.com>,
v1.0.7, 12 March 1999
Tradução para o português por Gleydson Mazioli da Silva, <gleydson@linuxbr.com.br>
5.1 Introdução
Este é o Linux IPCHAINS-HOWTO; Veja “Onde?” para o ver site
principal, que contém a última cópia. Você também deve ler o Linux NET-3-
HOWTO. O IP-Masquerading HOWTO, o PPP-HOWTO, o Ethernet-HOWTO e
o Firewall HOWTO que podem ser uma leitura interessante. (Então denovo a
FAQ alt.fan.bigfoot).
Se a filtragem de pacotes é passado para você, leia a seção “Porque?”,
Seção “Como?” e verifique os títulos na seção “IP Firewalling Chains”.
Se você esta convertendo através do ipfwadm, leia a secao “Introdução”,
Seção “Como?”, e os Apêndices da seção “Diferenças entre ipchains e
ipfwadm” e a seção “Usando o script ipfwadm-wrapper”.
5.1.1 O que?
O ipchains do Linux é uma regravação do codigo de firewall IPv4 do
linux (que foi originalmente roubado do BSD) e uma regravação do ipfwadm,
que foi uma regravação do ipfw dos BSD’s, eu acho. É requerido para
administrar os filtros de pacotes IP nos kernels do linux 2.1.102 e superiores.
5.1.3 Como?
Atualmente o código está no kernel em desenvolvimento do 2.1.192.
Para as séries do kernel 2.0, você precisará fazer o download de um
patch da página Internet. Se seu kernel 2.0 é mais recente que o patch
fornecido, o patch antigo ser OK; esta parte dos kernels 2.0 é razoavelmente
estável (eg. o patch do kernel 2.0.34 funciona perfeitamente com o kernel
2.0.35). Desde então o patch 2.0 é incompatível com patches do ipportfw e
ipautofw, eu não recomendo aplica-los a não ser que você ralmente necessita
da funcionalidade que o ipchains oferece.
39
5.1.4 Onde?
A página oficial é The Linux IP Firewall Chains Page
http://www.rustcorp.com/linux/ipchains
Lá existe uma lista de discussão para relatar bugs, discussões,
desenvolvimento e uso. Entre na lista de discussão enviando uma mensagem
contendo a palavra “subscribe” para <ipchains-request@rustcorp.com>. Para
enviar E-Mails para a lista use “ipchains” ao invés de “ipchains-request”.
5.2.1 O que é?
Todo o tráfego da rede é enviado em forma de pacotes. Por exemplo,
copiando este pacote (digamos de 50k) pode fazer você receber 36 ou assim
pacotes de 1460 bytes em cada um, (puxando números ao acaso).
O inicio de cada pacote diz onde ele esta indo, de onde vem, o tipo do
pacote, e outros detalhes administrativos. Isto inicia o pacote e é chamado de
cabeçalho (head). O resto do pacote que contém o dado atual sendo
transmitido, é usualmente chamado de corpo (body).
Alguns protocolos, como TCP, que é usado para o trafego na web, mail,
e logins remotos, usam o conceito de “conexão”—antes de qualquer pacote
com os dados atuais serem enviados, vários pacotes de configuração (com
cabeçalhos especiais) são trocados dizendo “Eu desejo conectar”, “OK” e
“Obrigado”. Então os pacotes normais são trocados.
Uma filtragem de pacotes é uma peça de software que olha no
cabeçalho do pacote quando eles passam, e decide o destino de todo o pacote.
Ele pode decidir negar o pacote (DENY - ie. descartar o pacote como se
ele nunca tivesse o recebido), aceita o pacote (ACCEPT - ie. deixar o pacote
seguir adiante), ou rejeitar o pacote (REJECT - como negar, mas avisa a
origem do pacote sobre o acontecido).
No Linux, a filtragem de pacotes é embutida no kernel, e aqui estão
algumas coisas que nós podemos fazer com os pacotes, mas o principio geral
é de olhar o cabeçalho dos pacotes e decidindo seu destino.
40
copiando-a. Dizendo para o filtro de pacotes não permitir qualquer
pacotes para ou de o endereço conhecido por doubleclick.net resolve
este problema (lá estão meios melhores de se fazer isto).
• Segurança: quando um computador linux é a única coisa entre o
caos da Internet e sua bonita e organizada rede, é maravilhoso
conhecer como você pode restringir o que vem batendo em sua
porta. Por exemplo, você pode permitir ir para fora de sua rede, mas
você pode estar preocupado com os conhecidos “Ping of Death”
(ping da morte) que vem de computadores maliciosos de fora. Como
outro exemplo, você pode não desejar que pessoas de fora
TELNETiando seu computador linux, embora mesmo que todas suas
contas tenham senhas; talvez você deseja (como muitas pessoas)
ser um observador na Internet, e não um servidor (legando ou caso
contrário) -- simplesmente não deixe ninguém conectar em seu
computador, tendo filtros de pacotes rejeitando pacotes de entrada
usado para iniciar conexões.
• Vigilância: muitas vezes uma máquina mal configurada na rede
local pode decidir enviar pacotes para fora da rede. É bom dizer ao
filtro de pacotes para avisa-lo se alguma coisa de anormal ocorre;
talvez você pode fazer alguma coisa sobre isto, ou talvez você está
simplesmente curioso por natureza.
5.2.3 Como?
CONFIG_EXPERIMENTAL=y
CONFIG_FIREWALL=y
CONFIG_IP_FIREWALL=y
CONFIG_IP_FIREWALL_CHAINS=y
41
CONFIG_FIREWALL=y
CONFIG_IP_FIREWALL=y
A ferramenta ipchains fala com o kernel e diz a ele quais pacotes filtrar.
A não ser que você seja um programador, ou curioso demais, assim você
controlará a filtragem de pacotes.
5.2.3.2 O ipchains
A ferramenta ipchains insere ou deleta regras da seção de filtragem de
pacotes do kernel. Isto quer dizer que qualquer coisa que você configurar, será
perdida na reinicialização; veja “Fazendo Regras Permanentes” para como
fazer as regras serem restauradas quando o Linux é iniciado.
O ipchains substitui o ipfwadm, que foi usado pelo antigo código de
firewall de IP. Há um conjunto de scripts úteis disponíveis no site ftp do
ipchains: ftp://ftp.rustcorp.com/ipchains/ipchains-scripts-1.1.2.tar.gz
Este contém um script shell chamado ipfwadm-wrapper que permite
fazer a filtragem de pacotes como fez antes. Você provavelmente não deve
usar este script a não ser se deseje fazer um método rápido de upgrade em um
sistema que usa o ipfwadm (ele é lento, não checa argumentos, etc).
Neste caso, você não precisa muito deste HOWTO.
Veja Apêndice “Diferenças entre ipchains e ipfwadm” e Apêndice
“Usando o script ipfwadm-wrapper” para um assunto mais detalhado sobre
ipfwadm.
case “$1” in
start)
echo -n “Ativando a filtragem de pacotes:” /sbin/ipchains-restore <
/etc/ipchains.rules || exit 1 echo 1 > /proc/sys/net/ipv4/ip_forward echo “.”
;;
stop)
42
echo -n “Desativando a filtragem de pacotes:”
echo 0 > /proc/sys/net/ipv4/ip_forward
/sbin/ipchains -X
/sbin/ipchains -F
/sbin/ipchains -P input ACCEPT
/sbin/ipchains -P output ACCEPT
/sbin/ipchains -P forward ACCEPT
echo “.”
;;
*)
echo “Use: /etc/init.d/packetfilter {start|stop}”
exit 1
;;
esac
exit 0
43
5.3.2 Configurações de firewall simples
Você trabalha na littlecorp.com. Você tem uma rede interna, e uma
conexão dialup (PPP) simples com a Internet (firewall.littlecorp.com
que é 1.2.3.4). Você usa Ethernet em sua rede local, e sua máquina pessoal é
chamada “myhost”.
Esta seção ilustrará os diferentes arranjos no qual são comuns. Leia
com atenção porque cada um é sutilmente diferente.
44
5.3.2.2 Rede Privada: Masquerading
Neste cenário, pacotes da rede privada nunca atravessam a Internet
sem um tratamento especial, e vice versa. O endereço Ip da rede privada
devem ser escolhidos de acordo com o RFC1597 Private Network Allocations
(ie. 10.*.*.*, 172.16.*.* or 192.168.*.*).
Ao invés de usar um proxy, nós usamos facilidades especiais do kernel
chamadas “masquerading”. Masquerading regravam pacotes quando passam
através do firewall, assim eles sempre parecem vir do próprio firewall. Ele
então re-escreve as respostas assim eles pareceram estar indo para o
recipiente original.
Masquerading possui módulos separados para manipular protocolos
“enganados”, como FTP, RealAudio, Quake, etc. Para procolos realmente
difíceis de manipular, a facilidade “auto forwarding” pode manipular muitos
destes configurando automáticamente o forward de portas para configurações
de portas relacionadas: procure por “ipportfw” (kernels 2.0) ou “ipmasqadm”
(kernels 2.1).
45
quando ele regravou pacotes enviados para regrar as respostas quando
retornarem.
4. Netscape desenha a página.
46
Ele abre uma conexão para aquele endereço IP, usando a porta local
1050, e pergunta ao servidor web (porta 80) pela página web.
2. Como os pacotes de myhost (porta 1050) para slashdot.org (porta
80) passam pelo firewall, eles são direcionados para proxy transparente
aguardando na porta 8080. O proxy transparente abre uma conexão usando
(usando a porta local 1025) com 207.218.152.131 porta 80 (que é aqui onde os
pacotes originais estão indo).
3. Como o proxy recebe a página web de sua conexão com o
servidor web, ele copia os dados para a conexão com o Netscape.
4. Netscape desenha a página.
47
Netscape em myhost lê http://slashdot.org.
1. Netscape conecta-se com o firewall na porta 8080, usando a porta
1050 em myhost. Ele pergunta pela página internet “http://slashdot.org”.
2. O proxy procura o nome “slashdot.org”, e obtém 207.218.152.131.
Ele abre uma conexão com aquele endereço IP (usando a porta 1025 na
interface externa do firewall), e pergunta ao servidor web (porta 80) pela página
web.
3. Como ele recebe a página web de sua própria conexão com o
servidor web, ele copia os dados para a conexão do Netscape.
4. Netscape desenha a página.
48
A página oficial do Masquerading está disponível em
http://ipmasq.cjb.net.
49
pacotes malformados podem deixar o código de checagem de regras
confuso, e estes são negados aqui (uma mensagem é mostrada no
syslog se isto acontecer).
• input chain: Este é o primeiro chain firewall que será testado
contra o pacote. Se a decisão do chain não for NEGAR ou
REJEITAR, o pacote passa.
• Demasquerade: Se o pacote é uma resposta de um pacote anterior
do masquerade, (mascaramento) ele é desmascarado, e pula para o
chain output. Se você não usa o IP masquerading, você pode ignorar
esta parte no diagrama.
• Routing decision (decisão do roteamento): O campo de destino é
examinado pelo código de roteamento, para decidir se o pacote deve
ir para um processo local (veja processos locais abaixo) ou
direcionado (forward) para uma máquina remota (veja forward chains
abaixo).
• Local process (processo local): Um processo sendo executado
em uma máquina pode receber pacotes após o passo de decisão do
roteamento, e pode enviar pacotes (que vão pelo passo de decisão
do reteamento, quando atravessam o chain output).
• interface lo: Se pacotes de um processo locai são desinados a
um processo local, eles vão através do chain output com a interface
configurada para “lo”, então retorna pelo chain input também com a
interface “lo”. A interface lo é normalmente chamada de interface
loopback.
• local: Se o pacote não foi criado por um processo local, então o
chain forward é checado, caso contrário o pacote vai através do
chain output.
• forward chain: Este chain é usado para qualquer pacote que está
tentando passar entre esta máquina para outra.
• output chain: Este chain é usado para todos os pacotes antes de
serem enviados para fora.
$ ipchains—version
ipchains 1.3.9, 17-Mar-1999
Note que eu recomendo 1.3.4 (que não possui opões longas, como “—
sport”), ou 1.3.8 ou superior; estes são muito estáveis.
ipchains tem uma página de manual razoavelmente detalhada (man
ipchains), e se você precisa de mais detalhes em particularidades, você deve
50
checar a interface de programação (man 4 ipfw), ou o arquivo net/ipv4/ip_fw.c
no código fonte do kernel 2.1.x, que é (obviamente) autoritativo.
Também existem um excelente guia de referência rápida por Scott
Bronson no pacote fonte, em ambas A4 e US Letter PosScript™.
Existem diferentes outras coisas que você pode fazer com ipchains.
Primeiro operações para gerenciar chains completos. Você inicia com três
chains input, output e forward que voce não pode apagar.
51
(-D). os outros (-I para inserir e -R para substituir) são simples extensões
nestes conceitos.
Cada regra especifica uma cofiguração de condições em que o pacote
se encontra, e o que fazer quando a encontra (um “alvo”). Por exemplo,
você pode desejar negar todos os pacotes ICMP vindo do endereço IP
127.0.0.1. Assim neste caso nossas condições são que o protocolo
deve ser ICMP e que o endereço de origem deve ser 127.0.0.1. Nosso alvo é
“NEGAR”.
# ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms
Você pode ver aqui que o primeiro ping se sucede( o “-c 1”que dizer para
o ping enviar somente um pacote simples)
Então nós adicionamos (-A) um chain “input”, uma regra especificando
que para pacotes vindo de 127.0.0.1 (“-s 127.0.0.1”) com o protocolo ICMP (“-p
ICMP”) devem ser negados (“-j DENY”).
Quando nós testamos nossa regra, usando o segundo ping, Existe uma
pausa antes do programa aguardar a resposta que nunca vem.
Nós podemos apagar uma regra em um dos dois meios. Primeiro nós
conhecemos que esta é a única regra no chain input, nós podemos usar um
número para apagar, como em:
# ipchains -D input 1
52
O segundo meio é espelhar o comando -A, mas trocando o -A com -D.
Isto é útil quando voce tem um complexo conjunto de regras e você não deseja
conta-las para retirar a regra 37. Neste caso, nós podemos usar:
53
5.4.1.3.3.1 Especificando portas UDP e TCP
Para casos especiais onde um protocolo TCP ou UDP é especificado,
existem argumentos extras indicando a porta TCP ou UDP, ou um (exclusivo)
faixa de portas (mas veja “Dirigindo Fragmentos” abaixo). Uma faixa é
representada pelo caracter “:”, como “6000:6010”, que abrange 11 números de
portas, de 6000 para 6010. Se o menor número é omitido, o padrão será 0. Se
o maior número for omitido, o padrão será 65535. Assim para especificar
conexões TCP vindo de portas abaixo de 1024, a sintaxe deve ser como “-p
TCP -s 0.0.0.0/0 :1023”. Números de portas podem ser especificadas por
nomes, eg. “www”.
Note que a especificação de portas devem ser precedidas por uma “!”,
que inverte a regra. Assim para especificar qualquer pacote TCP menos uma
pacote WWW, você deve especificar p TCP -d 0.0.0.0/0 ! www
É importante realizar aquela especificação
é muito diferente de
54
5 redirect se não estiver executando
um daemon de roteamento
8 echo-request ping
11 time-exceeded traceroute
Note que os nomes ICMP não podem ser precedidos de “!” no momento.
Atenção: NÃO, bloqueie as mensagems ICMP do tipo 3! (Veja “Pacotes
ICMP” abaixo)
5.4.1.3.4 Especificando a Interface
A opção “-i” especifica o nome de uma interface para atingir. Uma
interface é o dispositivo físico onde o pacote vem, ou onde vai. Você pode usar
o comando ifconfig para listas as interfaces que estão em “up” (ie. trabalhando
no momento).
A interface para pacotes de entrada (ie. pacotes atravessando as regras
de entrada) é considerada sendo uma interface onde eles vem. Logicamente,
a interface para pacotes enviados (pacotes atravessando as regras de saída) é
a interface onde eles vão. A interface para pacotes atravessando os chains
forward é também a interface onde eles serão enviados para fora; me parece
uma decisão bastante arbitrária.
É perfeitamente legal especificar uma interface que atualmente não
existe; a regra não atingirá nada até que a interface seja iniciada. Isto é
extremamente útil para conexões PPP dialup (normalmente a interface ppp0).
Como um caso especial, um nome de interface finalizando com um “+”
atinge todas as interfaces (até mesmo se existem atualmente ou não) que
começam com aquele string. Por exemplo, para especificar uma regra que
atinge todas as interfaces PPP, a opção “-i ppp+” pode ser usada.
O nome da interface pode ser precedida por uma “!” para não atingir
pacotes que NÃO conferem com a interface especificada.
5.4.1.3.5 Especificando somente pacotes TCP SYN
É muitas vezes útil permitir conexões TCP em uma direção, mas não em
outra. Por exemplo, você pode desejar permitir conexões para uma servidor
WWW externo, mas não conexões daquele servidor.
Uma aproximação ingênua pode ser bloquear pacotes TCP vindo do
servidor. Infelizmente, conexões TCP requerem pacotes indo em ambas
direções para funcionarem corretamente.
A solução é bloquear somente os pacotes usados para requisitar uma
conexão. Estes pacotes são chamados SYN (ok, técnicamente eles são
pacotes com a flag SYN configurada, e as flags FIN e ACK limpas, mas nós os
chamamos de pacotes SYN). Desativando somente estes pacotes, nós
podemos parar tentativas de conexões em seus rastros.
A flag “-y” é usada para isto: é somente válida para regras que
especificam TCP como seu protocolo. Por exemplo, para especificar tentativas
de conexão TCP de 192.168.1.1:
p TCP -s 192.168.1.1 -y
55
Mais uma vez, esta opção pode ser invertida se for precedida de um “!”,
que diz que cada pacote sem ser a inicialização da conexão.
5.4.1.3.6 Dirigindo Fragmentos
As vezes um pacote é muito grande para passar de uma só vez.
Quando isto acontece, o pacote é dividido em framentos, e enviado como
múltiplos pacotes. O outro lado remonta os fragmentos para reconstruir o
pacote inteiro.
O problema com fragmentos é que muitas das especificaçõess listadas
acima (em particular, porta de origem, porta de destino, tipo ICMP, código
ICMP, ou opção TCP SYN) requerem que o kernel verifique no inicio do pacote,
que é o único que contém o primeiro fragmento.
Se sua máquina é a única conectada a uma rede externa, então você
pode dizer para o kernel do linux para remontar todos os fragmentos dos
pacotes que passam através dele, compilando o kernel com IP: always
defragment (sempre desfragmentar) configurado para “Y”. Isto nítidamente
evita isto.
Caso contrário, é importante entender como os fragmentos são tratados
pelas regras de filtragem. O primeiro fragmento é tratado como qualquer outro
pacote. O segundo e os fragmentos seguintes não são. Assim uma regra -p
TCP -s 192.168.1.1 www (especificando uma porta de origem de “www”) nunca
atingirá um fragmento (do segundo em diante). Nem será o oposto a regra -p
TCP -s 192.168.1.1 ! www.
No entanto, você pode especificar uma regra especificamente para o
segundo e outros fragmentos, usando a opção “-f”. Obviamente, é ilegal
especificar uma porta TCP ou UDP, tipo ICMP, código ICMP ou a opção TCP
SYN em tal regra de fragmento.
É também permitido especificar que uma regra que não se aplica ao
segundo e fragmentos seguintes, procedendo “-f” com “!”.
Normalmente é considerado como seguro deixar o segundo e outros
fragmentos atravessarem, desde que a filtragem afetará o primeiro fragmento,
e assim previne a remontagem no computador de destino, porém, tem sido
conhecido bugs para permitir o travamento de máquinas simplesmente
enviando fragmentos.
Nota para cabeças de rede: pacotes mal formados (TCP, UDP e pacotes
ICMP muitos curtos para o c¢digo de firewall ler as portas ou código e tipo
ICMP) são tratados como fragmentos também. Sometne fragmentos TCP
iniciando na posição 8 são explicitamente derrubados pelo código do firewall
(uma mensagem aparecerá no syslog se isto ocorrer).
Como um exemplo, a seguinte regra derrubará quaisquer fragmentos
indo para 192.168.1.1:
56
5.4.1.4 Efeitos do Lado da Filtragem
OK, agora nós conhecemos todos os métodos que podemos atingir um
pacote usando uma regra. Se um pacote confere com a regra, as seguintes
coisas podem acontecer:
1. O contador de byte para aquela regra é aumentado pelo tamando
do pacote (cabeçalho e tudo).
2. O contador de pacotes para aquela regra é incrementado.
3. Se a regra o requisitar, o pacote é registrado.
4. Se a regra o requisitar, o campo do pacote Type Of Service é
alterado.
5. Se a regra o requisitar, o pacote é marcado (não em kernels da
série 2.0).
6. O alvo da regra é examinado para decidir o que fazer com o
próximo pacote.
Para variedade, todos estas regras estão em ordem de importância.
5.4.1.4.1 Especificando um alvo
Um alvo diz ao kernel o que fazer com um pacote que confere cum uma
regra. ipchains usa “-j” (pense como “jump-to” - pular para) para a
especificação do alvo. O nome do alvo deve ser menor que 8 letras, e case
sensitive: “RETURN” e “return” são completamente diferentes.
O caso mais simples é quando não há um alvo especificado. Este tipo
de regra (muitas vezes chamado de uma regra de “contagem”) é útil para uma
contagem simples de certos tipos de pacotes. Se esta regra confere ou não, o
kernel simplesmente examina a próxima regra no chain. Por exemplo, para
contar o número de pacotes de 192.168.1.1, nós podemos fazer isto:
57
Isto pode ser somente especificado por regras especificando TCP ou
UDP como seus protocolos. Opcionalmente, uma porta (nome ou número)
podem ser especificadas seguidas de “-j REDIRECT” que causar o
redirecionamento do pacote para uma porta particular, até mesmo se for
endereçado para outra porta. Este alvo é somente válido para pacotes
atravessando a regra de entrada.
O alvo final especial é RETURN que é idêntico a cair fora do final da
regra imediatamente. (Veja “Configurando o Policiamento” abaixo).
Qualquer outro alvo indica uma regra definida pelo usuário (como
descrita em “Operações em todo o Chain” abaixo). O pacote começará
atravessando as regras naquele chain. Se aquele chain não decide o destino
do pacote, então uma vez passam por aquele chain como finalizado, passar se
resume na próxima regra no chain atual.
Hora de mais arte ASCII. Considere dois (tolos) chains: input (o chain
embutido) e Test (um chain definido pelo usuário).
‘input’ ‘Test’
---------------------------- ----------------------------
| Rule1: -p ICMP -j REJECT | | Rule1: -s 192.168.1.1 |
|--------------------------| |--------------------------|
| Rule2: -p TCP -j Test | | Rule2: -d 192.168.1.1 |
|--------------------------| ----------------------------
| Rule3: -p UDP -j DENY |
Considerando um pacote TCP vindo de 192.168.1.1, indo para 1.2.3.4.
Ele entra no chain input, e é testado na regra 1 - sem bater com a regra. A
regra 2 bate, e seu alvo é Test, assim a próxima regra examinada é o inicio do
teste. Regra 1 em test confere, mas não especifica um alvo, assim a próxima
regra é examinada, Regra 2. Isto não confere, assim nós atingimos o final do
chain. Nós retornamos ao chain de entrada, onde nós simplesmente
examinamos a Regra 2, assim nós agora examinamos Regra3, que não
confere.
Assim o caminho do pacote é:
V __________________________
‘input’ | / ‘Test’ V
------------------------|--/ -----------------------|----
| Rule1 | /| | Rule1 | |
|-----------------------|/-| |----------------------|---|
| Rule2 / | | Rule2 | |
|--------------------------| -----------------------V----
| Rule3 /--+___________________________/
------------------------|---
V
Veja a seção “Como organizar suas regras de Firewall” para meios para
usar regras definidas pelo usuários efetivamente.
5.4.1.4.2 Registrando pacotes
Este é o lado do efeito que confere com uma regra que possui; você
pode ter o pacote que bateu com a regra registrado com a opção “-l”. Você
58
normalmente não precisará disto para pacotes rotineiros, mas ela é uma
característica útil se você deseja verificar por eventos excepcionais.
O kernel registra esta informação parecida como:
59
Em sistemas linux padrões, esta saída do kernel é capturada por klogd
(o daemon de registro do kernel) que o envia para o syslogd (o daemon de
registro do sistema). O arquivo “/etc/syslog.conf” controla o funcionamento de
syslogd, especificando um destino para cada facilidade (facility - em nosso
caso, a facilidade é “kernel”) e nível (para ipchains, o nível usado é “info”).
Por exemplo, meu (Debian) /etc/syslog.conf contém duas linhas que
conferem “kern.info”:
kern.* -/var/log/kern.log
.=info;.=notice;*.=warn;\
auth,authpriv.none;\
cron,daemon.none;\
mail,news.none -/var/log/messages
60
TOS Name Value Typical Uses
Andi Klenn foi ao ponto fora dos seguintes (também editado para
postaridade):
Talvez ele possa ser útil para incluir uma referência para de ifconfig para
a discussão sobre bits TOS. O tamanho do dispositivo padrão é afinado para
placas ethernet, em modems ele é muito grande e faz os 3 agendamentos das
bandas (que possui canais baseados no TOS) funcionarem subótimamente. É
uma boa idéia configura-lo para um valor entre 4-10 no modem ou simples
canal b para links ISDN: em dispositivos empacotados é necessário um grande
canal.
Este é uma problema 2.0 e não 2.1, mas em 2.1 ele é um opção do
ifconfig (com nettools recentes), enquanto em 2.0 ele requer patches fontes nos
controladores de dispositivos para alterar.
Assim, para ver máximos beneficios da manipulação TOS para links de
modems PPP, faça “ifconfig $1 txqueuelen” em seu /etc/ppp/ip-up script. O
número usado depende da velocidade do modem e da quantidade de buffer no
modem; aqui configurações que Andi me passou denovo:
O melhor valor para dadas configurações precisam ser testadas. Se os
canais são muito pequenos em um roteador então os pacotes serão
derrubados. Também é claro que um obtém o benefício até mesmo sem
regravação TOS, apenas aquela regravação TOS ajuda obter benefícios para
programas não coperativos (mas todos os programas padrões do linux são
coperativos).
5.4.1.4.4 Marcando um Pacote
Isto permite complexas e poderosas interações com Alexey Kuznetsov’s
nova Qualidade de implementações de Serviço, também como forwarding
baseado em marcas em kernels da série 2.1. Esta opção é no entanto
ignorada em kernels da série 2.0.
5.4.1.4.5 Operações em todo o chain
Uma característica muito útil do ipchains é a abilidade de agrupar regras
relacionadas em chains. Você pode chamar chains do que quiser, desde que
não sejam nomes utilizados pelos chains embutidos (input, output e forward) ou
os alvos (MASQ, REDIRECT, ACCEPT, DENY, REJECT ou RETURN). Eu
sugiro evitar totalmente identificações em maiúsculas, porque que eu posso
usar estas para futura extensão. O nome do chain pode ser maior que 8
caracteres.
5.4.1.4.6 Criando um novo chain
Vou criar um novo chain. Porque eu sou como um imaginador da
mesma categoria, eu chamarei isto de test.
61
# ipchains -N test
É muito simples. Agora você pode colocar regras nele como detalhado
acima.
5.4.1.4.7 Apagando um chain
Apagar um chain também é simples.
# ipchains -X test
# ipchains -F forward
# ipchains -L input
Chain input (refcnt = 1): (policy ACCEPT)
target prot opt source destination ports
ACCEPT icmp ----- anywhere anywhere any
# ipchains -L test
Chain test (refcnt = 0):
target prot opt source destination ports
DENY icmp ----- localnet/24 anywhere any
#
O “refcnt” listado para test é o número de regras que tem test como seu
alvo. Este pode ser zero (e o chain ser vazio) antes deste chain ser apagado.
Se o nome do chain é omitido, todos os chains são listados.
Existem três opções que podem acompanhar “-L”. A “-n” (numérica)
opção é muito útil porque ela previne ipchains de tentar localizar endereços IP,
que (se você esta usando DNS como muitas pessoas) causa larga espera se
seu DNS se não estiver configurado corretamente, ou se você filtrará suas
requisições DNS. Ele faz as portas serem listadas como números ao invés de
nomes.
62
A opção “-v” mostra os detalhes das regras, como o pacote e contadores
de byes, as máscaras TOS, a interface, e a marca do pacote. Caso contrário
estes valores são omitidos. Por exemplo:
# ipchains -v -L input
Chain input (refcnt = 1): (policy ACCEPT)
pkts bytes target prot opt tosa tosx ifname mark source
destination ports
10 840 ACCEPT icmp ----- 0xFF 0x00 lo anywhere
anywhere any
# ipchains -v -L input
Chain input (refcnt = 1): (policy ACCEPT)
pkts bytes target prot opt tosa tosx ifname mark source destination ports
10 840 ACCEPT icmp ----- 0xFF 0x00 lo anywhere anywhere any
# ipchains -Z input
# ipchains -v -L input
Chain input (refcnt = 1): (policy ACCEPT)
pkts bytes target prot opt tosa tosx ifname mark source destination ports
0 0 ACCEPT icmp ----- 0xFF 0x00 lo anywhere anywhere any
# ipchains -L -v -Z
Chain input (policy ACCEPT):
pkts bytes target prot opt tosa tosx ifname mark source destination ports
10 840 ACCEPT icmp ----- 0xFF 0x00 lo anywhere anywhere any
63
Chain forward (refcnt = 1): (policy ACCEPT)
Chain output (refcnt = 1): (policy ACCEPT)
Chain test (refcnt = 0):
0 0 DENY icmp ----- 0xFF 0x00 ppp0 localnet/24 anywhere any
64
5.4.1.6 Checando um Pacote
Muitas vezes você deseja ver o que esta acontecendo quando um certo
pacote entra em sua máquina, tal como para verificar seus chains de entrada.
ipchains tem o comando “-C” para permitir isto, usando exatamente as mesmas
rotinas que o kernel usa para diagnosticar pacotes reais.
Você especifica que chain testará o pacote seguido do argumento “-C”
com seu nome. Considerando que o kernel sempre inicia atravessando os
chains input, output e forward, você está permitido o inicio da travessia em
qualquer chain para fins de testes.
Os detalhes do “pacote” são especificados usando a mesma sintaxe
usada para expecificar regras do firewall. Em particular, um protocolo (“-p”),
endereço de origem (“-s”), endereço de destino (“-d”) e interface (“-i”) são
compulsórios. Se o protoclo é TCP ou UDP, então uma porta simples de
origem e destino devem ser especificadas, e um tipo ICMP e um código devem
ser especificados para o protocolo ICMP (a não ser que a opção “-f” é
espeficada para indicar uma regra de fragmento, em tal caso estas opções são
ilegais).
Se o protocolo é TCP (e a opção “-f” não é especificada), a opção “-y”
deve ser especificada, para indicar que o pacote test deve ter o bit SYN
ajustado.
Aqui está um exemplo de teste de um pacote TCP SYN de 192.168.1.1
porta 60000 para 192.168.1.2 porta www, vindo na interface eth0, entrando no
chain “input”. Isto é uma clássica inicialização de conexão WWW.
65
Pessoalmente, eu não gosto muito da opção “-b”; se você deseja
conveniência, veja “Usando ipchains-save” abaixo.
A opção -b pode ser usada com insert (“-I”), delete (“-D”) (mas não com
variações que pegam regras numúricas), comando append (“-A”) e comando
check (“-C”).
Outra opção útil é “-v” (verbose) que mostra exatamente o que o
ipchains está fazendo com seus comandos. Isto é útil se você está negociando
com comandos que podem afetar multiplas regras. Por exemplo, aqui nós
checamos a ação dos fragmentos entre 192.68.1.1 e 192.168.1.2.
66
tenho diversos números destas regras, é sensato colocar todas elas em um
simples chain, chamado ppp-out.
# ipchains -N ppp-out
# ipchains -A output -i ppp0 -j ppp-out
# ipchains -N ppp-in
# ipchains -A input -i ppp0 -j ppp-in
67
NOTA: Eu não configurei meus chains nesta ordem, como os pacotes
podem ir através da minha configuração. Seguramente é normalmente feito o
DENY (bloqueio) primeiro, então inseridas as regras. É claro, se suas regras
requerem chamadas DNS para resolver nomes de hosts, você terá problemas.
68
Chain ‘ppp-out’ already exists. Skip or flush? [S/f]? f Flushing ‘ppp-out’.
5.5 Diversos
Esta seção contém todas as informações e FAQs que eu pude colocar
dentro da estrutura do arquivo abaixo.
69
pacotes com o bit “Don’t Fragment” ajustado, e então enviando pacotes
pequenos se ele obter um pacote ICMP indicando “Fragmentação necessária
mas DF ajustado” (“fragmentação necessária”). Este é um tipo de pacote
“destination-unreachable”, e se ele nunca é recebido, o host local não reduzirá
o MTU, e a performance será abismal ou não existente. Note que é comum ele
bloquear todas as mensagens de redirecionamento ICMP (tipo 5); estas podem
ser usados para manipular roteamento (embora boas stacks IP tem proteções),
e assim são frequentemente vistas como ligeiramente ariscadas.
70
5.5.3 Filtrando o Ping of Death (ping da morte)
Computadores Linux são agora imunes aos famosos Ping of Death, que
envolve o envio de grandes pacotes ICMP ilegais que sobrecarrega os buffers
na pilha TCP no receptor e causa destruição.
Se você está protegendo computadores que podem ser vulneráveis,
você deve simplesmente bloquear fragmentos ICMP. Pacotes normais ICMP
não são grandes o bastante para requerer fragmentação, assim você não deve
bloquear nada exceto grandes pings. Eu tenho ouvido (não confirmados)
relatos que muitos sistemas requerem somente o último fragmento de um
pacote ICMP acima de seu tamanho para o corromper, assim bloquear
somente o primeiro fragmento não é recomendado.
Sobre os programas exploit e tenho sempre visto que todos usam ICMP,
não existem razões que fragmentos TCP ou UDP (ou um protocolo
desconhecido) possa ser usado neste ataque, assim bloqueando fragmentos
ICMP é somente uma solução temporária.
# ipchains -D input 1
71
# ipchains -D output 1
# ipchains -D forward 1
# This is the best method: turn on Source Address Verification and get
# spoof protection on all current and future interfaces.
if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then
echo -n “Setting up IP spoofing protection...”
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 1 > $f done echo “done.”
else
echo PROBLEMS SETTING UP IP SPOOFING PROTECTION. BE WORRIED. echo “CONTROL-D
will exit from this shell and continue system startup.”
echo
# Start a single user shell on the console
/sbin/sulogin $CONSOLE
fi
Se você não puder fazer isto, você pode inserir manualmente regras
para proteger cada interface. Isto requer conhecimento de cada interface. Os
kernels 2.1 automáticamente rejeitam pacotes dizendo vir de endereços 127.*
(reservados para a interfaceloopback local, lo).
Por exemplo, digamos que temos três interfaces, eth0, eth1 e ppp0. Nós
podemos usar ifconfig para nos dizer o endereço e netmask das interfaces.
Digamos eth0 foi ligada a rede 192.168.1.0 com a netmasq 255.255.255.0, eth1
foi ligada a rede 10.0.0.0 com a netmask 255.0.0.0, e ppp0 conectado com a
72
internet (onde qualquer endereço exceto endere‡os IP privados são
permitodos), nós devemos inserir as seguintes regras:
Se isto funciona para você, coloque isto em algum lugar em seus scripts
de inicialização assim ele será ativado toda hora; você deve configurar seu
firewall antes de executar este comando, caso contrário existe uma
oportunidade de pacotes escaparem.
73
Note que REDIR (sendo no chain input) não afeta conexões de um
processo local.
Isto deve ser lido como “0x003F”. Corrija isto e recompile o kernel.
74
(altere return para ret = na linha 1328 de net/ipv4/ip_fw.c). Em 2.1.125,
funciona corretamente.
75
6 FIREWALL IPTABLES
Adaptado do Guia Foca GNU/Linux Avançado – Capítulo 9.
6.1 Introdução
O Firewall é um programa que como objetivo proteger a máquina contra
acessos indesejados, tráfego indesejado, proteger serviços que estejam
rodando na máquina e bloquear a passagem de coisas que você não deseja
receber (como conexões vindas da Internet para sua segura rede local,
evitando acesso aos dados corporativos de uma empresa ou a seus dados
pessoais). No kernel do Linux 2.4, foi introduzido o firewall iptables (também
chamado de netfilter) que substitui o ipchains dos kernels da série 2.2. Este
novo firewall tem como vantagem ser muito estável (assim como o ipchains e
ipfwadm), confiável, permitir muita flexibilidade na programação de regras pelo
administrador do sistema, mais opções disponíveis ao administrador para
controle de tráfego, controle independente do tráfego da rede local/entre
redes/interfaces devido a nova organização das etapas de roteamento de
pacotes.
O iptables é um firewall a nível de pacotes e funciona baseado no
endereço/porta de origem/destino do pacote, prioridade, etc. Ele funciona
através da comparação de regras para saber se um pacote tem ou não
permissão para passar. Em firewalls mais restritivos, o pacote é bloqueado e
registrado para que o administrador do sistema tenha conhecimento sobre o
que está acontecendo em seu sistema.
Ele também pode ser usado para modificar e monitorar o tráfego da
rede, fazer NAT (masquerading, source nat, destination nat), redirecionamento
de pacotes, marcação de pacotes, modificar a prioridade de pacotes que
chegam/saem do seu sistema, contagem de bytes, dividir tráfego entre
máquinas, criar proteções anti-spoofing, contra syn flood, DoS, etc. O tráfego
vindo de máquinas desconhecidas da rede pode também ser
bloqueado/registrado através do uso de simples regras. As possibilidades
oferecidas pelos recursos de filtragem iptables como todas as ferramentas
UNIX maduras dependem de sua imaginação, pois ele garante uma grande
flexibilidade na manipulação das regras de acesso ao sistema, precisando
apenas conhecer quais interfaces o sistema possui, o que deseja bloquear, o
que tem acesso garantido, quais serviços devem estar acessíveis para cada
rede, e iniciar a construção de seu firewall.
O iptables ainda tem a vantagem de ser modularizável, funções podem
ser adicionadas ao firewall ampliando as possibilidades oferecidas. Usei por 2
anos o ipchains e afirmo que este é um firewall que tem possibilidades de
gerenciar tanto a segurança em máquinas isoladas como roteamento em
76
grandes organizações, onde a passagem de tráfego entre redes deve ser
minuciosamente controlada.
Um firewall não funciona de forma automática (instalando e esperar que
ele faça as coisas por você), é necessário pelo menos conhecimentos básicos
de rede tcp/ip, roteamento e portas para criar as regras que farão a segurança
de seu sistema. A segurança do sistema depende do controle das regras que
serão criadas por você, as falhas humanas são garantia de mais de 95% de
sucesso nas invasões.
Enfim o iptables é um firewall que agradará tanto a pessoas que
desejam uma segurança básica em seu sistema, quando administradores de
grandes redes que querem ter um controle minucioso sobre o tráfego que
passam entre suas interfaces de rede (controlando tudo o que pode passar de
uma rede a outra), controlar o uso de tráfego, monitoração, etc.
6.1.1 Versão
É assumido que esteja usando a versão 1.2.3 do iptables e baseadas
nas opções do kernel 2.4.16 (sem o uso de módulos experimentais). As
explicações contidas aqui podem funcionar para versões posteriores, mas é
recomendável que leia a documentação sobre modificações no programa
(changelog) em busca de mudanças que alterem o sentido das explicações
fornecidas aqui.
77
• Suporte a módulos externos para expansão das funcionalidades padrões
oferecidas pelo código de firewall
• Suporte completo a roteamento de pacotes, tratadas em uma área
diferente de tráfegos padrões.
• Suporte a especificação de tipo de serviço para priorizar o tráfego de
determinados tipos de pacotes.
• Permite especificar exceções para as regras ou parte das regras
• Suporte a detecção de fragmentos
• Permite enviar alertas personalizados ao syslog sobre o tráfego
aceito/bloqueado.
• Redirecionamento de portas
• Masquerading
• Suporte a SNAT (modificação do endereço de origem das máquinas
para um único IP ou faixa de IP's).
• Suporte a DNAT (modificação do endereço de destino das máquinas
para um único IP ou fixa de IP's)
• Contagem de pacotes que atravessaram uma interface/regra
• Limitação de passagem de pacotes/conferência de regra (muito útil para
criar proteções contra, syn flood, ping flood, DoS, etc).
6.1.5 Requerimentos
É necessário que o seu kernel tenha sido compilado com suporte ao
iptables (veja Habilitando o suporte ao iptables no kernel, Section 9.1.15. O
requerimento mínimo de memória necessária para a execução do iptables é o
mesmo do kernel 2.4 (4MB). Dependendo do tráfego que será manipulado
pela(s) interface(s) do firewall ele poderá ser executado com folga em uma
máquina 386 SX com 4MB de RAM.
78
Como as configurações residem no kernel não é necessário espaço
extra em disco rígido para a execução deste utilitário.
6.1.7 Instalação
79
• nível de pacotes - Este tipo de firewall toma as decisões baseadas nos
parâmetros do pacote, como porta/endereço de origem/destino, estado
da conexão, e outros parâmetros do pacote. O firewall então pode
negar o pacote (DROP) ou deixar o pacote passar (ACCEPT). O
iptables é um excelente firewall que se encaixa nesta categoria.
Firewall a nível de pacotes é o assunto explicado nesta seção do guia.
Os dois tipos de firewalls podem ser usados em conjunto para fornecer
uma camada dupla de segurança no acesso as suas máquinas/máquinas
clientes.
80
• O que tem permissão de passar de uma rede para outra (em máquinas
que atuam como roteadores/gateways de uma rede interna).
• Etc.
A análise destes pontos pode determinar a complexidade do firewall,
custos de implementação, prazo de desenvolvimento e tempo de maturidade
do código para implementação. Existem muitos outros pontos que podem
entrar na questão de desenvolvimento de um sistema de firewall, eles
dependem do tipo de firewall que está desenvolvendo e das políticas de
segurança de sua rede.
81
Os chains INPUT e OUTPUT somente são atravessados por conexões
indo/se originando de localhost. OBS: Para conexões locais, somente
os chains INPUT e OUTPUT são consultados na tabela filter.
• nat - Usada para dados que gera outra conexão (masquerading, source
nat, destination nat, port forwarding, proxy transparente são alguns
exemplos). Possui 3 chains padrões:
o PREROUTING - Consultado quando os pacotes precisam ser
modificados logo que chegam. É o chain ideal para realização de
DNAT e redirecionamento de portas (Fazendo DNAT, Section
9.4.4).
o OUTPUT - Consultado quando os pacotes gerados localmente
precisam ser modificados antes de serem roteados. Este chain
somente é consultado para conexões que se originam de IPs de
interfaces locais.
o POSTROUTING - Consultado quando os pacotes precisam ser
modificados após o tratamento de roteamento. É o chain ideal
para realização de SNAT e IP Masquerading (Fazendo SNAT,
Section 9.4.3).
• mangle - Utilizada para alterações especiais de pacotes (como modificar
o tipo de serviço (TOS) ou outros detalhes que serão explicados no
decorrer do capítulo. Possui 2 chains padrões:
o PREROUTING - Consultado quando os pacotes precisam ser
modificados logo que chegam.
o OUTPUT - Consultado quando pacotes gerados localmente
precisam ser modificados antes de serem roteados.
Veja A tabela mangle, Section 9.5 para mais detalhes sobre a tabela
mangle.
*
* Network Options:
*
e na Subseção:
82
*
* IP: Netfilter Configuration
*
Connection tracking (required for masq/NAT) (CONFIG_IP_NF_CONNTRACK)
[M/n/y/?]
FTP protocol support (CONFIG_IP_NF_FTP) [M/n/?]
IRC protocol support (CONFIG_IP_NF_IRC) [M/n/?]
IP tables support (required for filtering/masq/NAT) (CONFIG_IP_NF_IPTABLES)
[Y/m/n/?]
limit match support (CONFIG_IP_NF_MATCH_LIMIT) [Y/m/n/?]
MAC address match support (CONFIG_IP_NF_MATCH_MAC) [M/n/y/?]
netfilter MARK match support (CONFIG_IP_NF_MATCH_MARK) [M/n/y/?]
Multiple port match support (CONFIG_IP_NF_MATCH_MULTIPORT) [M/n/y/?]
TOS match support (CONFIG_IP_NF_MATCH_TOS) [M/n/y/?]
LENGTH match support (CONFIG_IP_NF_MATCH_LENGTH) [M/n/y/?]
TTL match support (CONFIG_IP_NF_TTL) [M/n/y/?]
tcpmss match support (CONFIG_IP_NF_MATCH_TCPMSS) [M/n/y/?]
Connection state match support (CONFIG_IP_NF_MATCH_STATE) [M/n/?]
Packet filtering (CONFIG_IP_NF_FILTER) [M/n/y/?]
REJECT target support (CONFIG_IP_NF_TARGET_REJECT) [M/n/?]
Full NAT (CONFIG_IP_NF_NAT) [M/n/?]
MASQUERADE target support (CONFIG_IP_NF_TARGET_MASQUERADE) [M/n/?]
REDIRECT target support (CONFIG_IP_NF_TARGET_REDIRECT) [M/n/?]
Packet mangling (CONFIG_IP_NF_MANGLE) [M/n/y/?]
TOS target support (CONFIG_IP_NF_TARGET_TOS) [M/n/?]
MARK target support (CONFIG_IP_NF_TARGET_MARK) [M/n/?]
LOG target support (CONFIG_IP_NF_TARGET_LOG) [M/n/y/?]
TCPMSS target support (CONFIG_IP_NF_TARGET_TCPMSS) [M/n/y/?]
Esta configuração permite que você não tenha problemas para iniciar o
uso e configuração do seu firewall iptables, ela ativa os módulos necessários
para utilização de todos os recursos do firewall iptables. Quando conhecer a
função de cada um dos parâmetros acima (durante o decorrer do texto), você
poderá eliminar muitas das opções desnecessárias para seu estilo de firewall
ou continuar fazendo uso de todas ;-)
OBS1: A configuração acima leva em consideração que você NÃO
executará os códigos antigos de firewall ipfwadm e ipchains. Caso deseje
utilizar o ipchains ou o ipfwadm, será preciso responder com "M" a questão "IP
tables support (required for filtering/masq/NAT) (CONFIG_IP_NF_IPTABLES)".
Será necessário carregar manualmente o módulo correspondente ao firewall
que deseja utilizar (modprobe iptables_filter.o no caso do iptables).
Não execute mais de um tipo de firewall ao mesmo tempo!!!
OBS2: É recomendável ativar o daemon kmod para carga automática de
módulos, caso contrário será necessário compilar todas as partes necessárias
embutidas no kernel, carregar os módulos necessários manualmente ou pelo
iptables (através da opção --modprobe=módulo).
83
6.1.16 Ligando sua rede interna a Internet
Se a sua intenção (como da maioria dos usuários) é conectar sua rede
interna a Internet de forma rápida e simples, leia Fazendo IP masquerading
(para os apressados), Section 9.4.2 ou Fazendo SNAT, Section 9.4.3. Um
exemplo prático de configuração de Masquerading deste tipo é encontrado em
Conectando sua rede interna a Internet, Section 9.8.3.
Após configurar o masquerading, você só precisará especificar o
endereço IP da máquina masquerading (servidor) como Gateway da rede. No
Windows 9x/NT/2000 isto é feito no Painel de Controle/Rede/Propriedades de
Tcp/IP. No Linux pode ser feito com route add default gw IP_do_Servidor.
#ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=255 time=0.6 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=255 time=0.5 ms
Ok, a máquina responde, agora vamos incluir uma regra no chain INPUT
(-A INPUT) que bloqueie (-j DROP) qualquer acesso indo ao endereço
127.0.0.1 (-d 127.0.0.1):
84
pacotes. A opção -j é chamada de alvo da regra ou somente alvo pois define o
destino do pacote que atravessa a regra (veja Especificando um alvo, Section
9.3.6). Bem vindo a base de um sistema de firewall :-)
OBS1: - O acesso a interface loopback não deve ser de forma alguma
bloqueado, pois muitos aplicativos utilizam soquetes tcp para realizarem
conexões, mesmo que você não possua uma rede interna.
OBS2: - A tabela filter será usada como padrão caso nenhuma tabela
seja especificada através da opção -t.
85
O comando iptables -L INPUT -n tem o mesmo efeito, a diferença é que
são mostrados números ao invés de nomes:
#iptables -L INPUT -n
#iptables -L INPUT -n -v
Chain INPUT (policy ACCEPT 78 packets, 5820 bytes)
pkts bytes target prot opt in out source
destination
2 194 DROP icmp -- * * 0.0.0.0/0
127.0.0.1
86
Opções extras passadas a regra. Normalmente "!" (veja
Especificando uma exceção, Section 9.3.5) ou "f" (veja Especificando
fragmentos, Section 9.3.4).
in
Interface de entrada (de onde os dados chegam). Veja
Especificando a interface de origem/destino, Section 9.3.2.
out
Interface de saída (para onde os dados vão). Veja Especificando
a interface de origem/destino, Section 9.3.2.
source
Endereço de origem. Veja Especificando um endereço de
origem/destino, Section 9.3.1.
destination
Endereço de destino. Veja Especificando um endereço de
origem/destino, Section 9.3.1.
outras opções
Estas opções normalmente aparecem quando são usadas a
opção -x:
• dpt ou dpts - Especifica a porta ou faixa de portas de destino.
• reject-with icmp-port-unreachable - Significa que foi usado o alvo
REJECT naquela regra (veja Alvo REJECT, Section 9.3.6.1).
87
6.2.4 Inserindo uma regra - I
Precisamos que o tráfego vindo de 192.168.1.15 não seja rejeitado pelo
nosso firewall. Não podemos adicionar uma nova regra (-A) pois esta seria
incluída no final do chain e o tráfego seria rejeitado pela primeira regra (nunca
atingindo a segunda). A solução é inserir a nova regra antes da regra que
bloqueia todo o tráfego ao endereço 127.0.0.1 na posição 1:
iptables -t filter -I INPUT 1 -s 192.168.1.15 -d 127.0.0.1 -j ACCEPT
Após este comando, temos a regra inserida na primeira posição do chain
(repare no número 1 após INPUT) e a antiga regra número 1 passa a ser a
número 2. Desta forma a regra acima será consultada, se a máquina de
origem for 192.168.1.15 então o tráfego estará garantido, caso contrário o
tráfego com o destino 127.0.0.1 será bloqueado na regra seguinte.
Para criar o chain internet (que pode ser usado para agrupar as regras
de internet) usamos o seguinte comando:
Para inserir regras no chain internet basta especifica-lo após a opção -A:
88
iptables -t filter -A INPUT -j internet
OBS: O chain criando pelo usuário pode ter seu nome tanto em
maiúsculas como minúsculas.
Se uma máquina do endereço 200.200.200.200 tentar acessar sua
máquina, o iptables consultará as seguintes regras:
`INPUT' `internet'
---------------------------- -----------------------------
| Regra1: -s 192.168.1.15 | | Regra1: -s 200.200.200.200|
|--------------------------| |---------------------------|
| Regra2: -s 192.168.1.1 | | Regra2: -d 192.168.1.1 |
|--------------------------| -----------------------------
| Regra3: -j DROP |
----------------------------
O pacote tem o endereço de origem
200.200.200.200, ele passa pela
primeira e segunda regras do chain
INPUT, a terceira regra direciona
para o chain internet _______________________________________
v / v
/-------------------------|-\ / /-------------------------------------|-\
| Regra1: -s 192.168.1.15 | | / | Regra1: -s 200.200.200.200 -j DROP \_____\
|-------------------------|-| / |---------------------------------------| /
| Regra2: -s 192.168.1.1 | | / | Regra2: -d 200.200.200.202 -j DROP |
|-------------------------|-|/ \---------------------------------------/
| Regra3: -j internet /|
|---------------------------| No chain internet, a primeira regra confere
| Regra4: -j DROP | com o endereço de origem 200.200.200.200 e
\---------------------------/ o pacote é bloqueado.
89
6.2.7 Listando os nomes de todos os chains atuais
Use o comando cat /proc/net/ip_tables_names para fazer isto. É
interessante dar uma olhada nos arquivos dentro do diretório /proc/net, pois
podem lhe ser interessantes.
90
Nome da tabela que contém o chain que queremos zerar os
contadores de bytes e pacotes.
chain
Chain que deve ter os contadores zerados. Caso não seja
especificado, todos os chains da tabela terão os contadores zerados.
Note que as opções -Z e -L podem ser usadas juntas, assim o chain
será listado e imediatamente zerado. Isto evita a passagem de pacotes
durante a listagem de um chain.
# iptables -L INPUT
91
OBS: Note que policiamentos PERMISSIVOS (ACCEPT) normalmente
são usados em conjunto com regras restritivas no chain correspondentes (tudo
é bloqueado e o que sobrar é liberado) e policiamentos RESTRITIVOS (DROP)
são usados em conjunto com regras permissivas no chain correspondente
(tudo é liberado e o que sobrar é bloqueado pelo policiamento padrão).
92
| | ENTRADA (-i) | SAÍDA (-o) |
+---------+---------------------+----------------+---------------+
| | INPUT | SIM | NÃO |
| filter | OUTPUT | NÃO | SIM |
| | FORWARD | SIM | SIM |
+---------+---------------------+----------------+---------------+
| | PREROUTING | SIM | NÃO |
| nat | OUTPUT | NÃO | SIM |
| | POSTROUTING | NÃO | SIM |
+---------+---------------------+----------------+---------------+
| | PREROUTING | SIM | NÃO |
| mangle | | | |
| | OUTPUT | NÃO | SIM |
+---------+---------------------+----------------+---------------+
A definição de qual interface é permitida em qual chain é determinada
pela posição dos chains nas etapas de roteamento do pacote. O chain
OUTPUT da tabela filter somente poderá conter a interface de saída (veja a
tabela acima). O chain FORWARD da tabela filter é o único que aceita a
especificação de ambas as interfaces, este é um ótimo chain para controlar o
tráfego que passa entre interfaces do firewall.
Por exemplo para bloquear o acesso do tráfego de qualquer máquina
com o endereço 200.123.123.10 vinda da interface ppp0 (uma placa de fax-
modem):
93
6.3.3 Especificando um protocolo
A opção -p (ou --protocol) é usada para especificar protocolos no
iptables. Podem ser especificados os protocolos tcp, udp e icmp. Por
exemplo, para rejeitar todos os pacotes UDP vindos de 200.200.200.200:
94
transit", "ttl-zero-during-reassembly") conferirão na regra especificada.Os tipos
de mensagens ICMP podem ser obtidos com o comando iptables -p icmp -h:
echo-reply (pong)
destination-unreachable
network-unreachable
host-unreachable
protocol-unreachable
port-unreachable
fragmentation-needed
source-route-failed
network-unknown
host-unknown
network-prohibited
host-prohibited
TOS-network-unreachable
TOS-host-unreachable
communication-prohibited
host-precedence-violation
precedence-cutoff
source-quench
redirect
network-redirect
host-redirect
TOS-network-redirect
TOS-host-redirect
echo-request (ping)
router-advertisement
router-solicitation
time-exceeded (ttl-exceeded)
ttl-zero-during-transit
ttl-zero-during-reassembly
parameter-problem
ip-header-bad
required-option-missing
timestamp-request
timestamp-reply
address-mask-request
address-mask-reply
95
a resposta a pacotes syn enviados, caso ele seja bloqueado a resposta nunca
será retornada e a conexão não será estabelecida.
96
Diz para rejeitar todos os pacotes EXCETO os que vem do endereço
200.200.200.10.
97
• QUEUE: Passa o processamento para um programa a nível de
usuário.
Note que a regra que registra o pacote (-j LOG) deve aparecer antes da
regra que REJEITA (-j REJECT), caso contrário a regra de LOG nunca
funcionará. A única coisa que muda nas regras de log é o alvo da regra, isto
facilita a implementação de grandes conjuntos de regras de firewall.
A regra acima mostrará a seguinte saída no syslog do sistema:
98
Os campos possuem o seguinte significado:
Aug 25 10:08:01
Mês, dia e hora do registro do pacote.
debian
Nome do computador que registrou o pacote.
kernel:
Daemon que registrou a mensagem, no caso o iptables faz parte
do próprio kernel.
IN=ppp0
Especifica a interface de entrada (de onde o pacote veio).
OUT=
Especifica a interface de saída (para onde o pacote foi).
MAC=10:20:30:40:50:60:70:80:90:00:00:00:08:00
Endereço mac da interface de rede (pode ser obtido com arp
interface).
SRC=200.200.200.1
Endereço de origem do pacote.
DST=200.210.10.10
Endereço de destino do pacote.
LEN=61
Tamanho do pacote.
TOS=0x00
Prioridade do cabeçalho TOS (prioridade normal neste caso).
Veja a seção Especificando o tipo de serviço, Section 9.5.1 para mais
detalhes.
PROTO=UDP
Nome do protocolo. Pode ser TCP, UDP ou ICMP
SPT=1031
Porta de origem da requisição.
DPT=53
Porta de destino da requisição.
LEN=41
Tamanho do pacote.
O log acima mostra uma consulta DNS (porta destino 53) para nossa
máquina (INPUT) de 200.200.200.1 para 200.210.10.10.
O problema é que em um grande número de regras será difícil saber
qual regra conferiu (pois teríamos que analisar o endereço/porta
99
origem/destino) e o destino do pacote (se ele foi ACEITO ou BLOQUEADO)
pois você pode ter regras para ambas as situações. Por este motivo existem
algumas opções úteis que podemos usar com o alvo LOG:
--log-prefix "descrição"
Permite especificar uma descrição para a regra do firewall de até
29 caracteres. Caso tiver espaços, devem ser usadas "aspas".
--log-level nível
Especifica o nível da mensagem no syslog.
--log-tcp-options
Registra campos do cabeçalho TCP nos logs do sistema.
--log-ip-options
Registra campos do cabeçalho IP nos logs do sistema
--log-tcp-sequence
Registra os números de seqüencia TCP. Evite ao máximo o uso
desta opção, pois a seqüencia de números TCP pode ser a chave para
um seqüestro de seção ou IP spoofing em seu sistema caso algum
usuário tenha acesso a estes logs.
Lembre-se que estas opções são referentes ao alvo LOG, e devem ser
usadas após este, caso contrário você terá um pouco de trabalho para analisar
e consertar erros em suas regras do firewall.
iptables -N log-drop
iptables -A log-drop -j LOG
iptables -A log-drop -j DROP
100
E usar "log-drop" como alvo em suas regras. Mesmo assim esta solução
é "limitada" em relação a "-l" do ipchains porque o iptables não inclui detalhes
de qual chain bloqueou o pacote/qual pacote foi bloqueado, assim é necessário
a especificação da opção --log-prefix para as mensagens se tornarem mais
compreensíveis. Infelizmente o iptables não aceita variáveis, senão esta
limitação seria facilmente contornada.
101
etc. Esta seção abordará os tipos de NAT, exemplos de como criar
rapidamente uma conexão IP masquerading e entender como a tradução de
endereços funciona no iptables.
Se sua intenção é ligar sua rede a Internet existem duas opções:
• Você possui uma conexão que lhe oferece um endereço IP dinâmico (a
cada conexão é dado um endereço IP - como uma conexão PPP) então
o IP masquerading é o que precisa (veja “6.4.2 Fazendo IP
masquerading (para os apressados)” ou “6.4.3.1 Fazendo IP
Masquerading”).
• Você tem uma conexão que lhe oferece um endereço IP permanente
(ADSL, por exemplo) então o SNAT é o que precisa (veja “6.4.3
Fazendo SNAT”).
Que criará o chain chamado intra-inter na tabela nat. Para inserir regras
neste chain será necessário especificar a opção "-t nat".
102
modificados e reescrever os endereços assim que obter a resposta da máquina
de destino, direcionando os pacotes ao destino correto. Toda operação de
SNAT é feita no chain POSTROUTING.
É permitido especificar endereços de origem/destino, protocolos, portas
de origem/destino, interface de entrada/saída (dependendo do chain), alvos,
etc. É desnecessário especificar fragmentos na tabela nat, pois eles serão
remontados antes de entrar no código de roteamento.
O SNAT é a solução quando você tem acesso a internet através de um
único IP e deseja fazer que sua rede tenha acesso a Internet através da
máquina Linux. Nenhuma máquina da Internet poderá ter acesso direto as
máquinas de sua rede interna via SNAT.
OBS: A observação acima não leva em conta o controle de acesso
externo configurado na máquina que estiver configurando o iptables, uma
configuração mau realizada pode expor sua máquina a acessos externos
indesejados e comprometer sua rede interna caso alguém consiga acesso
direto ao servidor.
É necessário especificar SNAT como alvo (-j SNAT) quando desejar que
as máquinas de sua rede interna tenha acesso a Internet através do IP fixo da
máquina Linux (para conexões intermitentes como PPP, veja “6.4.3.1 Fazendo
IP Masquerading”). O parâmetro --to IP:portas deve ser usado após o alvo
SNAT. Ele serve para especificar um endereço IP, faixa de endereços e
opcionalmente uma porta ou faixa de portas que será substituída. Toda a
operação de SNAT é realizada através do chain POSTROUTING:
Os pacotes indo para a Internet (nossa conexão é feita via eth1, nossa
interface externa) vindo do endereço 192.168.1.2, são substituídos por
200.241.200.40 e enviados para fora. Quando a resposta a requisição é
retornada, a máquina com iptables recebe os pacotes e faz a operação inversa,
modificando o endereço 200.241.200.40 novamente para 192.168.1.2 e
enviando a resposta a máquina de nossa rede interna. Após definir suas
regras de NAT, execute o comando echo "1" >/proc/sys/net/ipv4/ip_forward
para habilitar o suporte a redirecionamento de pacotes no kernel.
Também é possível especificar faixas de endereços e portas que serão
substituídas:
103
Idêntico ao anterior, mas faz somente substituições na faixa de portas de
origem de 1 a 1023.
104
6.4.4 Fazendo DNAT
DNAT (Destination nat - nat no endereço de destino) consiste em
modificar o endereço de destino das máquinas clientes. O destination nat é
muito usado para fazer redirecionamento de pacotes, proxyes transparentes e
balanceamento de carga.
Toda operação de DNAT é feita no chain PREROUTING. As demais
opções e observações do SNAT são também válidas para DNAT (com exceção
que somente é permitido especificar a interface de origem no chain
PREROUTING).
105
6.4.5 Monitorando conexões feitas na tabela nat
Use o comando cat /proc/net/ip_conntrack para listar todas as
conexões atuais tratadas pelo módulo nat.
106
6.5.1.1 Especificando o TOS para tráfego de saída
Este é o mais usado, pois prioriza o tráfego que sai da máquina (com
destino a Internet, por exemplo). Sua operação é realizada através do chain
OUTPUT.
Para priorizar todo o tráfego de IRC de nossa rede interna indo para a
interface ppp0:
O bit TOS é ajustado para Espera mínima e será enviado antes dos
pacotes com prioridade normal para fora. Para priorizar a transmissão de
dados ftp saindo da rede:
iptables -t mangle -A PREROUTING -i eth0 -p tcp --sport 6666-6668 -j TOS --set-tos 0x10
107
6.6.1 Conferindo de acordo com o estado da conexão
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
ip_conntrack. O parâmetro --state OPÇÕES deve acompanhar este módulo.
As opções permitidas são as seguintes:
• NEW - Confere com pacotes que criam novas conexões
• ESTABLISHED - Confere com conexões já estabelecidas
• RELATED - Confere com pacotes relacionados indiretamente a uma
conexão, como mensagens de erro icmp, etc.
• INVALID - Confere com pacotes que não puderam ser identificados por
algum motivo. Como respostas de conexões desconhecidas.
Caso seja necessário especificar mais de uma opções estas devem ser
separadas por vírgulas.
108
6.6.3 Proteção contra ping da morte
A regra abaixo pode tomada como base para proteção contra ping flood:
Limita respostas a pings (echo reply) vindos da interface ppp0 (-i ppp0) a
1 por segundo.
ATENÇÃO: 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 for
colocada no chain INPUT sem modificações obviamente colocará em risco a
segurança de seu sistema.
109
todos os endereços que não sejam 192.168.1.* vindos da interface eth0. O
símbolo "!" serve para especificar exceções (veja “6.3.5 Especificando uma
exceção”). O kernel do Linux automaticamente bloqueia a passagem de
pacotes que dizem ser de 127.0.0.1 e não está vindo da interface loopback.
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
assimétrico):
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 1 >$i
done
110
Confere com a máquina com endereço ethernet igual a
00:80:AD:B2:60:0B.
111
Também utilizarei a sintaxe CHAIN-tabela para fazer referência aos
chains e tabelas dos blocos ASCII: INPUT-filter - chain INPUT da tabela filter.
ATENÇÃO: A ordem de processamento das regras do iptables, é
diferente do ipchains devido a inclusão do novo sistema de nat e da tabela
mangle.
112
• Porta Origem: 1404
• Porta Destino: 21
• Protocolo: TCP
• Descrição: Conexão ftp (até o prompt de login, sem transferência de
arquivos).
SAÍDA DOS PACOTES (envio da requisição para 192.168.1.1):
+-------------+ +----------+ +-------------+ +---------------+
|OUTPUT-mangle| => |OUTPUT-nat| => |OUTPUT-filter| => |POSTROUTING-nat|
+-------------+ +----------+ +-------------+ +---------------+
113
• Descrição: Conexão ftp (até o prompt de login, sem transferência de
arquivos).
SAÍDA DOS PACOTES (envio da requisição para 192.168.1.4):
+-------------+ +----------+ +-------------+ +---------------+
|OUTPUT-mangle| => |OUTPUT-nat| => |OUTPUT-filter| => |POSTROUTING-nat|
+-------------+ +----------+ +-------------+ +---------------+
114
SAÍDA DOS PACOTES (envio da requisição para 200.198.129.162):
+-------------+ +----------+ +-------------+ +---------------+
|OUTPUT-mangle| => |OUTPUT-nat| => |OUTPUT-filter| => |POSTROUTING-nat|
+-------------+ +----------+ +-------------+ +---------------+
115
ENTRADA DE PACOTES (recebimento da requisição, vinda de 192.168.1.4):
+-----------------+ +--------------+ +------------+
|PREROUTING-mangle| => |PREROUTING-nat| => |INPUT-filter|
+-----------------+ +--------------+ +------------+
116
pois os dados não precisam de tratamento DNAT (o chain
PREROUTING-nat é processado somente uma vez a procura de regras que
conferem, principalmente para fazer DNAT).
OBS: O roteamento é sempre realizado após o processamento do chain
PREROUTING da tabela nat.
117
200.217.29.67 que é o IP de nossa interface ppp0. Quando as respostas
atravessam o firewall, os pacotes são checados pra saber se são uma resposta
a uma conexão masquerading e fará a regravação dos pacotes substituindo o
endereço de destino para 192.168.1.4. Caso uma operação de Masquerading
falhe, os pacotes serão Bloqueados.
118
E ---> PREROUTING ------> (ROTEAM.) ---> FORWARD ----------> POSTROUTING --> S
Mangle e | Filter ^ NAT (Src)
NAT (DNAT)) | |
| (ROTEAM.)
V |
IN Filter OUT - Mangle,
| ^ NAT (DNAT)
| | Filter
V |
+----------------------------------------+
| Processo Local |
+----------------------------------------+
Este acima é mais simples e possui o mesmo efeito: Pacotes SYN são
usados para iniciar conexões, derrubando pacotes deste tipo significa bloquear
novas conexões. Pacotes de conexões já estabelecidas ainda são permitidos.
Estas regras acima servem para quem não deseja NENHUM acesso
indevido a sua máquina. Existem outras formas de bloquear conexões de
modo mais seletivo usando chains específicos, endereços de origem/destino,
portas, etc., este tipo de configuração é muito usada caso precise fornecer
algum tipo de serviço que seja acessível externamente e protegendo outros.
#!/bin/sh
119
TROJAN_PORTS="12345 31336 31337 31338 3024 4092 5714 5742 2583 8787 5556 5557"
120
1. Máquina do firewall com 2 interfaces de rede, uma é eth0 com o IP
192.168.1.1 que serve de ligação a sua rede Interna, a outra é ppp0 que
é a interface Internet.
2. Qualquer acesso externo a máquinas da rede interna é bloqueado.
3. Os usuários da rede local tem acesso livre ao servidor Linux.
4. Qualquer acesso externo a máquina do firewall é bloqueado, exceto
conexões para o serviço Apache (httpd). Outras tentativas de conexões
devem ser explicitamente registradas nos logs do sistema para
conhecimento do administrador.
5. Todos os usuários possuem acesso livre a Internet via Masquerading,
exceto que o acesso para o serviço www deve ser obrigatoriamente feito
via squid, e o servidor smtp a ser usado deverá ser o do firewall Linux.
6. Prioridades serão estabelecidas para os serviços de telnet, IRC,talk e
DNS.
#!/bin/sh
# Modelo de configuração de firewall
# Autor: Gleydson M. Silva
# Data: 05/09/2001
# Descrição: Produzido para ser distribuído livremente, acompanha o guia
# Foca GNU/Linux. http://focalinux.cipsga.org.br
#
# É assumido um sistema usando kmod para carga automática dos módulos usados por
# esta configuração do firewall:
# ipt_filter
# ipt_nat
# ipt_conntrack
# ipt_mangle
# ipt_TOS
# ipt_MASQUERADE
# ipt_LOG
# Se você tem um kernel modularizado que não utiliza o kmod, será necessário
# carregar estes módulos via modprobe, insmod ou iptables --modprobe=modulo
121
# Tabela mangle
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
###############################################################
# Tabela filter #
###############################################################
122
# interfaces será bloqueado neste passo
iptables -A FORWARD -d 192.168.1.0/24 -i ppp+ -o eth0 -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -i eth0 -o ppp+ -j ACCEPT
iptables -A FORWARD -j LOG --log-prefix "FIREWALL: FORWARD "
iptables -A FORWARD -j DROP
# Primeiro aceitamos o tráfego vindo da Internet para o serviço www (porta 80)
iptables -A ppp-input -p tcp --dport 80 -j ACCEPT
#######################################################
# Tabela nat #
#######################################################
# Não queremos que usuários tenham acesso direto a www e smtp da rede externa, o
# squid e smtpd do firewall devem ser obrigatoriamente usados. Também
registramos
# as tentativas para monitorarmos qual máquina está tentando conectar-se
diretamente.
123
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp+ -p tcp --dport 80 -j LOG
--log-prefix "FIREWALL: SNAT-www "
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp+ -p tcp --dport 25 -j LOG
--log-prefix "FIREWALL: SNAT-smtp "
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp+ -p tcp --dport 25 -j
DROP
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp+ -p tcp --dport 80 -j
DROP
# É feito masquerading dos outros serviços da rede interna indo para a interface
# ppp0
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp+ -j MASQUERADE
# Qualquer outra origem de tráfego desconhecida indo para eth0 (conexões vindas
# de ppp+) são bloqueadas aqui
iptables -t nat -A POSTROUTING -o eth0 -d 192.168.1.0/24 -j LOG --log-prefix
"FIREWALL: SNAT unknown"
iptables -t nat -A POSTROUTING -o eth0 -d 192.168.1.0/24 -j DROP
# Quando iniciamos uma conexão ppp, obtermos um endereço classe A (10.x.x.x) e
após
# estabelecida a conexão real, este endereço é modificado. O tráfego indo para
# a interface ppp não deverá ser bloqueado. Os bloqueios serão feitos no
# chain INPUT da tabela filter
iptables -t nat -A POSTROUTING -o ppp+ -j ACCEPT
###############################################
# Tabela mangle #
###############################################
124
7 O PROXY SQUID
Adaptado de “O Squidnomicon”, por <arfreitas@ig.com.br>,Versão 1.21
http://www.alceujun.hpg.ig.com.br/linux/squidnomicon.html
7.1 Introdução
Resolvi escrever esse manual principalmente porque ninguém o havia
feito antes. Dentre todos os inúmeros documentos sobre Linux e software livre
em http://www.linuxdoc.org não há nenhum que fale sobre Squid, mesmo em
inglês, quem diria em português.
Você poderá encontrar maiores informações sobre o Squid no seu
website (http://www.squid-cache.org) e ainda poderá recorrer a FAQS e a lista
de discussão para dúvidas.
Squidnomicon significa manual do Squid. Eu achei divertido fazer uma
relação com o Necronomicon (Livro dos Mortos). Mas não espere encontrar
nenhuma outra semelhança além desta. Talvez eu use um desenho do grande
Cthullu como logo do manual, mas tenho receio dos direitos autorais.
Este manual é livre e está sobre a licença Free GNU Documentation.
Qualquer ajuda (dicas, comentários) e/ou modificações são muito bem-vindas.
125
• um computador: para testes qualquer um serve, mas para entrar em
operação você terá que ter pelo menos um Pentium 2 com 128MB e
um HD de 4 Gb. Isto é aproximado, e pode variar muito conforme o
número de usuários X requisições. Basta saber que os requisitos de
hardware de um servidor proxy são muito maiores em relação à
quantidade de memória e velocidade do disco do que para um
firewall, principalmente devido ao cache; velocidade de
processamento também influirá na performance do proxy.
• conhecimento básico sobre protocolo TCP-IP e Internet;
• conhecer o UNIX no qual você quer instalar o Squid!
7.3.1 Instalação
A instalação poderá depender de qual distribuição você estiver usando.
Normalmente você encontrara o Squid nos CDROM de distribuição em
formatos RPM, DEB ou TGZ. Você também pode usar o fonte do Squid e
compilar os binários usando somente as funções que você precisar.
Para distribuições que trabalham com pacotes a instalação é muito
simples:
rpm -ivh squid-versao.rpm (para distribuições baseadas em RPM)
ou
apt-get install squid (para o Debian)
O Conectiva (versão 6 e posteriores) também podem usar as mesmas
facilidades do apt-get.
Para instalar a partir do fonte, faca o download do Squid em
http://www.squid-cache.org na seção de downloads. Depois execute:
tar -xzvf squid-versao.tar.gz/
cd /diretorio_criado
./configure
make
make install
Ler o arquivo README que acompanha o arquivo fonte também e
essencial para obter os detalhes.
A versão termina em números pares (para versões estáveis) e impares (para
126
versões de teste) então escolha a ultima de acordo com seus interesses.
Procure sempre pelos arquivos com o RELEASE incluso.
7.3.2 Configuração
Depois de instalado você provavelmente (espero!) terá os binários e
arquivos de configuração, muitos deles comentados e precedidos de
comentários sobre as funções que exercem. O arquivo de configuração do
Squid fica em /etc/squid.conf. Inicialmente você deve configurar apenas 3
parâmetros para que tenha o Squid ao menos respondendo a requisições e
criando cache das páginas requisitadas:
http_port 3128
cache_mem 8Mb
http_access allow all
Com exceção do ultimo parâmetro (que deve ser inserido) esses
parâmetros estão apenas comentados (com um sinal "#"). Depois disso você
pode iniciar o Squid usando o script de inicialização que fica dentro do diretório
/etc/rc.d/init.d (ou /etc/init.d para o Debian):
# cd /etc/rc.d/init.d
#./squid start
Na maioria das distribuições o cache é criado quando o Squid é iniciado
pela primeira vez (pelo menos para sistemas Linux). Você ainda pode forçar a
criação de cache digitando:
# squid -z
Ainda é possível fazer com que o Squid interprete novos parâmetros no
arquivo de configuração sem interromper os processos atuais:
# squid -k reconfigure
O Squid já está rodando e aceitando conexões. Agora vamos explicar
melhor os parâmetros utilizados:
• http_port 3128: Este parâmetro indica em que porta o Squid
estará aceitando requisições de páginas Web. Várias portas
diferentes podem ser listadas simultaneamente, desde que estejam
livres.
• cache_mem 8Mb: Este parâmetro especifica a quantidade ideal de
memória a ser usada pelo Squid, mas isso não significa um limite. O
Squid irá ultrapassar o valor estipulado se assim for necessário.
• http_access allow all: Inicialmente o Squid estará recusando
o serviço de proxy para qualquer requisição que não tenha sido feita
a partir do localhost (127.0.0.1). Essa diretriz, pelo contrário, esta
permitindo que qualquer um requisite qualquer página.
O Squid permite uma grande flexibilidade sobre o que é permitido ou não
que o cliente requisite (conforme você poderá acompanhar mais à frente).
Agora você pode fazer um teste com um navegador qualquer, como o
Netscape ou o Internet Explorer. Para isso, configure (na parte referente a
servidor proxy) o endereço IP do proxy Squid sem esquecer de indicar a porta
3128.
127
As solicitações agora serão atendidas pelo Squid, que irá fazer cache
das requisições, como páginas html e figuras, o que aumenta
consideravelmente a rapidez de navegação e diminui a ocupação de banda do
link.
128
• URLPATH_REGEX Semelhante ao url_regex só que ira procurar
a expressão na url toda exceto no nome do protocolo e domínio. Isso
ira tentar combinar com o nome do diretório ao longo da url.
• PORT O acesso pode ser controlado pela porta do endereço do
servidor requisitado.
• PROTO Especifica o protocolo de transferência.
• METHOD Especifica o tipo de método da requisição.
• BROWSER expressão regular cujo padrão tentara combinar com
o contido no cabeçário HTTP de requisição do cliente.
• IDENT Seqüência de caracteres que combinam com o nome do
usuário. Requer um servidor Ident rodando na máquina do cliente.
• IDENT_REGEX O mesmo que ident, mas utilizando-se de uma
expressão regular.
• PROXY_AUTH Permite a autentificação de usuários através do
envio de usuário/senha. Requer um programa externo para realizar
essa autentificação.
• PROXY_AUTH_REGEX O mesmo que proxy_auth, só que ira
tentar combinar o nome do usuário fornecido pelo programa de
autentificação através de uma expressão regular.
• SNMP_COMMUNITY Seqüência de caracteres que tentarão
combinar com o nome da comunidade SNMP.
• REQ_MIME_TYPE Expressão regular que tentara combinar com
o tipo de conteúdo contido no cabeçário de requisição.
• ARP Tenta combinar o MAC ADDRESS.
Como você pode ter notado, existe uma quantidade bem grande de
facilidades com as quais você pode construir uma ACL, ate mais do que você
provavelmente ira precisar (eu me pergunto se alguém usa ident).
Depois de definir as listas de controle você precisa definir para cada
linha da acl o que ela poderá ter como permitido (ou negado). A lista de regras
já é um pouco menor.
HTTP_ACCESS
sintaxe: http_access allow | deny [!] acl descrição: permite ou nega acesso ao
serviço http baseado na lista de acesso (acl) definida. O uso de "!" indica
inversão (diferente de).
Eu coloquei uma observação um pouco acima de que você sempre tem
de ter como última regra uma regra de bloqueie tudo, a fim de evitar brechas no
conjunto de acl's que você tenha criado. Você pode usar o http_access para
bloquear acesso a http dessa forma:
acl all src 0.0.0.0/0 http_access deny all
Isso diz ao Squid "qualquer requisitante". No final das contas, se um
requisitante não tiver seu pedido encaixado em alguma acl anterior, ele terá
seu pedido negado.
129
• ICP_ACCESS
sintaxe: icp_access allow | deny [!] acl descrição: use para forçar
seus vizinhos a usarem você como um <sibling> ao invés de pai. Isso
e utilizado quando se trabalha com arvores de cache.
• MISS_ACCESS
sintaxe: miss_access allow | deny [!] acl descrição: limita os domínios
que podem fazer requisições ao cache do servidor utilizando os
recursos acl.
• PROXY_AUTH_REALM
sintaxe: proxy_auth_realm seqüência de caracteres descrição: na
realidade esse comando não exerce nenhum tipo de controle, apenas
informa ao cliente (através da seqüência de caracteres) aonde ele
esta realizando o logon. Não é essencial, mas o padrão aparece
como "Squid proxy"? e você pode mudar isso sem problemas.
• IDENT_LOOKUP_ACCESS
sintaxe: ident_lookup_access allow | deny acl descrição: se a acl
combinar com a requisição do cliente, este cliente será autentificado
por uma procura ident.
7.5.3 Posso usar uma lista de controle com multiplos horários para
diferentes usuários?
Se você pensou em algo assim:
130
acl carlos src 192.168.10.1
acl davi src 192.168.10.2
acl cleusa src 192.168.10.3
acl manhã time 06:00-11:00
acl tarde time 14:00-14:30
acl noite time 16:25-23:59
http_access allow carlos manhã almoço
http_access allow davi manhã almoço
http_access allow cleusa noite
você errou !
O Squid interpreta regras desta forma:
http_access REGRA definição1 E definição 2 E definição3
OU
http_access AÇÃO definição1 E definição 2 E definição3
Atenção porque esses E e OU são operadores lógicos! Portanto a acl:
http_access allow carlos manhã almoço
nunca irá funcionar porque manhã E almoço serão sempre falsos, uma
vez que nunca serão verdadeiros na mesma hora. Como é falso (de acordo
com a lógica booleana):
0/1 E 1 = 0 (falso)
http_access allow carlos E manhã OU
http_access allow carlos almoço
7.5.4 Quero criar uma acl para bloquear sites com a palavra sexo
pois meus funcionários ficam baixando filmes em Divx de
pornografia:
acl porno url_regex sexo
http_access deny porno
Isso tem algumas conseqüências. Primeiro que essa regra deve
encabeçar a lista para você não correr o risco de liberar o acesso antes de
bloqueá-lo. Segundo que um site http://www.sexoesaude.com.br estaria
encaixado na lista de bloqueio, apesar do conteúdo não ser o mesmo.
131
ou
acl porno2amissao dstdomain "/etc/squid/pornosites.txt"
http_access deny porno2
7.5.7 Meu diretor reclama que agora não consegue mais ler as
entrevistas no site da Playboy.
Chefe é chefe. Antes que ele deixe de pagar seu salário, inclua no
arquivo /etc/squid.conf :
acl entrevistas urlpath_regex entrevistas
http_access allow entrevistas
Essa regra deve vir ANTES do bloqueio do site da Playboy.
132
APÊNDICE A. LICENÇA DE PUBLICAÇÃO LIVRE
Esta é uma tradução não-oficial da Open Publication License versão 1.0,
de 8 de junho de 1999, e não é substituto legal para a Licença original,
disponível em http://www.opencontent.org/openpub. Entretanto, esta tradução
poderá auxiliar pessoas que falem Português a entender melhor a licença. É
permitido a qualquer pessoa copiar e distribuir cópias desse documento de
licença, desde que sem a implementação de qualquer mudança.
133
III. Escopo da licença
Os termos de licença a seguir aplicam-se a todos os trabalhos
protegidos pela Licença de Livre Publicação (Open Publication License), a não
ser que explicitamente indicado no trabalho.
A mera adição de trabalhos protegidos pela Licença de Livre Publicação
(Open Publication License) ou partes de trabalhos protegidos pela Licença de
Livre Publicação (Open Publication License) em uma mesma mídia que
contenha outros trabalhos ou programas não protegidos por essa licença não
decorre em aplicação da Licença de Livre Publicação (Open Publication
License) para esses outros trabalhos. O trabalho resultante deve explicitamente
conter uma nota especificando a inclusão do material protegido pela Licença de
Livre Publicação (Open Publication License) e o aviso de copyright apropriado.
APLICABILIDADE. Se alguma parte desta licença não puder ser
aplicada em alguma jurisdição, as partes restantes deste documento continuam
sendo aplicadas.
AUSÊNCIA DE GARANTIA. Os trabalhos protegidos pela Licença de
Livre Publicação (Open Publication License) são fornecidos "como estão", sem
garantias de qualquer tipo, explícita ou implícita, incluindo, mas não limitado a,
as garantias implícitas de comercialização e conveniência para um propósito
particular, ou garantia de não-infração.
IV. Requisitos para trabalhos modificados
Todas as versões modificadas de documentos cobertos por esta licença,
incluindo traduções, antologias, compilações e documentação parcial, deve
seguir os requisitos abaixo:
A versão modificada deve ser indicada como tal.
As pessoas que fizerem as modificações e as datas de modificação
devem ser identificadas.
O reconhecimento dos autores e editor originais (se aplicável) deve ser
mantido de acordo com as práticas acadêmicas usuais de citação.
O local da versão não-modificada do documento deve ser indicado.
Os nomes originais dos autores não devem ser utilizados para indicar ou
garantir seu endosso ao documento resultante sem a autorização expressa dos
autores.
V. Práticas recomendadas
Em adição aos requisitos desta licença, é solicitado e extremamente
recomendado aos redistribuidores que:
Se os trabalhos protegidos pela Licença de Livre Publicação (Open
Publication License) estiverem sendo distribuídos em impressos ou CD-ROM,
os autores sejam informados por email, ao menos trinta dias antes, para que os
autores tenham tempo de providenciar documentação atualizada. Esta
notificação deve descrever as modificaçoes introduzidas no documento, se
existirem.
134
Todas as modificações substanciais (incluindo exclusões) devem ser
marcadas claramente no documento, ou então descritas em um anexo ao
documento.
Finalmente, mesmo não sendo obrigatório sob esta licença, é
considerado de bom tom oferecer uma cópia sem ônus de todo o material
modificado (impresso e CD-ROM) para os autores originais.
VI. Termos opcionais
Os autores e editores de documentos protegidos pela Licença de Livre
Publicação (Open Publication License) podem escolher certas opções de
licença simplesmente incluindo alguns parágrafos após a cópia da licença ou
sua referência. Estas opções são consideradas parte da licença e devem ser
incluídas com ela (ou com a referência a ela) nos trabalhos derivados.
As opções que se aplicam a este trabalho são:
A:É vedada a distribuição de versões com modificações substanciais
deste documento sem a expressa permissão dos proprietários do direito
autoral.
B:É vedada a distribuição deste trabalho ou qualquer derivado seu em
qualquer formato de livro padrão (papel) sem a prévia autorização dos
proprietários do direito autoral.
135