Este artigo mostra como configurar de uma maneira simples e segura o iptables no Slackware, cobrindo também os conceitos básicos de sua utilização. Também será disponível um simples script de iptables para liberação de acesso web, msn e ftp pronto para ser iniciado junto com o sistema.
Agora sim! Vamos botar a mão na massa e fazer funcionar o iptables no Slackware! Obaaa!
Entre num terminal, acesse-o como root:
su
Acesse /etc/rc.d:
# cd /etc/rc.d
Crie um arquivo chamado rc.firewall:
# touch rc.firewall
Entre em um editor de sua preferencia (no meu caso o nano) e edite o arquivo criado anteriormente:
# nano rc.firewall
Digite (ou copie, bem melhor ;p) este script:
# Limpando politicas e regras
iptables -X
iptables -F
# Configurando as politicas padroes
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# Configurando portas de entrada
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# Configurando portas de saida
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 1863 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
Agora salve o arquivo. Se estiver no nano seguem abaixo os comandos para salvar e sair:
Ctrl + O
Ctrl + X
E por último será necessário atribuir permissões de execução no script através do chmod:
# chmod +x /etc/rc.d/rc.firewall
Reinicie o servidor agora!
# init 6
Após o reboot, verifique se o script está sendo executado automaticamente entrando em um terminal como root e executando o seguinte comando:
# iptables -L
Será exibida uma tela com todas as políticas e regras aplicadas.
Podemos ver que este script é meio xiita! Estou usando DROP em todas as políticas e liberando apenas o necessário. Porém o que é bacana é saber o que VOCÊ realmente está fazendo e ver como isso funciona.
Vale lembrar que este é um script voltado para uso doméstico, ou seja, apenas libera acesso a web (80, 443), ftp (21) e msn (1863). Entretanto já serve como base de estudos para soluções corporativas (do qual deve-se utilizar regras de NAT (PREROUTING, POSTROUTING, MASQUERADE etc) e também flags de pacote, entre outros.
Espero que tenham gostado!
Qualquer dúvida, crítica e sugestão, por favor, ARREBENTEM NOS COMENTÁRIOS!
[4] Comentário enviado por nfmike31 em 05/10/2010 - 14:36h
Sou leigo ao extremo nesse novo "mundo", mas estou ADORANDO!!!! Fiz o esquema supra citado, mas agora não consigo mais ouvir uma rádio via web aqui, que é a oifm. Alguem me ajuda? Desde já, valeu portudo!!
[5] Comentário enviado por claudiojoliveira em 05/10/2010 - 16:24h
Boa tarde.
Sou iniciante em iptables e estou usando Slackware com Xfce, já tentei instalar o Firestater mas não funcionou, então decidi encarar de frente o iptables.
Estou em dúvida nessas dua linhas abaixo, gostaria que alguém, se possível, comentassem.
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Outra coisa, a linha abaixo bloqueia o ping externo mas deixa pingar do local, será que posso substituir as duas linhas deste script referente a ping por esta?
iptables -A FORWARD -o eth0 -p icmp -j ACCEPT
Abraços a todos e Viva o Linux.
[6] Comentário enviado por claudiojoliveira em 05/10/2010 - 16:41h
Boa tarde nfmike31.
Tenta abrir sua rádio online preferida e fica de olho no endereço que ela está tentando abrir, neste mesmo endereço vai aparecer a porta que a rádio usa, fica logo após os : (dois pontos).
Exemplo:
Eu escuto muito a Rádio Kiss FM de São Paulo, observa o endereço dela abaixo:
(http://75.126.86.2:8098/)
Você pode notar que ela usa a porta 8098, logo adiciona esta regra em seu script:
iptables -A OUTPUT -p tcp --dport 8098 -j ACCEPT
Eu uso o mplayerplug-in-3.55-i486-1 para ouvir a Kiss através do firefox.
Tenta aí, depois vc escreve se conseguiu!
Abraços.
[7] Comentário enviado por nfmike31 em 05/10/2010 - 17:53h
Muito boa tarde, Claudio! Valeu pelas dicas! bom... só a minha ignorância é que não ajuda muito! :( Não consegui descobrir qual porta o site em questão usa. Usei ping, netstat -na, mas com esses comandos só consegui encontrar o IP. Será que eu devo desativar tudo para conseguir essas informações? Também uso o firefox, porém sem o uso do mplayerplug-in-3.55-i486-1. Fui procurá-lo em ftp://ftp.slackware-brasil.com.br/ e adivinha? Sem conexão com o site! Fico no aguardo de mais ajuda. Abraço.
[8] Comentário enviado por gambin.br em 05/10/2010 - 19:26h
Olá pessoal!
Primeiramente gostaria de agradecer aos comentários e também a todos que estão colaborando positivamente com a melhoria do artigo!! Vamos agora a algumas considerações:
@ladiv - realmente, há um erro no artigo. Não contrariando o mundo Linux, os parametros do iptables são CaseSensitives, portando o nome das tabelas devem ser escritos em minusculo. Não sei como funciona aqui no VOL, mas vou ver se é possível editar o arquivo! Valeu!
@nfmike31 - sobre as rádios online realmente é provável que voce esteja sendo bloqueado pela política DROP no OUTPUT. Para liberá-la, há duas maneiras. Ou voce descobre o protocolo (tcp/udp) utilizado pela rádio e suas portas de comunicações, ou voce configura a política OUTPUT como ACCEPT. Mas acredito que a maioris aceite muito mais a segunda sugestão (ok, com segurança sou meio xiita...). A dica do @claudiojoliveira é boa também
@claudiojoliveira - Sobre os comandos é o seguinte:
[iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT] - este é responsável para que voce consiga dar um echo reply em tentativas de ping. No output temos a liberação do echo request (ping) e no output liberamos o echo reply ("pong").Já o seguinte:
[iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT] - pelo meu entendimento do iptables, este é responsável por aceitar as conexões de entrada já iniciadas à partir da maquina.
Sobre o [iptables -A FORWARD -o eth0 -p icmp -j ACCEPT] creio que poderia ser feito sem problemas, desde que trocado o "-o" por "-i".
[9] Comentário enviado por ---Anonymous--- em 12/10/2010 - 22:03h
Cara, ficou muito da hora, estou quebrando a minha cabeça sobre o iptables, ainda não tenho ideia de quando eu tenho que usar devidas tabelas e chains. Mas seu artigo deu uma clareada firmeza, valeu cara. Você é hacker ??
[10] Comentário enviado por gambin.br em 12/10/2010 - 22:35h
@---Anonymous---: ainda bem que gostou do artigo! Pretendo contribuir com mais algumas coisas bacanas em breve!
Sobre as tabelas se for apenas para liberação de input/output, voce utilizará basicamente a tabela filter.
Já as tabelas NAT e MANGLE geralmente são utilizadas quando o servidor/desktop que roda o iptables também atua como router/proxy para compartilhamento de conexão. Sobre as chains são basicamente o seguinte:
INPUT: tudo que corresponde a entrada em sua maquina. Por exemplo, se voce hospeda um webserver nesta maquina voce precisa liberar por padrão o INPUT para a porta 80 nesta maquina, que é a porta de entrada de acesso externo web.
OUTPUT: é o contrário do INPUT, ou seja, tudo que sai à partir da maquina. Se voce deseja que a maquina rodando iptables não tenha nenhum acesso externo, basta dar um DROP em todas as políticas/regras.
FORWARD: corresponde tudo que chegar ou sair da maquina destino (do qual não seja o host do iptables, e sim alguma maquina do qual ele tenha acesso), sendo que neste caso o iptables provavelmente estará atuando como router.
Voce poderá encontrar maiores detalhes nos seguintes links:
[11] Comentário enviado por femars em 17/03/2011 - 09:39h
Sobre essa parte:
# Configurando as politicas padroes
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
No caso da máquina em questão estiver conectada diretamente na internet, e com a rede eth1, conectada na rede local, então o servidor ficaria bloquiado tb na rede local ?! caso houver algum compartilhamento (tipo samba). Então não seria mais correto especificar esses bloqueios na eth0? Onde estaria apenas a internet? e liberando a eth1 pra local?
[12] Comentário enviado por gambin.br em 17/03/2011 - 10:28h
Olá @femars
O exemplo deste tutorial é para uso doméstico, que geralmente possui no máximo duas interfaces (cabeada / wireless) que compartilham das mesmas regras.
No caso de servidor, seria necessário implementar regras de liberação específicas para cada interfaces, pois a política no final das contas está fazendo um DROP para TODAS as interfaces. Neste caso pode ser feito da seguinte maneira:
# Liberando acesso externo à porta 80 na eth0
iptables -A INPUT -p tcp --dport 80 -i eth0 -j ACCEPT
# Liberando acesso à internet na eth1
iptables -A OUTPUT -p tcp --dport 80 -i eth1 -j ACCEPT
Em todo caso a política é interessante, pois caso nenhuma regra seja aplicada o DROP é automático, aumentando sua segurança.
[15] Comentário enviado por gambin.br em 30/07/2013 - 11:53h
Olá @messiah
Esta linha serve apenas para 'liberar' seu localhost, caso utilize algum sistema que referencie a interface local.
Essencial para desenvolvedores web :D
[16] Comentário enviado por messiah em 30/07/2013 - 14:55h
Obrigado @gambin.br. Eu tenho outra dúvida:
Para acessar a internet na minha universidade eu adicionei os seguitnes elementos no script:
iptables -A OUTPUT -p tcp --dport 3128 -j ACCEPT
iptables -A INPUT -p tcp --dport 3129 -j ACCEPT
Funcionou, mas ficou lento. Portanto gostaria de saber se está é realmente uma ação segura.
Me surgiu uma ideia: aqui na universidade é bloqueado o download de Torrent, mas seria possível utilizar alguma políticam talvez com redirecionamento, para fazer com que todo o trafego passe pela porta 3128?
[17] Comentário enviado por shady157 em 05/09/2014 - 18:16h
amigo, gostaria de uma luz pra DROP em pacotes suspeitos de dos;ddos... de qualquer ip da internet. Não sei como fazer isso, talvez algum parametro que faça ele entender que estão tentando derrubar a conexao?
[18] Comentário enviado por fernandohlmaia em 10/06/2017 - 13:54h
Olá.
Sou iniciante. Li o artigo mas não consegui resolver meu problema.
Errei a senha por ssh algumas vezes e meu ip ficou bloqueado no iptables.
Qual comando uso para desbloquear? Já tentei alguns não deu certo.
Grato.