[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: duvida com iptables



On 6/19/07, Clayton Nogueira <clayton.nog@gmail.com> wrote:
 Aí está ele completo, pessoal estou apredendo agora, preciso de
dicas, e também de críticas!!

Já li o capitulo do foca linux de iptables, mas de vez em quando me
enrolo um pouco, acho que me falta prática ;-)


bom lá vai:

#!/bin/bash
#SRV-Firewall Novamarca500
#Interface 2007
#Clayton Nogueira - clayton.nog at gmail.com / clayton at interfacenet.com.br
Faltou o número da patente, a Microsoft pode alegar que este é o 238
item do Linux que infrenge as suas patentes no Linux.

FYI: esta frase foi patenteada sob registro 123456789 :P


iniciar(){
Funções, é difícil ver alguém que use-as em shell, parabéns :)

#Suporte aos modulos
modprobe ip_tables
modprobe iptable_filter
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_LOG
modprobe ipt_state
modprobe ipt_MASQUERADE
Já que estamos "modularizando" o script, que tal deixar isto numa
funçao de carga de módulos?
OBS: Em kernels mais recentes (leia 2.6) estes módulos são carregados
automaticamente.

#Limpando as tabelas
iptables -F  #limpa regras da tabela principal
iptables -X  #zera regras da tabela principal
iptables -t nat -F  #limpa regras da tabela nat
iptables -t nat -X  #zera regras da tabela nat
Isso poderia virar outra função, mas eu particularmente penso o
seguinte: se estamos iniciando o firewall é porque:
1 - As regras atuais devem ser adicionadas
2 - Se não há necessidade de manter as regras anteriores que estas
sejam apagadas com um stop. :)

Faltou limpar a tabela mangle ai também, ela é usada para QOS, dentre
outras coisas.


#Politica padrao
iptables -P INPUT -j DROP #nega pacotes de entrada
iptables -P FORWARD -j ACCEPT #aceita o forward de pacotes
iptables -P OUTPUT -j ACCEPT #aceita pacotes de saida
iptables -A INPUT -p tcp --destination-port 22 -j ACCEPT #libera uma
porta (inclusive para internet)
Esta regra conflita com o teu DNAT mais adiante, se quiser que outra
máquina da rede externa seja acessível vai ter que usar outra porta no
DNAT. As políticas estão OK.



#Proxy Transparente
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT
--to-port 3128
Faltou a regra que diz que as conexões vindas da tua rede na porta
3128 são aceitas, lembre-se que a política é DROP.



#Mascaramento
iptables -A INPUT -i lo -j ACCEPT #aceita pacotes da interface loopback
iptables -A INPUT -p tcp --syn -s 127.0.0.1/255.0.0.0 -j ACCEPT
Esta regra é redundante com a anterior, pode ser removida...

iptables -t nat -A POSTROUTING -j MASQUERADE #mascaramento
Coloca um -o interface_de_rede_ligada_na_internet senão tu faz o
MASQUERADE dos dois lados (isso, teoricamente, abre janela (que
irônico :) para possíveis falhas de segurança.



#Compartilha a internet
modprobe iptable_nat
Coloca as cargas dos módulos todas juntas, ai fica mais fácil para
manter o código depois. ;)

echo "1" > /proc/sys/net/ipv4/ip_forward

# Proteções diversas contra portscanners, ping of death, ataques DoS, etc.
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit
1/s -j ACCEPT
Isso traz mais problemas que soluções, que tal uns 5 pings/s ?

iptables -A FORWARD -p tcp -m limit --limit 1/s -j ACCEPT
Isso gera um gargalo monstruoso na tua rede, traduzindo isso seria como:
"Tudo que passar por aqui deve entrar na fila já que eu libero apenas
um por segundo"

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
Essa é uma regra legal, mantém o pessoal conectado se tu der um
restart no teu firewall, mas o ideal é que ela seja a primeira regra
de FORWARD (faz uma dessas para INPUT também)

iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit
--limit 1/s -j ACCEPT
Outro gargalo.

iptables -A FORWARD --protocol tcp --tcp-flags ALL SYN,ACK -j DROP
Colocar a política em DROP da menos dor de cabeça. :)

iptables -A FORWARD -m unclean -j DROP
Nunca testei unclean, não posso dizer o impacto disto.

A propósito, onde estão as regras de segurança no INPUT? Aqui tu fecha
só o que *passa* não o que é originado/destinado ao firewall.

# Ignora pings
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
Isso realmente não é legal. Use at your own risk.

#Porta 5405 - utilizada pelo LogMeIn
iptables -A INPUT -p tcp --destination-port 5405 -j ACCEPT
iptables -A FORWARD -p tcp -i eth1 --dport 5405 -d 10.0.0.0/24 -j ACCEPT
É -i eth0, ele vai entrar pela internet e sair pela placa de rede para
o teu switch :)

#Outlook
E-mail não outlook ;)

iptables -A FORWARD -p udp -s 10.0.0.0/24 -d eth0 --dport 53 -j ACCEPT
-d é host de destino não a interface de rede externa, nesse caso é -o
pois está saindo.

iptables -A FORWARD -p udp -s eth0 --sport 53 -d 10.0.0.0/24 -j ACCEPT
-s é host de origem, não entendi o porque desta regra...

iptables -A FORWARD -p TCP -s 10.0.0.0/24 --dport 25 -j ACCEPT
iptables -A FORWARD -p TCP -s 10.0.0.0/24 --dport 110 -j ACCEPT
Faltou um -i eth1 -o eth0 ai, evita spoofing. :)

iptables -A FORWARD -p TCP --sport 25 -j ACCEPT
iptables -A FORWARD -p TCP --sport 110 -j ACCEPT
Viu no que da fazer um DROP no FORWARD? Com a política não precisaria
destes --sport :D

#ssh
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j DNAT --to 10.0.0.14
iptables -A FORWARD -p tcp -s 0/0 -d 10.0.0.14 --dport 22 -j ACCEPT
iptables -A FORWARD -p tcp -s 10.0.0.14 --sport 22 -d 0/0 -j ACCEPT
Tem que usar outra se tu vai liberar a porta do próprio servidor.

#ftp
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 21 -j DNAT --to 10.0.0.14
iptables -A FORWARD -p tcp -s 0/0 -d 10.0.0.14 --dport 21 -j ACCEPT
iptables -A FORWARD -p tcp -s 10.0.0.14 --sport 21 -d 0/0 -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 21 -j DNAT --to 10.0.0.14
iptables -A FORWARD -p udp -s 0/0 -d 10.0.0.14 --dport 21 -j ACCEPT
iptables -A FORWARD -p udp -s 10.0.0.14 --sport 21 -d 0/0 -j ACCEPT

#Bloqueia tudo
iptables -A INPUT -p tcp --syn -j DROP
Isso também costuma dar problemas no começo, use at your own risk.
}

parar(){
iptables -F
Aqui chamava aquela funçao de limpar as regras, fica mais elegante e
tu tem certeza que limpou.
echo "Regras de Firewall desativadas"
}

case "$1" in
"start")iniciar;;
"stop")parar;;
"restart")parar; iniciar;;
*) echo "Use os parâmetros start ou stop"
esac

No mais ta bom pra uma primeira tentativa. :)


--
Por favor não faça top-posting, coloque a sua resposta abaixo desta linha.
Please don't do top-posting, put your reply below the following line.
--------------------------------------------------------



Reply to: