Você está na página 1de 28

CPD UNIESP Birigui

Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

Criando Scripts para Firewall Linux (IPTABLES)


Este pequeno tutorial nos ensina os principais e bsicos conceitos de firewall, dando-nos autonomia quando preciso estabelecer um firewall.

Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

Capitulo 1
Veremos detalhes sobre a criao e manuteno de scripts de firewall no Linux, abordando diversos cenrios de uso, incluindo mquinas desktop, servidores de rede local e servidores de Internet, com um grande volume de dicas de segurana. Quando falamos em "firewall", muitas vezes vem mente um dispositivo dedicado, colocado entre o servidor (ou o switch da rede, no caso de um rede local) e a Internet. Embora firewalls dedicados sejam tambm bastante comuns e sejam os preferidos em grandes redes, onde o investimento justificvel, voc pode obter um nvel de segurana similar simplesmente usando os recursos nativos do sistema, configurando o Iptables. O firewall trabalha como um fiscal de alfandega, que analisa todos os pacotes que chegam, decidindo o que deve passar e o que deve ficar retido, atravs de um conjunto de regras definidas. Um servidor destinado a compartilhar a conexo com a Internet e proteger os micros da rede local, por exemplo, usaria as regras de compartilhamento da conexo via NAT, combinadas com uma regra para permitir o acesso dos micros da rede local e regras para bloquear o trfego proveniente da Internet. Voc poderia incluir regras para abrir a porta do SSH, ou redirecionar alguma porta especfica para um micro dentro da rede local rodando algum software que precisasse de portas de entrada, mas todas as demais portas ficariam fechadas. Em um servidor de Internet, por sua vez, voc no pode simplesmente bloquear todas as portas, j que, por definio, ele deve receber requisies dos clientes e disponibilizar as pginas hospedadas, entre outros recursos. Voc faria ento uma configurao mais cuidadosa, listando os servios que devem ficar disponveis, abrindo as portas referentes a eles e fechando todas as demais. As portas bsicas para um servidor web, por exemplo, seriam as portas 22 (do SSH), a porta 53 (do servidor DNS) e as portas 80 e 443, usadas pelo servidor web. Existem muitos firewalls grficos for Linux, como o Shorewall e o Firestarter. Eles variam em nvel de facilidade e recursos, oferecendo uma interface amigvel e gerando as regras do Iptables de acordo com a configurao feita. Voc pode escolher entre usar o programa que melhor atenda suas necessidades ou configurar diretamente o Iptables com as regras desejadas, como aprenderemos ao longo desta srie de tutoriais. Nesse caso, voc pode formular as regras diretamente, definindo condies onde os pacotes sero aceitos ou recusados, como em: # iptables -A INPUT -s 192.168.1.0/255.255.255.0 -j ACCEPT Estes comandos seguem uma sintaxe comum: tudo comea com o comando "iptables", que o utilitrio responsvel por ler os parmetros e atualizar a configurao do firewall. Em seguida, vem uma condio, indicada pela opo "-A". Neste exemplo usei "INPUT -s 192.168.1.0/255.255.255.0", que se aplica a qualquer pacote de entrada (INPUT), proveniente dos micros da rede local (192.168.1.0/255.255.255.0). Como no 2 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

especifiquei o protocolo, a regra permitir o uso dos trs protocolos, ou seja, TCP, UDP e ICMP, sem restries. Note que aqui estou especificando uma faixa (usada na rede local), fazendo com que a provenientes dela. No final, preciso dizer enquadrarem nesta condio, indicando uma pacotes devem ser aceitos. de endereos e a mscara de sub-rede regra se aplique a todos os pacotes o que fazer com os pacotes que se ao. O "-j ACCEPT" diz que estes

Se, por outro lado, quisesse apenas bloquear um endereo especfico, usaria o parmetro "-j REJECT", como em: # iptables -A INPUT -s 192.168.1.23 -j REJECT primeira vista, configurar o firewall via linha de comando parece bastante complicado, assim como o arquivo de configurao original do Squid, com suas 3.000 e tantas linhas, mas, as coisas ficam bem mais simples se comearmos com um script simples e formos incluindo novas regras aos poucos. A primeira coisa a ter em mente que, assim como o Squid, o Iptables processa as regras de forma sequencial, permitindo ou recusando as conexes conforme encontra uma regra que faz referncia a ela. Se uma determinada regra diz que os pacotes provenientes de um determinado endereo devem ser aceitos e outra logo depois diz que eles devem ser recusados, como neste exemplo: # iptables -A INPUT -s 192.168.1.10 -j ACCEPT # iptables -A INPUT -s 192.168.1.10 -j REJECT ... vale a primeira, j que ao serem autorizados por ela, os pacotes so imediatamente aceitos, sem passarem pela segunda. Ao formular as regras para seu script de firewall, voc deve colocar as regras mais especficas primeiro, deixando as regras mais gerais por ltimo. Se voc quer permitir o acesso de todos os endereos provenientes da rede local, bloqueando apenas um endereo especfico, voc usaria: # iptables -A INPUT -s 192.168.1.10 -j REJECT # iptables -A INPUT -s 192.168.1.0/255.255.255.0 -j ACCEPT Alm de serem diretamente digitadas no terminal, as regras podem ser includas dentro de scripts, de forma que voc possa ativar o firewall rapidamente e/ou configurar o sistema para carreg-lo automaticamente durante o boot. O script de firewall nada mais do que um shell script comum, contendo os comandos que devem ser executados, um por linha. Voc pode, por exemplo, criar o arquivo "/etc/init.d/firewall". Outra opo seria simplesmente adicionar os comandos no final do arquivo "/etc/rc.local", de forma que eles sejam executados durante o boot.

3 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

Este um exemplo de mini-script de firewall que pode ser usado em um desktop que simplesmente acessa a Internet como cliente, sem rodar nenhum servidor nem compartilhar a conexo com outros micros: #!/bin/sh iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -p tcp --syn -j DROP A idia aqui que o micro possa acessar a Internet sem ficar vulnervel a acessos externos. Estes dois comandos fazem isso da forma mais simples possvel. A primeira linha orienta o firewall a deixar passar os pacotes enviados atravs da interface de loopback (-i lo -j ACCEPT). importante que esta linha (ou outra com o mesmo efeito) sempre seja usada em qualquer script de firewall que termine bloqueando todas as conexes, pois, no Linux, a interface de loopback usada para comunicao entre diversos programas. Para ter uma idia, todos os programas grficos a utilizam para se comunicarem com o servidor X, os programas do KDE a utilizam para trocar mensagens entre si e assim por diante. Sem esta regra, muita coisa deixa de funcionar corretamente. Depois de abrir o firewall para as mensagens locais, usamos a segunda regra para bloquear todas as novas conexes vindas de fora. O "--syn" faz com que o firewall aplique a regra apenas para tentativas de abrir novas conexes (algum tentando acessar o servidor SSH que voc esqueceu aberto, por exemplo), sem entretanto impedir que servidores remotos respondam a conexes iniciadas por voc. Isso permite que voc continue navegando e acessando compartilhamentos em outros micros da rede local, com poucas limitaes. Estas duas regras podem ser usadas como base para criar um firewall de bloqueio, onde voc diz as portas que gostaria de abrir e ele fecha todas as demais. Ou seja, o firewall fecha por padro todas as portas, com exceo das que voc disser explicitamente que deseja manter abertas. Isso garante uma configurao de firewall bastante segura com um mnimo de dor de cabea. Para testar, voc pode executar o script no seu micro, ou em qualquer outro PC da rede e tentar acess-lo via SSH (ou qualquer outro servio ativo). Como usamos o parmetro "DROP" na segunda regra, o PC simplesmente ignorar o chamado, fazendo com que o cliente fique um longo tempo tentando abrir a conexo, para depois exibir um erro de timeout, como em: $ ssh 192.168.1.21 ssh: connect to host 192.168.1.21 port 22: Connection timed out Para desativar o firewall e voltar a aceitar conexes, use o comando "iptables -F", que limpa as regras do Iptables: 4 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

# iptables -F A partir deste script bsico, voc pode adicionar novas regras, abrindo portas, direcionando faixas de portas para micros da rede interna, fechando portas de sada, de forma a bloquear o uso de determinados programas e assim por diante. Imagine que voc est configurando o firewall do servidor da rede. Ele tem duas placas de rede, uma para a rede local e outra para a Internet. Voc precisa que ele fique acessvel sem limitaes dentro da rede local, mas quer manter tudo fechado para quem vem da Internet. Nesse caso, voc poderia usar a regra que mostrei h pouco no seu script de firewall: # Abre para uma faixa de endereos: iptables -A INPUT -s 192.168.1.0/255.255.255.0 -j ACCEPT O "192.168.1.0" indica a faixa de endereos da rede local. A mscara "255.255.255.0" indica que a ltima parte do endereo muda, ou seja, os micros da rede local usam endereos entre 192.168.1.1 e 192.168.1.254. Tudo o que vier deles aceito. Note que esta faixa de endereos no rotevel, ou seja, ela simplesmente no existe na Internet. No existe a possibilidade de algum engraadinho de outro estado tentar configurar seu micro para usar esta faixa de endereos e enganar a regra do firewall. Como uma proteo adicional, as verses recentes do Iptables so capazes de ignorar pacotes aparentemente destinados a uma interface quando eles chegam em outra. Com duas placas, onde uma est ligada rede local (usando a faixa 192.168.1.x) e outra Internet, o firewall no aceitar que um pacote falseado, proveniente da Internet, com endereo de emissor "192.168.1.3" (por exemplo), seja encaminhado a um micro da rede local, pois ele sabe que pacotes com este endereo de emissor devem chegar apenas pela placa ligada rede local. Se o servidor possuir duas placas de rede, voc poderia tornar a regra mais prova de falhas especificando a interface de origem em vez da faixa de endereos, usando o parmetro "-i". Com isso, o firewall instrudo a aceitar pacotes recebidos na interface de rede local, independentemente da faixa de endereos usada. Embora funcione de forma diferente, ela tem a mesma funo da regra anterior. Ao us-la, no esquea de substituir o "eth0" pela interface de rede local, caso diferente: # Aceita tudo na interface de rede local: iptables -A INPUT -i eth0 -j ACCEPT Se voc um administrador paranico, pode tambm combinar as duas condies, de forma que o firewall verifique tanto a interface de origem quanto a faixa de endereos, aceitando a conexo apenas se as duas condies forem satisfeitas. Nesse caso, a regra seria: 5 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

# Verifica tanto a interface quanto a faixa de endereos de origem: iptables -A INPUT -s 192.168.1.0/255.255.255.0 -i eth0 -j ACCEPT O parmetro "-s" (source), usado na regra anterior, pode tambm ser usado para permitir endereos ou faixas de endereos da Internet. Imagine que voc precise dar acesso aos hosts de uma das filiais da empresa, onde usam um link dedicado, com uma faixa inteira de endereos, que vai do "200.220.234.1" at o "200.220.234.254". Voc poderia abrir o firewall para conexes a partir da faixa "200.220.234.0" (como em: iptables -A INPUT -s 200.220.234.0/255.255.255.0 -j ACCEPT), de forma que o firewall permitisse acessos vindos de l, mas continuar bloqueando o restante. Voc pode abrir o firewall para vrias faixas de endereos distintas, basta repetir a linha adicionando cada uma das faixas desejadas. Imagine agora que este servidor foi instalado na sede de uma empresa para a qual voc presta servios. Voc precisa acess-lo de vez em quando para corrigir problemas, mas, naturalmente, vai querer fazer isso via Internet, sem precisar se deslocar at l. Voc pode configurar o firewall para abrir a porta 22, usada pelo SSH, adicionando a regra: # Abre uma porta (inclusive para a Internet): iptables -A INPUT -p tcp --dport 22 -j ACCEPT Note que esta regra abre a porta 22 para todo mundo. Lembre-se de que todo servidor disponvel para a Internet um risco potencial de segurana, por isso, s abra as portas para os servidores que voc realmente for utilizar. Do ponto de vista da segurana, o ideal seria usar um par de chaves, protegidas por uma passphrase, para acessar o servidor SSH e configur-lo para no aceitar logins com senha (apenas com chaves), como voc pode ver nesta dica: http://www.hardware.com.br/dicas/ssh-loginautomatico.html Ao abrir vrias portas, voc pode utilizar o parmetro "-m multiport" para especificar todas de uma vez, separadas por vrgula, sem precisar colocar uma em cada linha. Para abrir as portas 22, 80 e 443, por exemplo, voc usaria a regra abaixo: # Abre um conjunto de portas: iptables -A INPUT -m multiport -p tcp --dport 22,80,443 -j ACCEPT Se voc presta suporte a partir de uma conexo com IP fixo, pode tornar a regra mais especfica, permitindo o acesso apenas a partir deste endereo IP especfico, como em: # Abre uma porta para um IP especfico: iptables -A INPUT -p tcp -s 200.231.14.16 --dport 22 -j ACCEPT

6 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

Em um micro domstico, voc pode abrir tambm as portas usadas pelo bittorrent (6881 a 6889) ou portas usadas por jogos multiplayer, por exemplo. Para abrir um intervalo de portas, indique a primeira e a ltima porta, separadas por ":", como em: # Abre um intervalo de portas: iptables -A INPUT -p tcp --dport 6881:6889 -j ACCEPT Alm de trabalhar com endereos IP, possvel criar regras baseadas tambm em endereos MAC. Isso permite adicionar uma camada extra de proteo ao criar regras para a rede local. Para isso, usamos o parmetro "-m mac --mac-source", seguido pelo endereo MAC da placa do host desejado. Para permitir que o host "192.168.1.100" tenha acesso ao servidor, mas apenas depois de verificado tambm o endereo MAC da interface de rede, voc usaria uma regra como: # Verifica tanto o endereo IP quanto o MAC antes de autorizar a conexo: iptables -A INPUT -s 192.168.1.100 -m mac --mac-source 00:11:D8:76:59:2E j ACCEPT Note que agora, alm do IP, especificamos o endereo MAC da placa. As duas regras so usadas em conjunto, de forma que o acesso permitido apenas caso as duas informaes estejam corretas. Isso dificulta as coisas para algum que queira acessar o servidor trocando o IP da mquina. Voc pode descobrir o MAC das mquinas da rede usando o prprio ifconfig ou o comando "arp -a". Note que limitar o acesso com base no endereo MAC adiciona uma camada extra de proteo, mas no infalvel. O endereo MAC pode ser trocado de forma quase to simples quanto o endereo IP e, sniffando a rede, possvel descobrir os endereos IP e MAC dos micros com uma certa facilidade. No Linux, voc pode trocar o endereo MAC da placa de rede usando os comandos: # ifconfig eth0 down # ifconfig eth0 hw ether 00:11:D8:76:59:2E # ifconfig eth0 up Como v, basta especificar o endereo desejado. O Iptables no capaz de diferenciar mquinas com os endereos MAC falseados das reais, de forma que se algum desconectasse o micro "192.168.1.100" da rede (desconectando o cabo no switch, por exemplo) e configurasse outro para usar o mesmo endereo IP e o mesmo MAC, poderia acessar o servidor bipassando a regra de firewall. A nica forma de ter uma segurana completa seria utilizar o SSH ou outro protocolo que utilize um algoritmo robusto de encriptao para o login e a transmisso dos dados.

7 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

Lembre-se de que o firewall uma primeira barreira de proteo, mas no uma garantia por si s. preciso combin-lo com outras camadas de segurana para ter um servidor completamente seguro. Outra limitao que as regras baseadas em endereos MAC podem ser usadas apenas dentro da rede local. Os roteadores descartam os endereos MAC dos pacotes antes de transmiti-los para a Internet, enviando apenas o endereo IP. Ao acessar atravs de uma conexo compartilhada, todos os pacotes provenientes da Internet chegam com o endereo MAC do gateway da rede. Este um exemplo de script completo, incluindo algumas regras adicionais para evitar ataques comuns. Ele inclui as funes para aceitar os comandos "start", "stop" e "restart", de forma a se comportar como se fosse um servio de sistema: #!/bin/bash iniciar(){ # Abre para a faixa de endereos da rede local: iptables -A INPUT -s 192.168.1.0/255.255.255.0 -j ACCEPT # Faz a mesma coisa, s que especificando a interface. Pode ser # usada em substituio regra anterior: # iptables -A INPUT -i eth0 -j ACCEPT # Abre uma porta (inclusive para a Internet): iptables -A INPUT -p tcp --dport 22 -j ACCEPT # Ignora pings: iptables -A INPUT -p icmp --icmp-type echo-request -j DROP # Protege contra IP spoofing: echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter # Descarta pacotes malformados, protegendo contra ataques diversos: iptables -A INPUT -m state --state INVALID -j DROP # Abre para a interface de loopback. Esta regra essencial para que # o KDE e outros programas grficos funcionem adequadamente: 8 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

iptables -A INPUT -i lo -j ACCEPT # Impede a abertura de novas conexes, efetivamente bloqueando o acesso # externo ao seu servidor, com exceo das portas e faixas de endereos # especificadas anteriormente: iptables -A INPUT -p tcp --syn -j DROP echo "Regras de firewall ativadas" } parar(){ iptables -F iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT echo "Regras de firewall desativadas" } case "$1" in "start") iniciar ;; "stop") parar ;; "restart") parar; iniciar ;; *) echo "Use os parmetros start ou stop" esac A receber qualquer conexo, vinda de qualquer endereo, o firewall primeiro verifica todas estas regras, seqencialmente, para decidir se o pacote passa ou no. Usando este script de exemplo, teramos o seguinte: - Se o pacote vier da rede local, ele aceito. - Se o pacote for para porta 22 (do SSH), ele aceito. - Se for um ping, ele ignorado (de forma a dificultar um pouco para outros descobrirem que voc est online). 9 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

- Pacotes invlidos, que no faam parte de uma conexo aberta anteriormente e que no correspondam abertura de uma nova conexo so ignorados, protegendo contra pacotes forjados e tentativas de ataque diversas. - Se o pacote vier da sua prpria mquina (um programa tentando mostrar alguma coisa na tela, por exemplo), ele aceito. - Se o pacote for uma resposta a uma conexo que voc iniciou, como, por exemplo, o servidor do guiadohardware.net enviando a pgina do site que voc est acessando, ele aceito. - Tentativas de conexo (toda conexo TCP iniciada por um pacote syn) fora das condies especificadas acima so descartadas pelo firewall. A conexo nem sequer chega a ser estabelecida e o emissor no recebe qualquer resposta (DROP). Para usar o script, transforme-o em um arquivo executvel, usando o comando: # chmod +x /etc/init.d/compartilhar A partir da, voc pode iniciar e parar o compartilhamento usando os comandos: # /etc/init.d/compartilhar start # /etc/init.d/compartilhar stop Para que o script seja executado durante o boot, voc pode adicionar o comando "/etc/init.d/compartilhar start" no arquivo "/etc/rc.local", em vez de colocar os comandos diretamente. Outra opo (mais elegante) criar um link para ele dentro da pasta "/etc/rc5.d", o que tambm faz com que ele seja executado durante o boot: # cd /etc/rc5.d # ln -s ../init.d/compartilhar S21compartilhar O "S" indica que o script deve ser executado com o parmetro "start" e o "21" indica a ordem em que deve ser executado durante o boot, em relao aos outros servios. A ordem de execuo dos servios muda de distribuio para distribuio, mas nessa posio garantimos que ele ser executado depois da ativao das interfaces de rede e de outros servios essenciais. Se voc um administrador paranico, verifique a configurao dos servios na distribuio em uso e altere a ordem de inicializao do script de firewall, de forma que ele seja carregado antes de qualquer outro servio que aceite conexes, como o Samba ou o Apache. Com isso voc garante que o firewall ser carregado primeiro e no fica com seu servidor vulnervel nem mesmo por um curto espao de tempo durante o boot. 10 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

Isso nos leva a uma terceira opo para salvar a configurao, utilizando os prprios arquivos de inicializao do sistema. Ela a mais "correta" do ponto de vista tcnico, embora menos flexvel. Nesse caso, a configurao seria feita em trs passos: A primeira parada seria o arquivo "/etc/modules", onde so listados os mdulos carregados pelo sistema durante o boot. Nele seria adicionada a linha "iptables_nat", ativando o carregamento do mdulo. Em seguida, voc adicionaria (ou descomentaria) a linha "net.ipv4.conf.default.forwarding=1" no arquivo "/etc/sysctl.conf", para ativar o roteamento de pacotes, tornando permanente o comando "echo 1 > /proc/sys/net/ipv4/ip_forward". Finalmente, depois de executar o comando "iptables -t nat -A POSTROUTING -o $placa -j MASQUERADE", que efetivamente ativa o compartilhamento, voc usaria o comando "/etc/init.d/iptables save active" (nas derivadas do Debian) ou "service iptables save" (nas derivadas do Red Hat) para salvar regra e fazer com que ela passe a ser reativada durante o boot. Continuando, outra dica importante so os comandos usados para limpar as regras do Iptables. necessrio execut-los sempre que voc fizer alteraes no seu script de firewall e quiser execut-lo novamente para que as novas regras entrem em vigor. Voc pode notar que inclu o comando "iptables -F" como parte da funo "stop" do script, de forma que ao desativar e reativar o script, as regras antigas seriam eliminadas e as novas regras carregadas. Alm dele temos tambm o "iptables -t nat -F" e o "iptables L": iptables -F: Limpa a tabela principal do iptables, onde vo os comandos para abrir e fechar portas, que vimos at aqui. iptables -t nat -F: Limpa a tabela nat, que usada por regras que compartilham a conexo e fazem forwarding de portas. Todas as regras do Iptables que levam "-t nat" so armazenadas nesta segunda tabela, que precisa ser zerada separadamente. A idia que voc pode limpar as regras principais do firewall sem desabilitar o compartilhamento da conexo e vice-versa. iptables -L: Este comando lista a configurao atual, sem alterar nada. interessante execut-lo depois de fazer alteraes na configurao do firewall, para ter certeza que as regras surtiram o efeito esperado. Para ver as regras de forwarding e compartilhamento, use tambm o "iptables -t nat -L". Este um tutorial de trs partes. Na segunda parte, iremos aprofundar esta configurao, gerando um script de firewall mais elaborado, voltado para um servidor de rede local, configurado como gateway da rede e, na terceira parte, estudaremos sobre a criao de scripts destinados a serem usados em um servidor de Internet.

11 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

Capitulo 2
Na primeira parte do tutorial, geramos um script de firewall simples, destinado a compartilhar a conexo e bloquear as conexes de entrada, permitindo apenas que o servidor fosse acessado remotamente via SSH. Vamos agora aprimorar a configurao, gerando um script de firewall mais elaborado, voltado para um servidor de rede local, configurado como gateway da rede. Na verdade, as regras para compartilhamento da conexo e para a ativao do proxy transparente tambm so regras de firewall, apenas usadas para um propsito diferente. Em vez de criar dois scripts separados, um para compartilhar a conexo e outro para o firewall, voc pode simplesmente adicionar as regras de restrio de acesso no seu script de compartilhamento da conexo, gerando um script unificado. Nesse caso, tome o cuidado de sempre colocar as regras que compartilham a conexo e ativam o proxy transparente antes das regras que bloqueiam conexes. Este um exemplo de script de firewall que inclui as regras para compartilhar a conexo e ativar o proxy transparente. Ao us-lo, comente as linhas que no se aplicam sua instalao e substitua o "eth1" e o "eth0" pelas interfaces da Internet e da rede local, caso diferente: #!/bin/bash iniciar(){ # Compartilha a conexo: modprobe iptable_nat echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE echo "Compartilhamento ativado" # Proxy transparente: iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128 echo "Proxy transparente ativado" # Permite conexes na interface de rede local e na porta 22: iptables -A INPUT -i eth0 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j ACCEPT 12 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

# Regras bsicas de firewall: iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-request -j DROP echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter iptables -A INPUT -p tcp --syn -j DROP # Bloqueia as portas UDP de 0 a 1023: iptables -A INPUT -p udp --dport 0:1023 -j DROP echo "Regras de firewall e compartilhamento ativados" } parar(){ iptables -F iptables -t nat -F iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT echo 0 > /proc/sys/net/ipv4/ip_forward echo "Regras de firewall e compartilhamento desativados" } case "$1" in "start") iniciar ;; "stop") parar ;; "restart") parar; iniciar ;; *) echo "Use os parmetros start ou stop" esac Veja que agora a funo "parar" do script inclui tambm os comandos "iptables -t nat F" e "echo 0 > /proc/sys/net/ipv4/ip_forward", destinados a limpar as regras de 13 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

roteamento e desativar o encaminhamento de pacotes quando o script desativado, parando tambm o compartilhamento da conexo. Outra novidade a regra que bloqueia as portas UDP de 0 a 1023, adicionada no final do script. Ao contrrio do TCP, o protocolo UDP no baseado na abertura de conexes, os dados so simplesmente enviados diretamente, sem serem precedidos por um pacote SYN ou qualquer aviso. Por isso, no possvel utilizar uma regra que bloqueie a abertura de novas conexes UDP mas permita respostas a conexes iniciadas por voc, como no caso da "iptables -A INPUT -p tcp --syn -j DROP". No caso das portas UDP tudo ou nada, ou seja, ou voc mantm a porta aberta para qualquer tipo de pacote, ou a fecha completamente. No podemos simplesmente bloquear todas as portas UDP, pois elas so usadas para o recebimento de requisies DNS. Voc pode fazer o teste limpando as regras de firewall e usando a regra "iptables -A INPUT -p tcp --syn -j DROP", que fecha todas as portas UDP; tente navegar e voc ver que a resoluo de nomes parar de funcionar at que voc remova a regra usando o "iptables -F". Entretanto, podemos bloquear as portas UDP privilegiadas, que so as usadas pelos servios conhecidos. Este acaba sendo um bom meio-termo. Forwarding de portas: Ao compartilhar uma conexo via NAT, apenas o servidor recebe conexes vindas da Internet. Os micros da rede local acessam atravs do servidor e recebem apenas pacotes de resposta. Na maioria dos casos, justamente isso que voc deseja, j que apenas o servidor fica exposto a ataques diretos, enquanto as estaes ficam protegidas dentro da rede local. Entretanto, isso nos leva a outro problema, que so os casos em que voc realmente deseja que algum dos hosts fique diretamente acessvel. Imagine que voc queira que um servidor web, escutando na porta 80 do micro 192.168.1.3 da rede local, fique disponvel para a Internet. Como o servidor o nico com um IP vlido na Internet, a nica forma de fazer com que o 192.168.1.3 fique acessvel fazer com que o servidor "passe a bola" para ele ao receber conexes na porta 80. justamente isso que fazemos ao configurar o forwarding de portas. Uma vez feita a configurao, sempre que o servidor receber uma conexo qualquer na porta 80 (ou qualquer outra definida por voc), ele a repassar para o 192.168.1.3. Isso feito de forma completamente transparente, de forma que o emissor nem percebe que quem respondeu solicitao foi outro host. Essa opo pode ser usada tambm para permitir que os micros da rede local fiquem com as portas do bittorrent abertas (de forma a baixar arquivos com um melhor desempenho), rodem servidores de games online ou qualquer outra tarefa onde seja necessrio manter determinadas portas TCP ou UDP abertas. A limitao que continua existindo uma nica porta 80, uma nica porta 22, etc., de forma que apenas um micro da rede interna pode receber cada porta de cada vez. Veja um exemplo de como redirecionar as portas 6881 a 6889 usadas pelo Bittorrent para o host 192.168.1.10 da rede local: 14 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

# Redireciona uma faixa de portas para um micro da rede local: echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 6881:6889 -j DNAT --to 192.168.1.10 iptables -t nat -A POSTROUTING -d 192.168.1.10 -j SNAT --to 192.168.1.1 Esta regra um pouco mais complexa, pois trabalha em duas fases. A primeira faz com que o servidor encaminhe todas as conexes que receber na interface e porta especificada para o micro da rede local e a segunda faz com que os pacotes de resposta enviados por ele posam ser encaminhados de volta. Para que ambas funcionem, necessrio usar o comando "echo 1 > /proc/sys/net/ipv4/ip_forward", que ativa o forwarding de portas. o mesmo comando que usamos ao compartilhar a conexo. Nos parmetros que coloquei em negrito, a "eth1" a placa de Internet, onde chegam os pacotes, a "6881:6889" a faixa de portas que est sendo redirecionada e o "192.168.1.10" o IP do micro dentro da rede local que passa a receber as conexes. Na segunda regra, temos repetido o IP do micro na rede local e, em seguida, o "192.168.1.1" que indica o IP do servidor, dentro da rede local. Para redirecionar uma nica porta, ao invs de uma faixa, basta citar a porta, sem usar os ":", como em: # Redireciona uma nica porta para um micro da rede local. echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 22 -j DNAT --to 192.168.1.10 iptables -t nat -A POSTROUTING -d 192.168.1.10 -j SNAT --to 192.168.1.1 possvel ainda indicar uma lista de portas (usando a opo -m multiport), como em: # Redireciona um conjunto de portas echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A PREROUTING -p tcp -i eth1 -m multiport --dport 21,22,80 -j DNAT --to-dest 192.168.1.10 iptables -t nat -A POSTROUTING -d 192.168.1.10 -j SNAT --to 192.168.1.1 15 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

Note que, nos trs exemplos, usei o parmetro "-p tcp". Embora necessrio, ele faz com que a regra se aplique apenas a portas TCP. Caso voc precise fazer forwarding de portas UDP, deve alterar o protocolo dentro da regra, como em: # Redireciona uma porta UDP echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A PREROUTING -p udp -i eth1 --dport 53 -j DNAT --to 192.168.1.10 iptables -t nat -A POSTROUTING -d 192.168.1.10 -j SNAT --to 192.168.1.1 Bloqueando portas de sada: Mais um uso importante para o firewall bloquear portas de sada, ou seja, bloquear portas no sentido rede local > Internet. Isso permite bloquear o uso de determinados programas que utilizem estas portas. O MSN, por exemplo, utiliza originalmente a porta 1863. Nas verses recentes ele capaz de se conectar tambm atravs da porta 80 (ou atravs de sites como o meebo.com, que permitem acessar o MSN diretamente atravs do navegador). Por isso, ao bloquear a porta 1863, os clientes podem continuar conseguindo se conectar, porm, voc obriga o trfego a passar pela porta 80, onde tem a chance de faz-lo passar por um servidor Squid, configurado como proxy transparente. Isso permite logar os acessos ou sabotar o sistema de autenticao do MSN, bloqueando os domnios "messenger.hotmail.com" e "webmessenger.msn.com", alm de outros sites que ofeream clientes via web. Hoje em dia, cada vez mais programas so capazes de acessar a Web atravs da porta 80, 443 ou via proxy, o que torna difcil bloque-los. Em muitos casos, preciso usar uma combinao de portas fechadas no firewall, bloqueio a endereos IPs especficos e bloqueio de determinados domnios no Squid. Ao criar as regras do Iptables, existem duas opes. Bloqueando a porta para "FORWARD", voc impede o acesso a partir dos micros da rede local, que acessam atravs da conexo compartilhada pelo servidor. Bloqueando para "OUTPUT", a porta bloqueada no prprio micro onde o firewall est ativo. Voc pode bloquear as duas situaes, duplicando a regra: iptables -A OUTPUT -p tcp --dport 1863 -j REJECT iptables -A FORWARD -p tcp --dport 1863 -j REJECT Voc pode ainda bloquear intervalos de portas, separando-as por ":", como em: iptables -A FORWARD -p tcp --dport 1025:65536 -j REJECT Como estamos criando regras para os micros da rede local e no para possveis invasores provenientes da Internet, aconselhvel usar a regra "REJECT" ao invs de 16 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

"DROP". Caso contrrio, os programas nos clientes sempre ficaro muito tempo parados ao tentar acessar portas bloqueadas, o que vai gerar reclamaes e um certo overhead de suporte. Voc pode descobrir facilmente quais portas de sada so utilizados por cada programa fazendo buscas no Google, mas tentar bloquear um a um todos os programas indesejados acaba sendo tedioso. Ao invs disso, voc pode experimentar um soluo mais radical: inverter a lgica da regra, bloqueando todas as portas de sada e abrindo apenas algumas portas "permitidas". O mnimo que voc precisa abrir neste caso so as portas 80 e 53 (DNS). A partir da, voc pode abrir mais portas, como a 25 (SMTP), 110 (POP3), 443 (HTTPS) e assim por diante. Um exemplo de configurao neste caso seria: iptables -A FORWARD -p udp -i eth0 --dport 53 -j ACCEPT iptables -A FORWARD -p tcp -i eth0 --dport 80 -j ACCEPT iptables -A FORWARD -p tcp -i eth0 --dport 443 -j ACCEPT iptables -A FORWARD -p tcp -i eth0 -j LOG iptables -A FORWARD -p tcp -i eth0 -j REJECT Veja que todas as regras especificam a interface da rede local (eth0 no exemplo), de onde sero recebidas as conexes dos clientes. Note que no inclu nenhum bloqueio para forwarding de pacotes provenientes da interface eth1 (da Internet), pois a idia bloquear diretamente as requisies dos clientes, e no as respostas. Em uma conexo TCP tpica, o cliente envia a requisio na porta TCP usada pelo servio, mas recebe a resposta em uma porta aleatria. Este um exemplo de entrada no log do Iptables que mostra a resposta a uma conexo HTTP normal. Veja que ela est endereada porta 45159 do cliente: IN=eth1 OUT=eth0 SRC=64.233.169.99 DST=192.168.0.10 LEN=40 TOS=0x00 PREC=0x00 TTL=239 ID=36813 PROTO=TCP SPT=80 DPT=45159 WINDOW=8190 RES=0x00 ACK FIN URGP=0 No caso da porta 53 (DNS), estou especificando o protocolo UDP ao invs de TCP, pois as requisies so feitas usando portas UDP para ganhar tempo. Embora os servidores DNS escutem tanto na porta 53 TCP, quanto UDP, a porta 53 TCP utilizada apenas para transferncia de zonas e no para resoluo de nomes, j que ao usar UDP o tempo de resposta menor. No UDP a requisio simplesmente respondida da forma mais rpida possvel, enquanto que no TCP necessrio abrir e encerrar a conexo. A regra "iptables -A FORWARD -j LOG" uma boa opo durante a fase de testes, pois ela faz com que o Iptables logue todos os pacotes que forem encaminhados (tanto envio, quanto resposta), permitindo que voc verifique o que est ocorrendo quando 17 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

algo no estiver funcionando. Voc pode acompanhar o log usando o comando "dmesg". Colocado nesta posio (depois das regras que autorizam as conexes nas portas 53 e 80), ele vai mostrar apenas as requisies bloqueadas pelo firewall, dando-lhe a chance de acompanhar os acessos dos clientes e permitir portas adicionais sempre que necessrio. Por exemplo, esta estrada (no log) mostra uma tentativa de conexo de um cliente MSN rodando no micro "192.168.1.10" que foi bloqueada pelo firewall: IN=eth0 OUT=eth1 SRC=192.168.1.10 DST=207.46.28.77 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=21328 DF PROTO=TCP SPT=38119 DPT=1863 WINDOW=5840 RES=0x00 SYN URGP=0 A opo "DTP" indica a porta usada. Se quisesse autorizar o uso do programa, voc adicionaria a regra "iptables -A FORWARD -p tcp -i eth1 --dport 1863 -j ACCEPT" em seu script. Outra opo, para no precisar abrir tantas portas e ter um melhor controle sobre o trfego de sada usar um servidor Squid configurado como proxy transparente (interceptando o trfego da porta 80) e rodar servidores locais para DNS e e-mail (voc pode configurar um servidor Postfix como sistema satlite, de forma que ele envie os emails dos usurios da rede usando o SMTP do provedor), de forma que qualquer acesso precise necessariamente passar por algum dos servios ativos no servidor, sujeito a log e aos bloqueios que configurar. Neste caso, desabilite o compartilhamento da conexo (ou bloqueie o forward de todas as portas) e configure os clientes para utilizarem o IP do servidor como DNS, servidor SMTP, POP e outros servios que tenha ativado. Mesmo ao ser configurado como proxy transparente, o Squid continua funcionando como um proxy tradicional, atravs da porta 3128. Voc pode configurar clientes de FTP e outros programas com suporte a proxy para acessarem atravs dele. A vantagem sobre o acesso direto que ao passar pelo proxy, tudo fica registrado e todo acesso precisa passar pelos filtros de domnios, formatos de arquivos, limitao de banda, etc. definidos por voc. Complementando o bloqueio de portas, voc pode tambm bloquear o acesso de determinados endereos IP, como em: # Bloqueia o acesso web a partir de um determinado IP iptables -A FORWARD -p tcp -s 192.168.1.67 -j REJECT Esta regra deve ir logo no incio do script, antes das regras que abrem as portas de sada, caso contrrio no surtir efeito. Lembre-se de que o Iptables processa as regras seqencialmente: se uma compartilha a conexo com todos os micros da rede, no adianta tentar bloquear para determinados endereos depois. As regras com as excees devem sempre vir antes da regra mais geral. 18 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

Bloqueando domnios: possvel ainda bloquear ou permitir com base no domnio, tanto para entrada quanto sada. Isso permite bloquear sites e programas diretamente a partir do firewall, sem precisar instalar um servidor Squid e configur-lo como proxy transparente. Nesse caso, usamos o parmetro "-d" (destiny) do Iptables, seguido do domnio desejado. Para bloquear os acessos ao Orkut, por exemplo, voc usaria as regras: iptables -A OUTPUT -d www.orkut.com -j REJECT iptables -A FORWARD -d www.orkut.com -j REJECT A primeira linha bloqueia pacotes de sada destinados ao domnio, ou seja, impede que ele seja acessado a partir da prpria mquina local. A segunda linha bloqueia o forward de pacotes destinados a ele (domnio), ou seja, impede que outras mquinas da rede local, que acessam atravs de uma conexo compartilhada, acessem o domnio. Se for paranico, voc pode usar tambm a regra: iptables -A INPUT -s www.orkut.com -j DROP Esta regra impede tambm que qualquer pacote proveniente do orkut.com chegue at a sua mquina. Como disse, apenas para paranicos. ;) Originalmente, o Iptables sabia trabalhar apenas com endereos IP. A possibilidade de criar regras baseadas em domnios um recurso um pouco mais recente, onde o firewall faz um lookup do domnio, de forma a descobrir qual o IP atual e assim poder bloque-lo. Voc pode verificar o IP usado pelo servidor de um determinado domnio usando o comando "dig" (que no Debian faz parte do pacote "dnsutiuls"), como em: $ dig orkut.com A vantagem de criar as regras do firewall baseadas em domnios que elas so automaticamente atualizadas caso o servidor do site mude de endereo. Ao bloquear o "orkut.com" no Iptables, voc automaticamente bloqueia o "www.orkut.com" ou qualquer outra variante do domnio que leve ao mesmo servidor. A principal limitao que a regra no se aplica a subdomnios hospedados em diferentes servidores. Por exemplo, voc pode bloquear o domnio "uol.com.br", mas isso no bloquear o "tvuol.uol.com.br", que hospedado em um servidor separado. Em casos como este, a nica soluo bloquear ambos. Assim como no caso do Squid, ao decidir bloquear o acesso a sites ou endereos diversos utilizando o Iptables, voc vai logo acabar com uma lista relativamente grande de endereos a bloquear. Diferente do Squid, o Iptables no oferece uma opo para carregar a lista dos endereos que devem ser bloqueados a partir de um arquivo de texto, mas isso pode ser resolvido com um script simples, que leia o contedo do arquivo e gere as regras correspondentes. 19 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

Comece criando um arquivo de texto contendo os domnios ou endereos IP que deseja bloquear, um por linha, como em: www.orkut.com www.myspace.com www.facebook.com Em seguida, adicione esta funo no incio do seu script de firewall, especificando o arquivo de texto com os endereos: for end in `cat /etc/bloqueados` do iptables -A OUTPUT -d $end -j REJECT iptables -A FORWARD -d $end -j REJECT done Esta funo usa o comando cat para ler o contedo do arquivo, gerando um par de regras do Iptables para cada um deles. O lao continua at gerar regras para todos os endereos includos no arquivo.

Capitulo 3
Na primeira parte do tutorial, geramos um script de firewall simples, destinado a compartilhar a conexo e bloquear as conexes de entrada. Na segunda parte, estudamos o uso de regras adicionais, destinadas ao uso em um servidor de rede local, configurado como gateway da rede. Nessa terceira e ltima parte, estudaremos sobre a configurao do firewall em servidores de Internet. Ao configurar um servidor dedicado, o firewall ainda mais importante, j que por possuir no apenas um endereo IP fixo, mas tambm ser acessvel atravs de um domnio potencialmente bem conhecido, o servidor ser alvo de ataques contnuos. Por um lado, a configurao mais simples, j que voc no precisar se preocupar com regras de roteamento e de encaminhamento de pacotes, como ao configurar o firewall do gateway da rede, mas, por outro, existe um conjunto de cuidados adicionais a tomar.

20 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

Um exemplo bsico de script de firewall para uso em um servidor web seria: #!/bin/bash iniciar(){ # Abre para a interface de loopback: iptables -A INPUT -p tcp -i lo -j ACCEPT # Bloqueia um determinado IP. Use para bloquear hosts especficos: #iptables -A INPUT -p ALL -s 88.191.79.206 -j DROP # Abre as portas referentes aos servios usados: # SSH: iptables -A INPUT -p tcp --dport 22 -j ACCEPT # DNS: iptables -A INPUT -p tcp --dport 53 -j ACCEPT iptables -A INPUT -p udp --dport 53 -j ACCEPT # HTTP e HTTPS: iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT # Bloqueia conexes nas demais portas: iptables -A INPUT -p tcp --syn -j DROP # Garante que o firewall permitir pacotes de conexes j iniciadas: iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Bloqueia as portas UDP de 0 a 1023 (com exceo das abertas acima): iptables -A INPUT -p udp --dport 0:1023 -j DROP } parar(){ iptables -F iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT } case "$1" in "start") iniciar ;; "stop") parar ;; "restart") parar; iniciar ;; *) echo "Use os parmetros start ou stop" esac

21 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

Se voc est configurando um servidor dedicado remotamente, importante que voc teste o script antes de configurar o sistema para execut-lo automaticamente durante o boot. O motivo simples: se houver alguma regra incorreta no script, que bloqueie seu acesso ao servidor, voc poder solicitar um reboot do servidor para que a configurao seja removida e voc recupere o acesso. Entretanto, se o sistema for configurado para carregar o script durante o boot, o reboot no resolver e voc precisar abrir uma chamada de suporte, solicitando que um tcnico se logue localmente no servidor e desative seu script (o que provavelmente resultar em uma taxa adicional). Para evitar a possibilidade de precisar reiniciar o servidor para recuperar o acesso depois de uma configurao de firewall mal-sucedida, voc pode usar um script simples, contendo as regras de firewall desejadas, seguidas de um sleep e comandos para limpar a configurao do firewall. Presumindo que voc no esteja usando regras de roteamento (da tabela NAT), um exemplo de bloco de comandos para incluir no final do script seria: sleep 120 iptables -F iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -X J conhecemos o "iptables -F", que limpa as regras do firewall. As opes "iptables -P INPUT ACCEPT" e "iptables -P OUTPUT ACCEPT" alteram a poltica padro do firewall (caso por ventura ela tenha sido alterada anteriormente), fazendo com que ele reverta para o default, que aceitar todos os pacotes, tanto de entrada quanto de sada. O "iptables -X" elimina qualquer tabela personalizada que tenha sido adicionada, garantindo que qualquer regra oculta de configurao seja eliminada. O "sleep 120" um contador, que faz com que o sistema espere dois minutos antes de continuar. Colocando os comandos no final do script de firewall, o sistema executaria os comandos que ativam o firewall, esperaria dois minutos e em seguida executaria os comandos que o desativam. Com isso, as regras so desativadas automaticamente depois de alguns minutos; se voc acabar trancado do lado de fora, vai precisar apenas esperar o tempo especificado e se conectar novamente. S depois de testar o script e ter certeza de que ele est mesmo fazendo apenas o que deseja, voc removeria os comandos de desativao e configuraria o sistema para ativ-lo automaticamente durante o boot. Regras adicionais de segurana: Em um servidor dedicado, no faz muito sentido bloquear a resposta a pings, j que, de qualquer forma, ele precisar ficar com um conjunto de portas abertas. Ao invs de bloquear os pings, que afinal podem ser teis em algumas situaes, voc pode limitar as respostas a apenas uma por segundo, evitando que algum de m f possa enviar um grande volume de pings (como ao usar o comando "ping -f"), como parte de um ataque DoS. Nesse caso, a regra seria: 22 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT Se seu servidor no ir atuar como um roteador, prudente desativar o suporte a ICMP redirects. Este um recurso utilizado por roteadores para alertar outros de que existe um melhor caminho para um determinado endereo ou rede, mas no tem uso legtimo em um servidor que no roteia pacotes: echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects Outra configurao desejada desativar o suporte a ping broadcasts, um recurso que tem poucos usos legtimos e pode ser usado para fazer com que servidores participem involuntariamente de ataques DoS, enviando grandes quantidades de pings a outros servidores dentro da mesma faixa de endereos. Ele j vem desativado em quase todas as distribuies atuais, mas no custa verificar: echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts Mais uma opo que importante manter desativada o suporte ao source routing. Este um recurso usado para testes de roteadores, que permite ao emissor especificar qual o caminho que o pacote tomar at o destino e tambm o caminho de volta. Ele perigoso, pois permite falsear pacotes, fazendo com que eles paream vir de outro endereo e, ao mesmo tempo, fazer com que as respostas realmente sejam recebidas, permitindo abrir a conexo e transferir dados. Em outras palavras, se voc incluiu regras que permitem o acesso de terminados endereos e esqueceu o suporte ao source routing ativo, um atacante que soubesse quais so os endereos autorizados poderia abrir conexes com o seu servidor se fazendo passar por um deles, um risco que voc com certeza gostaria de evitar. Como o recurso no possui outros usos legtimos, fortemente recomendvel que voc o mantenha desativado: echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route Diferente do servidor de rede local que compartilha a conexo, o servidor no dever compartilhar a conexo, nem encaminhar pacotes de outros hosts. Voc pode deixar isso explicito desativando o suporte a ip_forward: echo 0 > /proc/sys/net/ipv4/ip_forward Concluindo, temos o suporte a SYN cookies. Um dos tipos mais comuns de ataque DoS e tambm um dos mais efetivos o SYN Flood. Este tipo de ataque consiste em enviar um grande volume de pacotes SYN at o alvo, sem nunca efetivamente abrir a conexo. Como os pacotes SYN possuem alguns poucos bytes, o ataque pode ser feito mesmo a partir de uma conexo domstica. Uma conexo TCP iniciada atravs da troca de trs pacotes entre o emissor e o destinatrio, o famoso "three-way handshake". O emissor envia um pacote SYN, o destinatrio responde com um pacote SYN/ACK e o emissor confirma, tambm enviando um pacote ACK. A conexo TCP fica ento aberta por um certo tempo, at 23 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

que a requisio da pgina, download do arquivo, ou outra operao em questo seja concluda. Se o servidor recebe um pacote SYN solicitando a abertura da conexo, mas no recebe o pacote ACK de resposta, ele obrigado a esperar at que o tempo limite seja atingindo, mantendo a conexo aberta. Como existe um limite de conexes TCP que o servidor pode manter ativas simultaneamente, um grande volume de pacotes SYN podem estourar o limite de conexes, fazendo com que o servidor deixe de responder a novas conexes, mesmo que exista banda disponvel. No Linux, isso pode ser evitado de forma bastante simples, ativando o uso de SYN Cookies, um recurso oferecido diretamente pelo Kernel, o que feito com o comando abaixo, que pode ser includo no seu script de firewall: echo 1 > /proc/sys/net/ipv4/tcp_syncookies Ao ativar o recurso, o sistema passa a responder ao pacote SYN inicial com um cookie, que identifica o cliente. Com isso, o sistema aloca espao para a conexo apenas aps receber o pacote ACK de resposta, tornando o ataque inefetivo. O atacante ainda pode consumir um pouco de banda, obrigando o servidor a enviar um grande volume de SYN Cookies de resposta, mas o efeito sobre o servidor ser mnimo. Concluindo, adicione tambm as regras que ativam o uso do rp_filter, de forma que o firewall sempre responda aos pacotes na mesma interface da qual eles foram originados, o que previne ataques diversos que tentem tirar proveito da regra que permite conexes na interface de loopback. Outra opo interessante o bloqueio de pacotes invlidos, o que tambm melhora a segurana contra ataques diversos, incluindo pacotes enviados sem serem precedidos pelo envio do pacote SYN e da abertura da conexo: echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter iptables -A INPUT -m state --state INVALID -j DROP Juntando tudo, teramos: iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route echo 0 > /proc/sys/net/ipv4/ip_forward echo 1 > /proc/sys/net/ipv4/tcp_syncookies echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter iptables -A INPUT -m state --state INVALID -j DROP Essas regras devem ser adicionadas logo no incio do script, de forma que sejam carregadas antes de qualquer regra que abra portas ou permita o acesso de endereos ou faixa de endereos. Com isso, garantimos que elas sero aplicadas a todas as conexes, reduzindo a quantidade de buracos no firewall. 24 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

Resumo das regras do Iptables: Depois desta rodada de exemplos, nada melhor do que um guia mais detalhado dos parmetros suportados pelo Iptables. Escrever regras de firewall quase como aprender um novo dialeto. Existem muitas combinaes possveis entre os parmetros disponveis e "regras de concordncia", que determinam o que funciona e o que no. Imagine que ao escrever uma nova regra, voc est explicando uma idia. Tente ser claro para que seja entendido ;). Parmetros do Iptables: -A INPUT: Especifica que a regra se aplica a pacotes de entrada, ou seja, pacotes recebidos pelo servidor, em qualquer interface. -A OUTPUT: A regra se aplica a pacotes de sada, transmitidos pelo prprio servidor. -A FORWARD: Este parmetro usado ao compartilhar a conexo com a Internet, permitindo que os micros da rede local acessem atravs do servidor. Os pacotes de outros micros, encaminhados pelo servidor, so tratados como "FORWARD", diferentemente dos pacotes transmitidos pelo prprio servidor, que so tratados como "OUTPUT". Voc pode definir regras diferentes para cada situao. -p tcp: Especifica que a regra se aplica a pacotes TCP, o que o mais comum. -p udp: Alguns servios usam tambm portas UDP. Um bom exemplo so os servidores DNS, que escutam tanto na porta 53 TCP, quanto na 53 UDP. Este parmetro permite definir regras que se aplicam a estes casos, abrindo ou fechando as portas UDP, como em: iptables -A INPUT -p udp --dport 53 -j ACCEPT A maioria das regras do Iptables exigem que voc especifique o protocolo, fazendo com que voc tenha que repetir a regra caso queira abrir uma porta simultaneamente para TCP e UDP. Ao executar algo como "iptables -A INPUT --dport 53 -j ACCEPT" (sem especificar o protocolo), voc receber um erro como: iptables v1.3.3: Unknown arg `--dport' Try `iptables -h' or 'iptables --help' for more information. Nesses casos, voc pode usar o parmetro "-p ALL", que se aplica simultaneamente aos trs protocolos (TCP, UDP e ICMP), sem que voc precise incluir uma regra separada para cada um, como no exemplo da regra que bloqueia qualquer tipo de conexo proveniente de um determinado endereo: iptables -A INPUT -p ALL -s 88.191.79.206 -j DROP Como as portas UDP tambm so usadas por alguns servios, muito comum bloquear as portas de 0 a 1023 UDP, autorizando apenas as portas que realmente devem ficar abertas, como em: 25 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

iptables -A INPUT -p udp --dport 53 -j ACCEPT iptables -A INPUT -p udp --dport 0:1023 -j DROP Note que voc nunca deve fechar todas as portas UDP, pois as portas altas so usadas aleatoriamente para pacotes de resposta para DNS e diversos outros protocolos. Alguns administradores mais paranicos fecham todas as portas UDP at a 32000, por exemplo. No existem muitos problemas em fechar uma faixa maior de portas, desde que voc sempre deixe uma larga faixa de portas altas abertas, de forma a receber os pacotes de resposta. Ao contrrio do TCP, no possvel criar uma regra genrica para permitir todos os pacotes de resposta UDP (como a "iptables -A INPUT -p tcp --syn -j DROP"), pois no UDP no so abertas conexes. Os pacotes so simplesmente transmitidos diretamente, sem aviso prvio. -p icmp: Alm do TCP e UDP, existe o protocolo ICMP, usado para pacotes de controle, pings e envio de mensagens. Um exemplo de uso a regra para desativar a resposta a pings que vimos h pouco. Na verdade, ela atua bloqueando o pedido de ping antes que ele seja repassado ao sistema: iptables -A INPUT -p icmp --icmp-type echo-request -j DROP -i eth0: A opo "-i" permite definir a interface onde os pacotes devem ser recebidos ou enviados. Por exemplo, usar uma regra como: iptables -A INPUT -p tcp -j REJECT ... simplesmente desconectaria seu micro da rede, pois bloquearia comunicaes em qualquer interface. Porm, se voc especificasse a interface, ele bloquearia apenas pacotes recebidos atravs dela, como em: iptables -A INPUT -i eth2 -p tcp -j REJECT O mesmo se aplica quando voc quer permitir conexes em determinadas portas, mas apenas a partir da placa de rede local. Para permitir conexes via SSH apenas a partir da placa eth0, voc poderia usar: iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT -o eth0: similar ao parmetro "-i", mas especifica uma interface de sada. Este parmetro menos usado, pois normalmente nos preocupamos em impedir que o firewall aceite conexes em determinadas portas, em vez de tentar interceptar as respostas. Entretanto, esta opo pode ser til em casos em que voc precisa fechar uma porta de sada apenas para determinada interface. Este um exemplo de uso, onde bloqueio pacotes de sada na porta 1863 apenas para a placa eth1: iptables -A OUTPUT -p tcp -o eth1 --dport 1863 -j DROP --dport ou --destination-port: Especifica uma porta. O uso mais comum para esta 26 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

opo para abrir portas de entrada (e depois aplicar uma regra que fecha as demais), como na regra que abre para conexes na porta 22, que mostrei no exemplo anterior. -s (source): O parmetro "-s" permite especificar um endereo IP ou domnio de origem, de forma a aceitar ou recusar as conexes. Embora seja muito fcil forjar endereos IP dentro da rede local, as coisas so muito mais complicadas na Internet. Permitir o acesso a determinadas portas (como a do SSH) apenas para determinados endereos, ou faixas de endereos, uma medida de segurana interessante em muitas situaes. Este um exemplo de regra, que abre a porta 631 apenas para hosts dentro da faixa e mscara especificada: iptables -A INPUT -p tcp -s 72.232.35.0/255.255.255.248 --dport 631 -j ACCEPT -d (destiny): Destinado ao endereo IP ou domnio citado. muito usado ao bloquear o acesso a determinados sites a partir dos micros da rede local como, por exemplo: iptables -A FORWARD -d torrentreactor.net -j REJECT -m mac --mac-source 00:11:D8:76:59:2E: Esta a regra que permite especificar endereos MAC dentro de regras do Iptables que vimos h pouco. Ela uma forma de dificultar o uso de endereos IP falseados para ganhar acesso ao servidor, pois permite relacionar o IP ao endereo MAC da placa instalada. Lembre-se, porm, que ela s pode ser usada em rede local e que os endereos MAC so quase to fceis de falsear quanto os endereos IP. Um exemplo de uso seria: iptables -A INPUT --dport 22 -m mac --mac-source 00:11:D8:76:59:2E -j ACCEPT --syn: Cria uma regra vlida apenas para novas conexes, no impedindo que o outro micro responda a conexes iniciadas pelo servidor, como em: iptables -A INPUT -p tcp --syn -j DROP -j: usado no final de cada regra, especificando uma ao, que pode ser: -j ACCEPT : Aceita o pacote. Ele encaminhado ao destino sem passar pelas demais regras. -j REJECT : Rejeita educadamente o pacote, enviando um pacote de resposta ao emissor. Quando uma porta est fechada em modo reject, o emissor recebe rapidamente uma resposta como "connect to host 192.168.1.1 port 22: Connection refused". -j DROP: O DROP mais enftico. O pacote simplesmente descartado, sem aviso. O emissor fica um longo tempo esperando, at que eventualmente recebe um erro de timeout. -j LOG: Este ltimo parmetro permite logar conexes. interessante usar esta regra principalmente em portas muito visadas, como a do SSH, pois assim voc tem uma lista de todos os endereos que acessaram seu servidor na porta especificada. Para ativar o 27 Birigui - 2011

CPD UNIESP Birigui


Administrador e Replicador de Araatuba, Guararapes e Mirandpolis

log, voc deve duplicar a regra que abre a porta, usando a opo "-j LOG" na primeira e "-j ACCEPT" na segunda, como em: iptables -A INPUT -p tcp --dport 22 -j LOG iptables -A INPUT -p tcp --dport 22 -j ACCEPT As mensagens so gravadas no arquivo "/var/log/messages" de forma bastante detalhada, incluindo a data e hora da conexo, o IP e MAC do micro que fez a conexo (SRC), alm da porta (DPT). Voc pode ver o mesmo log, porm com as entradas escritas de forma resumida, usando o comando "dmesg". Jun 29 15:49:46 spartacus kernel: IN=eth0 OUT= MAC=00:e0:7d:9b:f8:01:00:15:00:4b:68:db:08:00 SRC=192.168.1.2 DST=192.168.0.1 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=32704 DF PROTO=TCP SPT=56848 DPT=22 WINDOW=2164 RES=0x00 ACK URGP=0 No se assuste com o volume de informaes, pois o log inclui todas as tentativas de conexo. O fato de um determinado IP ter aberto uma conexo com a porta 22 do seu servidor, no significa que o usurio realmente obteve acesso ao SSH. Ele pode ter recebido o prompt para digitar a senha, mas isso no significa que ele realmente conseguiu fazer login. Note que alterar a ordem das regras altera o resultado. Em caso de duas regras conflitantes, vale a que vem primeiro. Por exemplo, ao usar: iptables -A INPUT -p tcp -j REJECT iptables -A INPUT -p tcp --dport 22 -j ACCEPT ... a porta 22 permanecer fechada, pois os pacotes sero descartados pela primeira regra, sem terem chance de serem autorizados pela segunda. justamente por isso que sempre necessrio colocar as regras menos restritivas primeiro, declarando as portas autorizadas, para s ento fechar as demais. O mesmo se aplica ao logar transmisses. Se voc usar algo como: iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j LOG ... o log no funcionar, pois os pacotes destinados porta 22 sero aceitos pela primeira regra e no passaro pela segunda, que faz o log. As regras que fazem log devem sempre vir antes das regras que autorizam as conexes.

28 Birigui - 2011