Neste artigo, veremos como criar um Firewall e Proxy com autenticação para uma rede pequena, e também,
veremos como debugar alguns erros que podem acontecer no dia a dia.
Com ele, iremos deixar nossa rede mais segura e teremos um maior controle do que pode, ou não ser acessado.
O Script será todo comentado, assim, o leitor terá uma maior compreensão do que está utilizando.
Vale lembrar que o Script abaixo é um exemplo de uso livre, e o mesmo pode e deve ser alterado a seu gosto.
Antes de mais nada, vamos a organização do Script:
Cabeçalho;
Variáveis que serão usadas;
Ajustes / Módulos;
Regras de NAT;
Regras de INPUT;
Regras de OUTPUT;
Regras de FORWARD;
Parâmetros do script (start | stop | restart).
Um Script bem organizado evita problemas, e facilita muito na hora de uma adição ou remoção de regras, assim como também facilita na
hora da manutenção.
Vamos ao Script:
#!/bin/bash
#######################################################
# SCRIPT DE FIREWALL PARA FINS DE APRENDIZADO, MODIFIQUE-O A SEU GOSTO #
# Criado por phrich #
#######################################################
###################
# DECLARANDO VARIÁVEIS #
###################
# Interface de rede que recebe a internet
IFACE_WEB="eth0"
# Interface de rede ligada a rede interna
IFACE_LAN="eth1"
# Rede interna
REDE_INTERNA="10.0.0.0/24"
#####################################################################
# FUNÇÃO STOP #
# Esta função limpa todas as regras e libera todos os acessos, caso necessite de redirecionamentos (NAT) #
# Favor incluir as linhas referentes a nat, que não está incluso neste exemplo #
#####################################################################
# Cria a função
function stop() {
# Limpa todas as regras
iptables -F
iptables -t nat -F
iptables -t mangle -F
# Coloca as políticas padrões como ACCEPT, liberando todo e qualquer acesso
iptables -A INPUT -P ACCEPT
iptables -A OUTPUT -P ACCEPT
iptables -A FORWARD -P ACCEPT
# Habilita o roteamento no kernel #
echo 1 > /proc/sys/net/ipv4/ip_forward
# Compartilha a internet
iptables -t nat -A POSTROUTING -o $IFACE_WEB -j MASQUERADE
# Fecha a função
}
# FIM DA FUNÇÃO STOP #
####################################################################
# FUNÇÃO START #
# Esta função tem por finalidade setar as regras a fim de realizar as liberações, pois trabalharemos com #
# as políticas do iptables como DROP #
####################################################################
# Cria a função
function start () {
# Limpa as regras criadas anteriormente #
# Limpa a tabela filter
iptables -F
# Limpa a tabela nat
iptables -t nat -F
# Limpa a tabela mangle
iptables -t mangle -F
# Coloca as políticas padrões como DROP, ou seja nenhum acesso foi liberado #
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# Carrega módulos #
# Em alguns casos esses módulos serão úteis, realize uma pesquisa sobre cada um #
/sbin/modprobe ip_tables
/sbin/modprobe iptable_filter
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe nf_conntrack_ipv4
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ipt_MASQUERADE
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_nat
/sbin/modprobe nf_nat
/sbin/modprobe nf_conntrack
/sbin/modprobe x_tables
/sbin/modprobe nf_nat_pptp
# Habilita o roteamento no kernel #
echo 1 > /proc/sys/net/ipv4/ip_forward
# Compartilha a internet
iptables -t nat -A POSTROUTING -o $IFACE_WEB -j MASQUERADE
#############
# REGRAS DE NAT #
#############
# Acesso remoto via RDP para um host RWindows
iptables -t nat -A PREROUTING -i $IFACE_WEB -p tcp --dport 3389 -j REDIRECT --to 10.0.0.2:3389
###############
# REGRAS DE INPUT #
###############
# Libera o squid a partir da rede interna
iptables -A INPUT -p tcp --dport 3128 -s $LAN -j ACCEPT
# Libera SSH Apenas para a rede interna
iptables -A INPUT -p tcp --dport 22 -s $LAN -j ACCEPT
################
# REGRAS DE OUTPUT #
################
# Libera as portas 80 e 443 apenas para localhost
iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
# Libera DNS apenas para localhost
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
# Libera FTP para localhost (muito útil para o apt-get, yum, etc)
iptables -A OUTPUT -p tcp -m multiport --dports 20,21 -j ACCEPT
iptables -A OUTPUT -p udp -m multiport --dports 20,21 -j ACCEPT
#################
# REGRAS DE FORWARD #
#################
# Libera o acesso a clientes de email, pop e smtp
iptables -A FORWARD -p tcp -m multiport --dports 25,110 -j ACCEPT
# Fecha a função
}
# FIM DA FUNÇÃO START #
############################
# CRIANDO OS PARÂMETROS DO SCRIPT #
############################
#Aqui serão definidos os parâmetros:
# start = Ativa todas as regras, realizando os bloqueios e liberações
# stop = Limpa todoas as regras, "libera geral" ;-)
#restart = Carrega novas regras inseridas posteriormente
case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "Erro, utilize os seguintes parâmetros: start | stop | restart"
exit 0
;;
esac
# FIM DO SCRIPT DE FIREWALL #
[2] Comentário enviado por phrich em 13/03/2012 - 22:57h
Obrigado blaiser!
Bom no exemplo eu utilizei o parâmetro daily do sarg, que gera os relatórios separados por dia, se vc der o comando sarg sem nenhum argumento, ele salva o relatório do que estiver no arquivo de log do squid até o momento e não mostra mais as opções de diário, semanal,etc.
Para você ver um pouco mais dos parâmetro disponíveis no sarg, consulte o manual com:
[5] Comentário enviado por Thiago Emannuel em 19/04/2012 - 09:43h
Na minha configuracao ta dando erro na linha
acl rede_interna 10.0.0.0/24
segue meu interfaces
thiago@ORBITA:~$ su
Senha:
root@ORBITA:/home/thiago# cd /etc/squid/
root@ORBITA:/etc/squid# ls
acls grupos sarg.conf.bak squid.conf squid.conf.bak
root@ORBITA:/etc/squid# vim squid.conf
root@ORBITA:/etc/squid# /etc/init.d/squid restart
Restarting Squid HTTP proxy: squid2012/04/19 08:43:19| Parsing Config File: Unknown authentication scheme 'bacis'.
2012/04/19 08:43:19| Invalid Proxy Auth ACL 'acl internal_lan proxy_auth REQUIRED' because no authentication schemes are fully configured.
FATAL: Bungled squid.conf line 28: acl internal_lan proxy_auth REQUIRED
Squid Cache (Version 2.7.STABLE9): Terminated abnormally.
failed!
root@ORBITA:/etc/squid# cd grupos
root@ORBITA:/etc/squid/grupos# ls
moderado restrito total
root@ORBITA:/etc/squid/grupos# cat moderado
luiz.gonzaga:Mx7QbjJ4GmQp.
joaquim.juliao:aT5SmGf6ie/xY
root@ORBITA:/etc/squid/grupos# cat restrito
armando.reis:ny9XYfx8Jhix2
arthur.reis:EUXdsh0ttW.ac
root@ORBITA:/etc/squid/grupos# cat total
thiago.emannuel:xvLjfWqFsQVxk
amanda.reis:ttlNeoctSsT.c
root@ORBITA:/etc/squid/grupos#
root@ORBITA:/etc/squid/grupos# cd ..
root@ORBITA:/etc/squid# vim squid.conf
root@ORBITA:/etc/squid# ls
acls grupos sarg.conf.bak squid.conf squid.conf.bak
root@ORBITA:/etc/squid# htpasswd -c /etc/squid/grupos/Administradores thiago.emannuel
New password:
Re-type new password:
Adding password for user thiago.emannuel
root@ORBITA:/etc/squid# cd grupos/
root@ORBITA:/etc/squid/grupos# ls
Administradores moderado restrito total
root@ORBITA:/etc/squid/grupos# cat Administradores
thiago.emannuel:2HItEIt3cqFDk
root@ORBITA:/etc/squid/grupos# cd ..
root@ORBITA:/etc/squid# vim squid.conf
root@ORBITA:/etc/squid# /etc/init.d/squid restart
Restarting Squid HTTP proxy: squid2012/04/19 08:52:13| Parsing Config File: Unknown authentication scheme 'bacis'.
2012/04/19 08:52:13| Invalid Proxy Auth ACL 'acl internal_lan proxy_auth REQUIRED' because no authentication schemes are fully configured.
FATAL: Bungled squid.conf line 28: acl internal_lan proxy_auth REQUIRED
Squid Cache (Version 2.7.STABLE9): Terminated abnormally.
failed!
root@ORBITA:/etc/squid# vim squid.conf
root@ORBITA:/etc/squid# /etc/init.d/squid restart
Restarting Squid HTTP proxy: squid2012/04/19 08:52:56| Parsing Config File: Unknown authentication scheme 'bacis'.
2012/04/19 08:52:56| Invalid Proxy Auth ACL 'acl Administradores proxy_auth "/etc/squid/grupos/Administradores"' because no authentication schemes are fully configured.
FATAL: Bungled squid.conf line 33: acl Administradores proxy_auth "/etc/squid/grupos/Administradores"
Squid Cache (Version 2.7.STABLE9): Terminated abnormally.
failed!
root@ORBITA:/etc/squid# vim squid.conf
root@ORBITA:/etc/squid# /etc/init.d/squid restart
Restarting Squid HTTP proxy: squid2012/04/19 08:54:17| Parsing Config File: Unknown authentication scheme 'bacis'.
2012/04/19 08:54:17| Invalid Proxy Auth ACL 'acl total proxy_auth "/etc/squid/grupos/total"' because no authentication schemes are fully configured.
FATAL: Bungled squid.conf line 36: acl total proxy_auth "/etc/squid/grupos/total"
Squid Cache (Version 2.7.STABLE9): Terminated abnormally.
failed!
root@ORBITA:/etc/squid#
root@ORBITA:/etc/squid# vim squid.conf
root@ORBITA:/etc/squid# /etc/init.d/squid restart
Restarting Squid HTTP proxy: squid2012/04/19 09:02:40| strtokFile: /etc/squid/acls/palavras_permitidas not found
2012/04/19 09:02:40| aclParseAclLine: WARNING: empty ACL: acl palavras_permitidas url_regex "/etc/squid/acls/palavras_permitidas"
2012/04/19 09:02:40| strtokFile: /etc/squid/acls/sites_restritos not found
2012/04/19 09:02:40| aclParseAclLine: WARNING: empty ACL: acl sites_restritos dstdomain "/etc/squid/acls/sites_restritos"
2012/04/19 09:02:40| aclParseAclLine: Invalid ACL type 'localhost'
FATAL: Bungled squid.conf line 63: acl to localhost dst 127.0.0.0/8
Squid Cache (Version 2.7.STABLE9): Terminated abnormally.
failed!
root@ORBITA:/etc/squid#
root@ORBITA:/etc/squid# ls
acls grupos sarg.conf.bak squid.conf squid.conf.bak
root@ORBITA:/etc/squid# cd acls/
root@ORBITA:/etc/squid/acls# ls
palavras_proibidas sites_restrito
root@ORBITA:/etc/squid/acls# vim palavras_proibidas
root@ORBITA:/etc/squid/acls#
root@ORBITA:/etc/squid/acls# ls
palavras_proibidas sites_restrito
root@ORBITA:/etc/squid/acls# touch palavras_permitidas
root@ORBITA:/etc/squid/acls# ls
palavras_permitidas palavras_proibidas sites_restrito
root@ORBITA:/etc/squid/acls# cat palavras_proibidas
sexo*
jogo*
jogatina*
facebook*
youtube*
orkut*
messenger*
msn*
playboy*
root@ORBITA:/etc/squid/acls# vim palavras_permitidas
root@ORBITA:/etc/squid/acls# vim sites_restrito
root@ORBITA:/etc/squid/acls# vim /etc/squid/squid.conf
root@ORBITA:/etc/squid/acls# ls
palavras_permitidas palavras_proibidas sites_restrito
root@ORBITA:/etc/squid/acls#
root@ORBITA:/etc/squid/acls# vim /etc/squid/squid.conf
root@ORBITA:/etc/squid/acls# cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
auto eth1:rede2
iface eth1:rede2 inet static
address 10.0.2.1
netmask 255.255.255.0
network 10.0.2.0
broadcast 10.0.2.255
root@ORBITA:/etc/squid/acls# vim /etc/squid/squid.conf
root@ORBITA:/etc/squid/acls# /etc/init.d/squid restart
Restarting Squid HTTP proxy: squid2012/04/19 09:38:21| aclParseAclLine: Invalid ACL type '10.0.0.0/8'
FATAL: Bungled squid.conf line 64: acl rede_interna 10.0.0.0/8
Squid Cache (Version 2.7.STABLE9): Terminated abnormally.
failed!
root@ORBITA:/etc/squid/acls#
root@ORBITA:/etc/squid/acls# vim /etc/squid/squid.conf
root@ORBITA:/etc/squid/acls# vim /etc/squid/squid.conf
root@ORBITA:/etc/squid/acls# cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
[8] Comentário enviado por kakashi963 em 17/05/2012 - 20:32h
Meu squid bloqueia o acesso a todos os sites. A politica de segurança aqui deve ser:
Alguns ips com acesso total a internet: ipsLiberados
Alguns ips com acesso total mas com filtro de palavras: ipsLiberadosRestritos
Palavras que não podem conter nos acessos: palavras bloqueadas
Sites permitidos a todos os usuários da rede: sitesLiberados
Download é bloqueado: download
Acesso a site de antivirus é liberado: antivirus
Para o caso dos ipsLiberadosRestritos, da certo, se o usuário tem seu ip nessa listagem, ele acessa tudo menos o conteudo das palavras, ta ok.
Entretando, para o restante dos usuários da rede que deveriam poder acessar pelo menos os sitesLiberados, tudo fica como bloqueado.
[9] Comentário enviado por phrich em 17/05/2012 - 21:15h
Prezado kakashi963 eu recomendo que vc abra um tópico na comunidade sobre squid / iptables pois lá além de ser o local correto para dúvidas, vc terá mais pessoas para ajudar.
[10] Comentário enviado por afdominguez em 23/05/2012 - 23:42h
Amigo, esta dando o seguinte erro:
root@lorrany:~# /etc/rc.local
iptables v1.4.10: REDIRECT: Bad value for "--to-ports" option: "10.15.84.20:3389"
Try `iptables -h' or 'iptables --help' for more information.
[11] Comentário enviado por phrich em 23/05/2012 - 23:46h
Cara, depende de como vc colocou a regra...
Seria mais interessante vc utilizar o fórum para postar suas dúvidas, além de ser o mais correto, vc estaria sendo ajudado por outras pessoas e ajudaria também.
[13] Comentário enviado por phrich em 13/07/2012 - 15:45h
Caro johnnyb, se vc habilitar vc irá remover os arquivos temporários gerados pelo SARG, na hora da escrita eu errei, mas habilite para esvaziar o disco ok?
[14] Comentário enviado por ronymoliveira em 11/09/2012 - 11:50h
Bom dia, como faço para implementar o IPTables + squid tendo a seguinte situação:
Internet da GVT: 192.168.25.1
Rede Interna: 192.168.1.1 a 192.168.1.254
Sou novato aqui, estou usando o Debian, se tiver como me ajudar, agradeço.
[18] Comentário enviado por xirux em 11/07/2014 - 12:19h
Cara, muito bom o artigo, realmente show. Foi pros favoritos e será de valia nos meus arquivos com certeza!
Se posso opinar, no squid.conf eu impediria o uso do proxy por rede externa limitando com a adição do ip do FW, antes da porta na linha:
http_port 10.0.0.254:3128
E adicionaria em sarg.conf um limite de logs para o squid, impedindo problemas com espaço:
[19] Comentário enviado por phrich em 11/07/2014 - 16:14h
Obrigado xiux, essa opção do SARG é ótima!
Com relação ao proxy, bloqueamos isso no iptables, visto que a porta 3128 está liberada apenas para a rede interna.
abs!
[20] Comentário enviado por jnt.santos em 14/10/2014 - 11:40h
Obrigado pelo Tutorial
Mais quando tento logar nao pede usuário nem senha.
Estou fazendo em teste então mantive o seu mesmo script no meu squid3(so alterando os erros), a UNICA DIFERENÇA FOI NO IPTABLES só possuo uma placa de rede então configurei assim o IPtables:
# Carrega os modulos
#modprobe iptables
modprobe iptable_nat
# Limpa a tabela filter
iptables -F
iptables -t nat -F
iptables -t mangle -F
# Compartilha a conexao
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
[22] Comentário enviado por jnt.santos em 14/10/2014 - 12:06h
Opa Princh Tbm, Valeu pela ajuda, MAIS ainda não pede nada =/, cara esta assim agora
# Carrega os modulos
#modprobe iptables
modprobe iptable_nat
# Limpa a tabela filter
iptables -F
iptables -t nat -F
iptables -t mangle -F
# Compartilha a conexao
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward