--Firewall de conteúdo - Proxy Squid

Squid trata-se de um servidor Proxy, que possibilita compartilhar internet entre host de uma rede, porém é usado também como um firewall de conteúdo, com a principal atribuição de filtrar e definir regras para o acesso à web.
Outro importante recurso que possui é a sua função cache, que armazena os sites acessados e quando o acesso a este é solicitado, automaticamente é disponibilizado ao usuário sem que se precise ir até o destino do site para buscar os dados, atualizando apenas a parte dinâmica das páginas web, liberando e "economizando" banda de conexão internet.

Instalação

Sempre antes de instalar qualquer pacote no Linux deve-se atualizar o apt:
# apt-get update

Para servidores com Debian Like pode-se utilizar:
# apt-get install squid

Criar uma cópia de segurança (backup) do arquivos de configuração do Squid:
# cd /etc/squid
# cp squid.conf squid.conf.original

Configuração do squid.conf
O arquivo de configuração padrão do Squid se localiza em /etc/squid/squid.conf. 
Após a instalação deve-se abrir o arquivo squid.conf e realizar algumas mudanças para o funcionamento inicial.

Porta do Squid
O registro acima, em algumas versões do squid pode estar comentada com um "#" antes então deve-se removê-lo.
Esta linha indica ao Squid em que porta ele utilizará para as requisições de tráfego, que por padrão no Squid é a porta 3128.
http_port 3128

Obs: Caso se queira restringir o Squid a uma rede específica pode-se inserir o endereço do servidor da seguinte forma:
http_port 192.168.1.1:3128

Espaço em disco para cache
Para configurar o tamanho do cache e os seus diretórios deve-se editar o arquivo /etc/squid/squid.conf e localizar o registro: 
# cache_dir ufs /var/spool/squid 16 256 100

Onde:
/var/spool/squid : local onde fica o cache do squid;
16 : quantidade de diretórios;
256 : quantidade de subdiretórios em cada diretório;
100 : quantidade em Mb do disco para armazenar a cache do Squid.

Descomentar tirando o # e logo após alterar o valor desse cache para 64 64 500.
# cache_dir ufs /var/spool/squid 64 64 500

Assim a configuração acima indica que o diretório de cache estará localizado em /var/spool/squid, terá 64 diretórios com 64 subdiretórios cada e 500 Mb de tamanho para armazenar as caches de navegação.

Quantidade de memória usada pelo Squid
Especifica o tamanho de memória RAM que o servidor disponibilizará para realizar as consultas.
cache_mem 256 MB
Pode-se alterar para o valor desejado, dependendo sempre de uma estimativa de quanto se tem de memória e de quanto se pode disponibilizar para o Squid.

Nome do servidor
Informa qual o nome do servidor bloqueou o acesso a um site caso se queira, por exemplo o cliente 192.168.1.107 tentou acessar o facebook por estar bloqueado, logo o navegador irá exibir uma mensagem informando que o servidor com nome ServidorProxy é que efetuou o bloqueio para que se saiba que não foi um erro de carregamento, mas sim um bloqueio. 
Caso se queira que seja visualizado o nome do servidor basta descomentar e alterar o nome:
visible_hostname localhost

Configurando regras iniciais
O Squid já possui algumas regras padr?o ACL (Access Lists)  que podem ser vistas logo abaixo, porém permite que se crie regras personalizadas inserindo-as no arquivo squid.conf.
As ACL s?o regras de acesso que o Squid utiliza para determinar de que forma deverá proceder com o acesso ? internet pelos usuários.

Exemplo do arquivo squid.conf:

# nano /etc/squid/squid.conf 

acl SSL_ports port 443	#https
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT

Após localizar os ítens acima, logo abaixo da diretiva acl CONNECT method CONNECT pode-se iniciar a inserção das regras (ACL) personalizadas.
Para essas ACL usa-se a diretiva http_access, que dita como as regras irão agir.

Exemplo 1: negar acesso a sites.
Criar no diretório do Squid mesmo (/etc/squid) um arquivo chamado sitesblock (lembrando sempre que arquivos no Linux não necessitam de extensão).
# nano /etc/squid/sitesblock
www.ig.com.br
uol.com.br

Exemplo 2:
Criar arquivo de strings proibidas:
# nano /etc/squid/stringsblock
ifms

Após salvar e fechar o arquivo, retornar novamente ao arqiuvo squid.conf e criar a regra abaixo das ACL padr?o:
# nano /etc/squid/squid.conf

acl stringsblock url_regex "/etc/squid/stringsblock"
acl sitesblock url_regex "/etc/squid/sitesblock"
acl rede src 192.168.1.0/24
acl host src 192.168.1.11

Agora deve-se confirmar os itens a seguir no arquivo /etc/squid/squid.conf:

# host 192.168.1.11 (ou o IP da MV-XP ou MV-Seven) tem acesso liberado
http_access deny host

# A partir da regra acima qualquer host que acessar os sites estará proibido a lista em sitesblock
http_access deny stringsblock
http_access deny sitesblock

# Todo o range de rede declarado pode acessar a internet, exceto os sites bloqueados
http_access allow rede

#Se não se encaixa em nenhuma das ACL acima, não poderá ter acesso à internet:
http_access deny all

Obs: as regras são regidas pela http_access e são lidas de cima para baixo, logo, as regras acima tem privilégios sobre os de baixo


Após as alterações realizadas e salvo o arquivo, ou reiniciar o squid (que pode demorar um pouco devido ao carregamento de sua cache):
# /etc/init.d/squid restart
ou
# service squid restart

Ou fazer somente a releitura do arquivo de configuração, recomendado pois a inicialização das regras é imediata:
# squid -k reconfigure

Após isso fazer o teste e ver se os hosts da rede executam o sites bloqueados e se no host liberado os sites s?o carregados.
Como o Proxy Squid n?o está no modo transparente (modo redirecionamento) deve-se configurar o acesso ao proxy no navegador.

ACL

As ACL (regras)s?o escritas no padr?o:
acl nome_da_acl tipo ocorrencia | "localização"

As ACL podem ser de vários tipos, cada qual indicada para um tipo de regra espec?fica, sendo que os mais comuns s?o:

srcdomain - tipo indicado para verificar o dom?nio da máquina cliente. Os dom?nios ser?o obtidos por resolução reversa de IP, o que pode causar atrasos para a resposta da requisição. A definição do dom?nio deve ser feita da seguinte forma: ".meudominio.com.br", n?o podendo ser esquecido o "." (ponto) no in?cio;

time - usado para especificar dias da semana e horários. Os dias da semana s?o definidos através de letras que os representam, e os horários através de intervalos na forma hora:minuto_inicio-hora:minuto_final. Os dias da semana s?o especificados assim: S - Sunday (Domingo), M - Monday (Segunda-feira), T - Tuesday (Ter?a-feira), W - Wednesday (Quarta-feira), H - Thursday (Quinta-feira), F - Friday (Sexta-feira) e A - Saturday (Sábado);

src - utilizado para indicar endere?os IP de origem. Pode-se especificar um endere?o de rede, como 192.168.16.0/24, um endere?o de um determinado host, como 192.168.16.10/24 ou uma faixa de endere?os, como 192.168.16.10-192.168.16.20/24;

dst - semelhante ao porém relacionada ao endere?o de destino;

dstdomain - usado da mesma forma que srcdomain, entretanto com relação ao destino;

srcdom_regex - avalia o dom?nio usando express?es regulares. Seu uso é semelhante ?s duas anteriores, acrescentando a flexibilidade do uso da express?o regular;

dstdom_regex - usado da mesma forma que srcdom_regex, entretanto com relação ao destino;

url_regex - percorre a URL ? procura da express?o regular especificada. Deve ser observado que a express?o é case-sensitive, para que seja case-insensitive deve ser usada a opção -i. ? o tipo mais comum de ACL, dada a flexibilidade proporcionada pelo uso de express?es regulares;

urpath_regex - tipo semelhante ? url_regex, mas procura a express?o regular na URL sem levar em conta o nome do servidor e o protocolo, isto quer dizer que a procura será feita apenas na parte da URL após o nome do servidor, como por exemplo, na URL http://www.servidor.com.br/pasta/[*****].html, a procura será realizada apenas na parte /pasta/[*****].html. Ela é também case-sensitive, para que seja case-insensitive deve ser usada a opção -i;

port - realiza o controle pela porta de destino do servidor, neste tipo deve ser especificado o número da porta;
proto - serve para especificar o protocolo, como por exemplo FTP ou HTTP;

method - especifica o tipo de método usado na requisição, como por exemplo GET, CONNECT ou POST;

browser - usa uma express?o regular para associar com os dados do cabe?alho HTTP e combinando ent?o com o navegador utilizado pelo cliente;

ident - Realiza o controle de acesso baseado no nome do usuário. Este tipo requer um servidor Ident rodando na máquina do cliente;

ident_regex - semelhante a ident, mas utilizando express?o regular;

proxy_auth - tipo usado para implementar autenticação de usuários no proxy. A autenticação é feita com uso de softwares externos. Podem ser passados os nomes dos usuários ou usada a opção REQUIRED para que seja autenticado qualquer usuário válido;

snmp_community - tipo usado para especificar o nome da comunidade SNMP para que se possa monitorar o Squid através deste protocolo;

maxconn - especifica um limite de conex?es vindas de um determinado cliente, interessante para uso com outras ACLs de forma a limitar quantidades de conex?es para determinados endere?os espec?ficos;

req_mime_type - especifica uma express?o regular para ser verificada no cabe?alho da requisição em busca de um tipo MIME que coincida com o especificado;

arp - tipo usado para construir lista de acesso baseada no MAC Address da interface de rede do cliente, ou seja, em vez de endereço IP da placa, usa-se o seu endereço MAC.

Proxy transparente
Para tornar o Squid um proxy transparente (sem necessidade de se configurar o IP e porta nos navegadores) deve-se alterar a entrada:
http_port 3128 
para: 
http_port 3128 transparent

Salvar o arquivo e reiniciar o Squid:
# squid -k reconfigure

-----------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------
OBS:
Para liberar o roteamento entre as interfaces de rede externa e interna deve-se alterar o valor do arquivo ip_forward de 0 para 1:
# echo 1 > /proc/sys/net/ipv4/ip_forward

OBS: SEM ESSA CONFIGURAÇÃO DE ROTEAMENTO NÃO SERÁ POSSÍVEL COMPARTILHAR INTERNET DA INTERFACE EXTERNA (NAT) PARA A INTERNA (INTNET)
-----------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------

Pronto agora o srvidor Proxy Cache Squid está pronto para ser utilizado pelos clientes que devem ter o endereço 19.168.1.1 e a porta 3128 configuradas na opção Conexões do navegador de internet.

Obs: somente após a inserção do endereço IP e porta é que o cliente passará a navegar na internet.

Obs: caso queira limpar oscomentários do squid.conf proceder executando os seguintes comandos:

# cd /etc/squid
# mv squid.conf squid.conf.original
# egrep "^#|^$" squid.conf.original > squid.conf