[ Resolvido ] Erro - Script Firewall

Iniciado por Rafazan, 27 de Julho de 2013, 16:25

tópico anterior - próximo tópico

Rafazan

Pessoal,

Tenho um problema no meu script, se eu deixar comentado as linhas do meu script de firewall :
#DEFINE POLITICA PADRAO
#iptables -P INPUT DROP
#iptables -P OUTPUT ACCEPT
#iptables -P FORWARD DROP

Desse jeito acima a internet nas estacoes funcionam, caso eu descomente a internet vai parar de  funcionar nas estações, oque posso fazer para consertar isso, se alguem puder me ajudar agradeço.

Segue meu script de firewall.
#!/bin/bash
#chkconfig: 345 99 10
#description: Firewall
#CARREGA  MODULOS
modprobe iptable_nat
modprobe ip_nat_ftp
modprobe ip_tables
modprobe ip_conntrack
modprobe ip_conntrack_ftp
INTERNET () {
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
}
LIMPAR () {
#REMOVENDO REGRAS
iptables -F
iptables -t nat -F
iptables -t mangle -F
#APAGANDO REGRAS
iptables -X
iptables -t nat -X
iptables -t mangle -X

#ZERANDO CONTADORES
iptables -Z
iptables -t nat -Z
iptables -t mangle -X
}
PARAR () {
#LIMPANDO REGRAS
LIMPAR


#DEFINE POLITICA PADRAO
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

#COMPARTILHANDO ACESSO INTERNET
INTERNET

}

INICIAR () {

#LIMPANDO REGRAS
LIMPAR

#DEFINE POLITICA PADRAO   <<<<<<<<<<<  ABAIXO ESTAO AS LINHAS QUE FALEI PRA VCS, SE DEIXAR COMENTADO AS 3 LINHAS A INTERNET PARA.......
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP


#COMPARTILHA INTERNET
INTERNET

################### ATRIBUINDO SEGURANCA #######################################################



#PROTECAO PARA SYN FLOOD
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

#REJEITAR REQUISICAO DE ICMP ECHO DSTINADA A BROADSCAST E MULTICASTS
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

#IGNORAR MENSAGEM FALSAS DE ICMP
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

for i in /proc/sys/net/ipv4/conf/*; do
#NAO REDIRECIONAR MENSAGENS ICMP
echo 0 > $i/accept_redirects

#PROTECAO A ATAQUES IP SPOOFING
echo 0 > $i/accept_source_route

#PERMITIR QUE PACOTES FORJADOS (DOS) SEJAM LOGADOS PELO PROPRIO KERNEL
echo 1 > $i/log_martians

#VERIFICAR ENDERECO DE ORIGEM DO PACOTE ( PROTECAO A ATAQUES IP SPOOFING)
echo 1 > $i/rp_filter
done

# SSH - SERVIDOR SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 -- hitcount 10 -j DROP
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -j ACCEPT


#MANTER CONEXOES ESTABELICIDAS
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

# LIBERANDO TRAFEGO NA INTERFACE LOOPBACK
iptables -A INPUT -i lo -j ACCEPT

}
case "$1" in
start)
echo "Firewall iniciado............ OK"
INICIAR
;;
stop)
echo " Firewall parado.............OK"
PARAR
;;
restart|reload)
echo "Reiniciado firewalllll"
INICIAR
;;
*)
echo " use:$0 {start|stop|restart|reload}"
exit 1
esac
exit 0

zekkerj

Qdo vc usa política DROP na cadeia FORWARD, tem q liberar explicitamente a passagem do tráfego originado da rede interna.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

Rafazan

Amigo,

e qual seria o procedimento para eu liberar a passagem do trafego vindo da rede interna logo após a politica padrao?



Arthur Bernardes

Só uma pergunta.

Você que criou esse script (serviço de sistema)?

Você precisa de tudo isso? Podemos simplificar ele?

zekkerj

Citação de: Rafazan online 28 de Julho de 2013, 21:59
Amigo,

e qual seria o procedimento para eu liberar a passagem do trafego vindo da rede interna logo após a politica padrao?
Adicione a linha abaixo ao final do script, logo após liberar o tráfego da loopback:

iptables -A FORWARD -i eth1 -j ACCEPT
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

Rafazan

Citação de: Arthur Bernardes online 28 de Julho de 2013, 23:25
Só uma pergunta.

Você que criou esse script (serviço de sistema)?

Você precisa de tudo isso? Podemos simplificar ele?

Olá colega, sim eu criei este script, mas como sou novato nesta área ainda não sei tudo, se vc puder me ajudar a melhorar meu script, ou seja simplificar , sua ajuda será de grande importância não só para mim mas para outros colegas que queiram usar este script como exemplo para a construcao de um firewall.

Arthur Bernardes

Vamos lá.

Vou te mostrar um script simples que criei, é um serviço de sistema, que pode ser iniciado pelo boot.

Código (/etc/init.d/firewall) Selecionar
#!/bin/bash

#### Declarando variáveis ####

# Interface da Internet:
ifinternet="eth1"

# Interface da Rede Local
iflocal="eth0"

#### Função "start" ####

iniciar(){

## Limpa todas as regras ##

iptables -F
iptables -t nat -F
iptables -t mangle -F

## Carrega módulos ##

modprobe ip_tables
modprobe iptable_mangle
modprobe iptable_nat

## Habilita roteamento no kernel ##

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

## Compartilha a internet ##

iptables -t nat -A POSTROUTING -o $ifinternet -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP

#### Regras de Firewall ####

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i $iflocal -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p udp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 3128 -j ACCEPT
iptables -A INPUT -p udp --dport 3128 -j ACCEPT
iptables -A FORWARD -i lo -j ACCEPT
iptables -A FORWARD -i $iflocal -j ACCEPT
iptables -A FORWARD -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -p udp --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp --dport 3128 -j ACCEPT
iptables -A FORWARD -p udp --dport 3128 -j ACCEPT

#### Redireciona tráfego para Squid ####

#iptables -A INPUT -P tcp --dport 3128 -s $iflocal -j ACCEPT
#iptables -A INPUT -p udp --dport 3128 -s $iflocal -j ACCEPT
#iptables -t nat -A PREROUTING -i $iflocal -p tcp --dport 80 -j REDIRECT --to-port 3128

}

parar(){
iptables -F
iptables -F -t nat
}

status (){
iptables -L -v -n
}

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


Modifique-o de acordo com sua necessidade.

É um simples script que uso no meu servidor doméstico, em servidores empresariais, a coisa muda de figura (pra mim).

Salve o script em /etc/init.d com o nome firewall

Dê permissão de execução com sudo chmod +x /etc/init.d/firewall

Associe-o com a inicialização do Ubuntu com sudo update-rc.d firewall start 99 2 3 4 5 . stop 0 1 6 .

Rafazan

Citação de: zekkerj online 29 de Julho de 2013, 00:22
Citação de: Rafazan online 28 de Julho de 2013, 21:59
Amigo,

e qual seria o procedimento para eu liberar a passagem do trafego vindo da rede interna logo após a politica padrao?
Adicione a linha abaixo ao final do script, logo após liberar o tráfego da loopback:

iptables -A FORWARD -i eth1 -j ACCEPT

Olá colega zekkerj, fiz conforme vc mencionou, e funcionou corretamente ! Muito obrigado pela sua ajuda.
Um detalhe que tive que mudar para fazer funcionar após a mudança que realizei foi a seguinte:

-Eu tive que mudar a ordem de script das seguintes linhas:

#MANTER CONEXOES ESTABELICIDAS
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

**** Coloquei estas linhas ACIMA após o liberacao de acesso da passagem vindo da rede local, ou seja se eu deixasse estas linha antes de liberar a passagem de acesso a internet vindo da rele local, a internet nao funcionava.

###### Abaixo estão as mudanças com a internet funcionando corretamente após a mudança #######

INICIAR () {

#LIMPANDO REGRAS
LIMPAR

#DEFINE POLITICA PADRAO   <<<<<<<<<<<  ABAIXO ESTAO AS LINHAS QUE FALEI PRA VCS, SE DEIXAR COMENTADO AS 3 LINHAS A INTERNET PARA.......
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

#COMPARTILHA INTERNET
INTERNET

# LIBERANDO TRAFEGO NA INTERFACE LOOPBACK
iptables -A INPUT -i lo -j ACCEPT

# LIBERANDO TRAFEGO NA INTERFACE DE REDE LOCAL
iptables -A FORWARD -i eth1 -j ACCEPT

#MANTER CONEXOES ESTABELICIDAS
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT



## Pelo menos foi isso que tive que realizar para ter exito , se alguem tiver alguma outra idéia favor nos avisar, obrigado.

Rafazan

Blza Arthur,

Está bem mais simplificado agora.

Vou alterar algumas coisas no meu script, muito obrigado pela sua contribuição.



zekkerj

Citar#NAO REDIRECIONAR MENSAGENS ICMP
echo 0 > $i/accept_redirects

#PROTECAO A ATAQUES IP SPOOFING
echo 0 > $i/accept_source_route

#PERMITIR QUE PACOTES FORJADOS (DOS) SEJAM LOGADOS PELO PROPRIO KERNEL
echo 1 > $i/log_martians

#VERIFICAR ENDERECO DE ORIGEM DO PACOTE ( PROTECAO A ATAQUES IP SPOOFING)
echo 1 > $i/rp_filter

Apesar das ações estarem corretas, seus conceitos estão errados.

ICMP Redirects são mensagens que avisam que um caminho melhor de roteamento está disponível para um determinado destino. São enviadas por um roteador quando ele recebe um pacote e descobre que deve roteá-lo de volta para a mesma interface onde o pacote foi recebido. O controle "accept_redirects" que vc desabilitou faz com que sua máquina ignore essas mensagens.

"Source Route" é uma opção do pacote IP, onde ele pode trazer a lista dos gateways por onde deve passar. Não é necessariamente usado em ataques de spoofing.

"martians" são pacotes recebidos na rede local cujo endereço de origem é inválido. Não são necessariamente usados em DoS. Aliás, definitivamente, não é pelos martians que vc detecta um DoS.

"rp_filter" é um filtro que associa o endereço de origem de um pacote com a rota usada para alcançá-lo. Esse tipo de filtro impede o recebimento de um pacote com endereço de origem na sua rede local, vindo da internet. Mas deve ser usado com cuidado, pois há situações de roteamento assimétrico onde ele pode criar problemas.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

zekkerj

Citar**** Coloquei estas linhas ACIMA após o liberacao de acesso da passagem vindo da rede local, ou seja se eu deixasse estas linha antes de liberar a passagem de acesso a internet vindo da rele local, a internet nao funcionava.
Não há relação de sequência entre essas regras, pois elas lidam com tráfegos de direções opostas. A boa prática manda colocar as regras de liberação de retorno (-m state --state ESTABLISHED,RELATED -j ACCEPT) no início do script, pra evitar que alguma regra de bloqueio mal colocada impeça o funcionamento dela.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D