http://wwwvivaolinuxcombr/artigos/impressoraphp?codig 1 de 12 19-06-2012 17:42 Desvendando as regras de Firewall Linux Iptables Autor: Armando Martins de Souza <armandomartinssouza at gmailcom> Data: 12/04/2010 Iptables / firewall / tabelas básicas Iptables O funcionamento do firewall é basicamente o seguinte: 1 Os pacotes que chegam ao firewall são filtrados através das regras que foram definidas 2 Roteamento interno (dentro do kernel) Com base no destino do pacote, ele é encaminhado para o "filtro" (chain) apropriado ao roteamento Explicaremos mais adiante cada um dos filtros "básicos" do iptables Firewall Antes de iniciarmos o detalhamento das chains, iremos mostrar a relação entre firewall e kernel Linux 1 2 3 Ifwadm --> kernel 20 Ipchains --> Kernel 22 Iptables --> A partir do kernel 24 É importante deixar claro que neste tutorial trabalharemos apenas com o firewall iptables As tabelas básicas Filter É composta de 3 chains: INPUT, OUTPUT e FORWARD É a tabela default, isto significa que quando não referenciamos nenhuma chain no comando iptables, a chain filter é chamada É
http://wwwvivaolinuxcombr/artigos/impressoraphp?codig 2 de 12 19-06-2012 17:42 importante deixar claro que essa chain trata do tráfego normal de dados, isto significa que não há nenhum tipo de mascaramento (NAT) nela Nat É quando temos que mascarar algum endereço IP ou rede O Nat acontece tanto da rede externa (Internet), para a rede interna (Lan), quanto da Lan para Internet A tabela "Nat" é composta pelas chains: PREROUTING, OUTPUT e POSTROUTING Mangle Basicamente utilizada para fazer QoS Não trataremos desse assunto neste tutorial A seguir ilustramos as tabelas com suas respectivas chains Temos abaixo uma representação visual do posicionamento das chains em relação a passagem dos pacotes de dados da tabela "FILTER" Agora vamos explicar o funcionamento de cada uma das chains descritas acima: INPUT (Pacotes de Entrada) --> Os pacotes são encaminhados para esta chain quando a origem não é o firewall, mas o destino é o firewall FORWARD (Pacotes de Passagem) --> No caso da FORWARD os encaminhamentos são feitos quando a origem não é o firewall e o destino também não é o firewall Isto é, o pacote de dados esta apenas passando pelo firewall OUTPUT (Pacotes de Saída) --> Chain responsável pelos pacotes que tem origem no firewall e destino não firewall
http://wwwvivaolinuxcombr/artigos/impressoraphp?codig 3 de 12 19-06-2012 17:42 A tabela filter só pode tratar do que passa ou não passa Políticas de acesso / DROP e REJECT Políticas de acesso No que se refere a políticas de acesso temos ACCEPT e DROP ACCEPT --> passa tudo, para que o pacote seja bloqueado temos que ter inserido um comando dizendo que pacotes com aquelas características devem ser bloqueados DROP --> É exatamente o inverso do ACCEPT Bloqueia tudo, deixando passar somente os pacotes que batem exatamente com as características passadas pelo comando de liberação Normalmente usamos o critério de bloquear tudo, liberando apenas o que tem que passar, isso tem inúmeras vantagens Podemos citar por exemplo: evitar o trafego na rede desnecessário, deixar portas abertas sem necessidade, impedindo com isso a possibilidade que uma falha de segurança seja utilizada por um indivíduo mau intencionado Exemplos de mudança de política:
http://wwwvivaolinuxcombr/artigos/impressoraphp?codig 4 de 12 19-06-2012 17:42 iptables -t <tabela> -P <chain> -j ACCEPT/DROP Vamos mudar todas as chains da tabela "filter" para DROP: # iptables -t filter -P INPUT DROP # iptables -P FORWARD DROP # iptables -t filter -P OUTPUT DROP Reparem que em um dos exemplos não especifiquei qual tabela estou usando (iptables -P FORWARD DROP), isso porque a tabela filter não precisa ser referenciada, pois ela é a tabela padrão do iptables Para colocarmos as políticas das chains novamente para ACCEPT, basta substituirmos o "DROP" por "ACCEPT" # iptables -t filter -P INPUT ACCEPT # iptables -P FORWARD ACCEPT # iptables -t filter -P OUTPUT ACCEPT DROP e REJECT Muitas pessoas acham que o "DROP" tem a mesma funcionalidade do "REJECT", contudo há uma sutil diferença No DROP o pacote é sumariamente bloqueado não dando a mínima importância para o pacote enviado, ele apenas o ignora Já no caso do REJECT é enviado um pacote de retorno informando que o pacote foi rejeitado Só para ficar bem claro segue abaixo uma suposta comunicação entre uma maquina que denominamos como host A enviando pacotes para uma outra maquina chamada host B Quando o host A envia um pacote para o host B e a política de iptables dele esta em DROP, o host A não recebe nenhum pacote de retorno Isso faz com que o host A não consiga ver o host B, tornando com isso o host B inacessível No REJECT, a máquina envia uma mensagem de retorno do pacote Nesse caso existe a comunicação entre os hosts e o host A saberá que o host B recebeu seu pacote e o rejeitou
http://wwwvivaolinuxcombr/artigos/impressoraphp?codig 5 de 12 19-06-2012 17:42 Exemplos: Para deixar o host B inacessível para o mundo, basta mudar a política da tabela de ACCEPT para DROP # iptables -P INPUT DROP Sintaxe iptables e suas opções A seguir mostraremos a sintaxe iptables e suas opções, tratando somente pacotes de dados da tabela filter, criando regras para liberar, bloquear ou rejeitar os pacotes de dados de trafego normal, sem a utilização de mascaramento (tabela NAT) Sintaxe: iptables -t [tabela] <ordem> <chain> [condições] -j <ação> Tabela: Nesse caso estamos tratando da tabela filter, como já falamos anteriormente, esta tabela é a padrão e não é necessário explicitá-la Ordem: a -I --> Insere a regra no início da chain b -A --> Insere a regra no final da chain PS: O chain é analisada da primeira regra para a última, isso quer dizer que a analise da regra é feita do inicio da chain para o final, essa análise se segue até encontrar uma regra se enquadre ao pacote Ao localizar essa regra ele entra e é processado, deixando as regras subsequentes sem serem analisadas Por isso é importante tratar as regras da mais restritiva para a menos restritiva Abaixo colocamos 3 regras, a primeira regra coloca a política da chain INPUT como DROP, isso quer dizer que só passa um pacote se ele estiver explicito em uma regra A segunda regra libera acesso a porta 22 para a rede 10000/24 e a terceira libera acesso do host 100049 a porta 22 do host Exemplo: # iptables -P INPUT DROP # iptables -A INPUT -p tcp -s 10000/24 --dport 22 -j ACCEPT # iptables -A INPUT -p tcp -s 100049 --dport 22 -j ACCEPT No exemplo acima a terceira regra nunca fará match (nenhum pacote irá utilizá-la), pois a segunda regra fará match (regra mais genérica) caso o host de IP 100049 tente acessar o host na porta 22
http://wwwvivaolinuxcombr/artigos/impressoraphp?codig 6 de 12 19-06-2012 17:42 Chain: Iremos dizer a que chain a regra se refere (INPUT, OUTPUT, FORWARD) Condição (match): -p = protocolo (all, tcp, udp, icmp etc) --sport = porta origem --dport = porta destino -s = IP origem -d = IP destino -i = interface de entrada -o = interface de saída -m = match Ação: É onde informamos o que devemos fazer com o pacote, ignorar (DROP), aceitar (ACCEPT) ou rejeitar (REJECT) Abaixo colocamos alguns exemplos de regras: Bloquear o protocolo icmp (ping): # iptables -A INPUT -p icmp --icmp-type ping -j DROP Só vai liberar o acesso via ssh para o host 103411, avisando que o pacote foi rejeitado para os outros hosts: # iptables -A INPUT -p tcp --dport 22 -s! 103411 -j REJECT PS: O símbolo de "!" significa uma exceção a regra Em nosso exemplo ele esta tratando o host de IP 103411 como exceção a regra Isso quer dizer que o único host que pode acessar o "firewall" é o 103411 A regra irá rejeitas qualquer outro host Só vai liberar o protocolo icmp (ping) para o host 103110 Ignorando o ping para qualquer
http://wwwvivaolinuxcombr/artigos/impressoraphp?codig 7 de 12 19-06-2012 17:42 outro host: # iptables -A INPUT -p icmp --icmp-type ping -s! 103110 -j DROP Exemplo de liberação do smtp (tcp 25) e-mail, impedir que um servidor de e-mail interno envie e-mail para fora da empresa Normalmente isso evita que spammers, que por algum motivo tenham conseguido "acesso" a um de seus servidores, instale um servidor de e-mail e o utilize para enviar spam # iptables -A FORWARD -i eth1 -o eth0 -p tcp --dport 25 -j REJECT Essa regra se traduz em: os pacotes tcp que tiverem vierem através da interface eth1 e destino de saída a eth0 porta 25 deverão ser rejeitados No caso de duas redes: Basta incluir as interfaces referentes a segunda rede: # iptables -A FORWARD -i eth1 -o eth0 -p tcp --dport 25 -j REJECT # iptables -A FORWARD -i eth2 -o eth0 -p tcp --dport 25 -j REJECT Bloquear acesso através do endereço físico da placa de rede (MAC): # iptables -A FORWARD -m mac --mac-source 00:00:AA:BB:11:12 -p tcp --dport 80 -j DROP Se você tem alguma dúvida para saber o endereço MAC do host basta seguir o seguinte procedimento: dar um ping IP que você precisa saber o MAC e depois o dar comando o "arp"
http://wwwvivaolinuxcombr/artigos/impressoraphp?codig 8 de 12 19-06-2012 17:42 Match (condição) OUTPUT: Não deixa o host acessar a porta 80: # iptables -A OUTPUT -p tcp --dport 80 -j REJECT Libera somente o superuser (root) para fazer testes via icmp (ping): # iptables -A OUTPUT -p icmp --icmp-type ping -m owner! --uid-owner root -j REJECT Esses foram alguns exemplos do que podemos fazer com o iptables, no que se refere aos pacotes de dados de tráfego normal (sem utilização de mascaramento - NAT) Ainda existem inúmeras formas de filtrarmos os pacotes, contudo são formas mais pontuais, normalmente não utilizaremos nada a mais que essas para esse tipo de filtro NAT - Network Address Translation SNAT - Source NAT (mascaramento de IP) O SNAT é utilizado para que os hosts internos a rede, isto é, endereços IP não válidos na internet, consigam sair para a Internet como se tivessem um endereço válido em sua interface de rede No nosso exemplo vamos imaginar que o host de IP 10315 queira acessar o site Viva o Linux - 17412353162 Quando o pacote chega no host (firewall) é feito o SNAT, isso acontece da seguinte maneira: É criada uma tabela chamada "Connection tracking", onde são gravadas as informações de origem e destino do pacote Isto possibilita o servidor saber quem enviou e para quem foi enviado o pacote que teve seu endereço IP de origem mascarado Abaixo temos a
http://wwwvivaolinuxcombr/artigos/impressoraphp?codig 9 de 12 19-06-2012 17:42 representação de uma comunicação entre dois hosts, onde o IP de origem esta sendo mascarado A seguir mostraremos como é feito o SNAT, para o exemplo acima # iptables -t nat -A POSTROUTING -s 10300/16 -d!10300/16 -j SNAT --to-source 200111 Onde: -s 10300/16 - é a origem -d!10300/16 - "não" 10300/16 é o destino Essa regra de NAT, na realidade SNAT, significa que sempre que a origem for a rede 10300/16 e o destino não for ela mesma, o pacote ira sair para a Internet com o endereço 200111, isto quer dizer que o host que estiver sendo acessado "pensará" que quem está enviando os pacotes é o IP 200111 e não o IP 103xx Se estivermos trabalhando com IP dinâmico na Internet, por exemplo Velox ou Virtua, poderemos utilizar o comando abaixo: # iptables -t nat -A POSTROUTING -s 10300/16 -d!10300/16 -j MASQUERADE PS: O MASQUERADE significa que ele irá mascarar todas as solicitações a rede externa O IP de saída será aquele que estiver ligado diretamente ao gateway default do host (firewall) Via modem, normalmente utilizamos a interface ppp0: # iptables -t nat -A POSTROUTING -i eth0 -o ppp0 -j MASQUERADE
http://wwwvivaolinuxcombr/artigos/impressoraphp?codig 10 de 12 19-06-2012 17:42 DNAT (Destination NAT) No caso do DNAT o mascaramento é feito de forma inversa ao SNAT Ele propicia acessos que tem como origem a Internet e destino um IP interno da sua rede Imaginemos que um host que tem o IP 80888 e quer acessar o servidor web de sua empresa através do IP 201111 Esse endereço IP é na realidade um dos IPs válidos de seu firewall, só que fazermos um DNAT dizendo que quando um pacote tiver destino o IP 201111, ele deverá ser encaminhado o IP 10312 O comando abaixo mostra como ficaria na prática o DNAT acima: # iptables -t nat -A PREROUTING -d 200111 -p tcp --dport 80 -j DNAT --to-destination 10312 Script básico de firewall Agora mostraremos como criar um script de firewall básico Antes de tudo vamos ativar o roteamento via kernel da seguinte maneira: # echo "netipv4ip_forward = 1" >> /etc/sysctlconf # sysctl -p /etc/sysctlconf Pronto, com os comandos acima acabamos de habilitar o roteamento via kernel o que possibilita o encaminhamento dos pacotes de dados de uma rede para outra Muitos administradores habilitam o roteamento diretamente através do script de firewall, contudo eu prefiro fazer isso apenas uma vez
http://wwwvivaolinuxcombr/artigos/impressoraphp?codig 11 de 12 19-06-2012 17:42 Script para firewall: # mkdir /etc/firewall # vi /etc/firewall/firewallsh #!/bin/sh # Mudando as políticas para ACCEPT iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT # Limpando as regras em memória iptables -F -t filter iptables -F -t mangle iptables -F -t nat iptables -X -t filter iptables -X -t mangle iptables -X -t nat iptables -Z -t filter iptables -Z -t mangle iptables -Z -t nat # Libera conexões já estabilizadas iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT # Entre com as regras de PREROUTING (DNAT) # Entre com as regras de POSTROUTING (SNAT) # Entre com as regras de INPUT # Entre com as regras de FORWARD # Entre com as regras de OUTPUT
http://wwwvivaolinuxcombr/artigos/impressoraphp?codig 12 de 12 19-06-2012 17:42 Agora iremos cuidar para que toda vez que o servidor bootar as regras subam de forma automática 1 Criar um link simbólico do arquivo que acabamos de criar para dentro de /etc/initd/: # ln -s /etc/initd/firewall /etc/firewall/firewallsh 2 Vamos ligar o bit de execução do script: # chmod +x /etc/firewall/firewallsh 3 Incluindo o script para inicialização no boot Quando a máquina for rebootada o script será carregado: No Debian GNU/Linux: # update-rcd firewall defaults No SUSE / Red Hat Linux: # chkconfig --add firewall # chkconfig --set firewall on Uma outra forma é salvar as regras que estão na memória para um arquivo Em nosso exemplo utilizaremos o arquivo firewalltxt: # iptables-save > firewalltxt Restaura as configurações da iptables que se encontram no arquivo firewalltxt: # iptables-restore < firewalltxt Com isso terminamos esse artigo que me deu muito prazer em escrever Espero que seja útil para a comunidade Podem mandar perguntas se houver alguma dúvida http://wwwvivaolinuxcombr/artigo/desvendando-as-regras-de-firewall-linux-iptables Voltar para o site