Como prometido, aula de squid em http://www.fix.inf.br/wiki/doku.php?id=squid_sarg. Honestamente, tenho me divertido e aprendido muito compilando este material. Está sendo uma fonte básica de pesquisa, além de um guia prático. As matérias tem sido simples, mas farei atualizações nas aulas para que elas sejam mais abrangentes, como por exemplo, o iptables que ficou só na parte de firewall.
Peço também que me ajudem com as correções do material. Sei que muita coisa não deve estar exatamente como deveria, portanto ficaria grato se vocês me ajudassem na correção.
Como antes, aqui vai um ctrl+v ctrl+c do texto, mas a leitura fica melhor na wiki.
Table of Contents
Conceitos básicos de Squid
Instalando
Um arquivo de configuração básico
Entendendo as configurações
ACLs
Lista de opções das ACLs
HTTP_ACCESS
A Ordem importa
Bloqueando endereços
Autenticação
Delimitando horários
Deixando coisas de fora do squid
Cache local
Proxy Transparente
Referências
Conceitos básicos de Squid
O Squid é um servidor proxy e cache de web. A sua utilização mais comum é a aceleração de acesso web, através de um cache de dados acessados com frequência. Também pode ser utilizado para realizar controle de acesso a internet, impedindo ou liberando o acesso através de ACLs (Listas de Controle de Acesso). Desenvolvido inicialmente para Unix, roda agora também em sistemas windows.
A melhor fonte de informações sobre o squid é a Squid Wiki, do próprio squid: http://wiki.squid-cache.org/SquidFaq/
Instalando
Em distribuições baseadas em redhat, instalaremos o squid com a ferramenta yum:
yum install squid
Em distribuções baseadas em debian, usamos o apt-get:
apt-get install squid
Além dele, precisamos também do pacote httpd-tools.
E precisamos fazer uma alteração no sistema para permitir o redirecionamento de pacotes
Podemos fazer isso da seguinte forma:
echo 1 > /proc/sys/net/ipv4/ip_forward
Ou podemos editar o arquivo /etc/sysctl.conf e mudar a opção net.ipv4.ip_forward = 0 para 1
Um arquivo de configuração básico
O arquivo de configuração fica em /etc/squid/squid.conf por padrão na maioria das distribuições:
#
# Recommended minimum configuration:
#
#Tradução livre do squid.conf do fedora # Regra de exemplo permitindo acesso de sua rede interna
# Adapte ela para o endereço de ip da sua rede, onde a navegação será liberada
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
acl SSL_ports port 443
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
#
# Configurações recomendadas para permissão de acesso
# Somente permitir acesso ao cachemgr pela localhost
http_access allow localhost manager
http_access deny manager
# Negar acesso a certas portas não seguras
http_access deny !Safe_ports
# Negar conexão a outras portas que não sejam de SSL
http_access deny CONNECT !SSL_ports
#
# Insira suas próprias regras aqui para permitir acesso de seus clientes
#
# Regra de exemplo permitindo acesso de sua rede local
# Adapte para o que for necessário para funcionar na sua rede
http_access allow localnet
http_access allow localhost
# E finalmente, negar todos os outros acessoas a este proxy
http_access deny all
# O Squid normalmente escuta na porta 3128
http_port 3128
# Descomente e ajuste a linha seguinte para adicionar o diretório de cache
cache_dir ufs /var/spool/squid 100 16 256
# Deixe coredumps no primeiro diretório do cache
coredump_dir /var/spool/squid
# Adicione suas próprias entradas de refresh abaixo dessas
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
Entendendo as configurações
ACLs
A tag ACL é a lista de acesso, ou regra, que definimos para o nosso servidor. É através delas que vamos fazer as limitações/permissões de uso. As ACLs do squid são compostas sempre por um par. Uma definição de ACL no estilo
acl nomedaacl tipodaacl opção/localdaacl
Então, uma acl chamada Safe_ports que especifique a porta 80, seria a seguinte.
acl Safe_ports port 80
Esta regra, no momento, não bloqueia nem libera essa porta. Simplesmente diz que temos uma ACL chamada Safe_ports que rege sobre a porta 80. As ACLs são somente as listas de acesso. Depois nós iremos dizer se elas deverão ser liberadas ou não.
Uma mesma ACL pode conter mais de uma informação, como por exemplo:
acl Safe_ports port 80
acl Safe_ports port 3128
Chamamos a mesma ACL duas vezes, mas com valores diferentes.
Lista de opções das ACLs
src: source (client) IP addresses
dst: destination (server) IP addresses
myip: the local IP address of a client's connection
arp: Ethernet (MAC) address matching
srcdomain: source (client) domain name
dstdomain: destination (server) domain name
srcdom_regex: source (client) regular expression pattern matching
dstdom_regex: destination (server) regular expression pattern matching
src_as: source (client) Autonomous System number
dst_as: destination (server) Autonomous System number
peername: name tag assigned to the cache_peer where request is expected to be sent.
time: time of day, and day of week
url_regex: URL regular expression pattern matching
urlpath_regex: URL-path regular expression pattern matching, leaves out the protocol and hostname
port: destination (server) port number
myport: local port number that client connected to
myportname: name tag assigned to the squid listening port that client connected to
proto: transfer protocol (http, ftp, etc)
method: HTTP request method (get, post, etc)
http_status: HTTP response status (200 302 404 etc.)
browser: regular expression pattern matching on the request user-agent header
referer_regex: regular expression pattern matching on the request http-referer header
ident: string matching on the user's name
ident_regex: regular expression pattern matching on the user's name
proxy_auth: user authentication via external processes
proxy_auth_regex: regular expression pattern matching on user authentication via external processes
snmp_community: SNMP community string matching
maxconn: a limit on the maximum number of connections from a single client IP address
max_user_ip: a limit on the maximum number of IP addresses one user can login from
req_mime_type: regular expression pattern matching on the request content-type header
req_header: regular expression pattern matching on a request header content
rep_mime_type: regular expression pattern matching on the reply (downloaded content) content-type header. This is only usable in the http_reply_access directive, not http_access.
rep_header: regular expression pattern matching on a reply header content. This is only usable in the http_reply_access directive, not http_access.
external: lookup via external acl helper defined by external_acl_type
user_cert: match against attributes in a user SSL certificate
ca_cert: match against attributes a users issuing CA SSL certificate
ext_user: match on user= field returned by external acl helper defined by external_acl_type
ext_user_regex: regular expression pattern matching on user= field returned by external acl helper defined by external_acl_type
HTTP_ACCESS
A tag “http_access” é quem define o que será feito com a regra que listamos anteriormente, as ACLs. Ela é quem vai dizer se o acesso será liberado ou bloqueado. Para tanto, devemos utilizar a seguinte forma:
http_access allow/deny nomedaacl
A opção allow ou deny é quem vai dizer se iremos liberar ou negar o acesso a aquela ACL. É possível utilizar o caracter ”!” para realizar uma ACL ao contrário. O seguinte código:
http_access allow Safe_ports
libera o acesso para as portas definidas na ACL Safe_ports. Mas o código:
http_access allow !Safe_ports
Liberar para todas as portas MENOS as definidas em Safe_ports
A Ordem importa
As permissões são lidas na ordem que são colocadas. Se primeiros bloquearmos algo e depois liberarmos, não funcionará. É importante colocar a ordem corretamente. Para isso, mantenha seu arquivo de configuração sempre limpo
Bloqueando endereços
Vamos agora ver como podemos fazer para bloquear sites, baseado em uma lista de sites proibidos.
acl proibidos url_regex "/etc/squid/sitesproibidos"
http_access deny proibidos
Vejamos: Na primeira linha, chamamos uma ACL com nome de “proibidos”. A opção url_regex diz ao squid pesquisar dentro do arquivo /etc/squid/sitesproibidos a lista de endereços que queremos bloquear ou liberar. Na segunda linha, o comando http_access deny nos diz que queremos negar o acesso a esta ACL. Depois, é só criar o arquivo /etc/squid/sitesproibidos e adicionar os endereços que queremos. Lembre-se que o squid é case sensitive, ou seja, ele vai ler os endereços na lista da forma que forem digitados. WWW.GOOGLE.COM é diferente de www.google.com ou WwW.GoOgLe.CoM. Para evitar este detalhe , utilize a opção ”-i” como no exemplo:
acl proibidos url_regex -i "/etc/squid/sitesproibidos"
http_access deny proibidos
O que estiver na lista será bloqueado. Podemos colocar endereços inteiros, ou podemos bloquear sites baseado em uma palavra. Se em nosso /etc/squid/sitesproibidos estiver a seguinte listagem:
www.google.com
www.fix.inf.br
somente os sites www.google.com e www.fix.inf.br serão bloqueados. foo.google.com e bar.fix.inf.br não serão bloqueados.
Mas se colocarmos na nossa lista o seguinte:
fix
Todos os sites que contiverem essas palavras serão bloqueados. foo.google.com será bloqueado, assim como google.exemplo.com.br
Autenticação
Uma das outras possibilidades do squid é o bloqueio por usuário. Podemos criar uma lista de logins e senhas, ou integrar com outros métodos, como uma base de dados LDAP ou um servidor mysql. Veremos aqui como montar um sistema de autenticação básico, com uma lista de usuários e senhas em um arquivo de texto. Precisamos adicionar a linha
auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwd
em nosso arquivo /etc/squid/squid.conf se nosso linux for 64 bits e a linha:
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
em nosso arquivo /etc/squid/squid.conf se nosso linux for 32 bits. A localização do arquivo basic_ncsa_auth pode ser diferente em seu sistema. Utilize um comando como o whereis ou um find para encontrar o arquivo.
Esta linha ativa o sistema de autenticação “basic_ncsa_auth”, com o arquivo /etc/squid/passwd sendo nosso arquivo de usuários e senhas.
Vejamos:
acl todos proxy_auth REQUIRED
http_access allow todos
http_access deny all
Na primeira linha, definimos que uma ACL chamada todos que é de autenticação (proxy_auth). O REQUIRED diz que qualquer usuário autenticado irá se encaixar nessa ACL.
Na segunda linha, o http_access allow todos libera o acesso aos usuários autenticados. Na terceira linha o http_access deny all nega o acesso a todo o resto dos usuários.
O Squid nos permite um controle sobre os usuários que podem ou não acessar a rede, através de ACLs tipo:
acl diretoria proxy_auth usuario1 usuario2 usuario3
Aqui, temos uma acl chamada diretoria, onde serão lidados somente com os usuários chamados usuario1, usuario2 e usuario3.
Podemos ainda, criar um arquivo com esses usuários, assim como criamos um arquivo com sites bloqueados.
acl diretoria proxy_auth "/etc/squid/diretoria"
http_access allow diretoria
Delimitando horários
Agora, iremos limitar o acesso a rede por horário. Que tal deixarmos o acesso aos usuários comuns somente durante o horário comercial?
acl usuarios proxy_auth REQUIRED
acl diretoria proxy_auth "/etc/squid/diretores
acl horariocomercial time 08:00-18:00
http_access allow diretoria
http_access allow usuarios horariocomercial
http_access deny all
Pronto. Definimos a ACL dos usuários, dos diretores e na terceira linha a ACL do horário, dando o nome para ela de “horariocomercial” e definindo ela das 8 até as 18. Depois, liberamos o acesso da diretoria e na quinta linha, liberamos o acesso aos usuários de acordo com a ACL horariocomercial. Finalmente, negamos o resto. Simples, não é?
Deixando coisas de fora do squid
Algumas vezes queremos deixar algum endereço fora do cache. Alguns sites simplesmente funcionam melhor assim. Neste caso, devemos utilizar o código:
acl hotmail dstdomain .hotmail.com
always_direct allow hotmail
Assim, o hotmail.com será acessado diretamente, sem precisar passar pelo cache.
Cache local
O squid usa uma diretório para armazenamento de seu cache de páginas. Para isso, precisamos utilizar a linha “cache_dir” seguido do tipo de armazenamento, diretório a ser usado, número em megabites, do número de diretórios primários criados e depois do número de diretórios secundários. Sendo assim a linha:
cache_dir ufs /var/spool/squid/ 7000 16 256
diz que, o sistema a ser usado é o ufs, o diretório principal é o /var/spool/squid, serão usados 7Gb, serão criados 16 diretórios dentro do /var/spool/squid e mais 256 diretórios dentro de cada um desses 16. Este tipo de armazenamento em diretórios é o padrão do squid e funciona muito bem.
AVISO: Não deixe o squid ocupar todo o espaço do seu disco. Se for usar uma partição separada, use 20% a menos do que o tamanho total dela. Se for no seu disco primário, calcule baseado no taamnho do seu disco e em quanto livre você quer ter.
Proxy Transparente
Algumas vezes queremos deixa o squid transparente, ou seja, com que o usuário nem saiba da sua existência. Chama-se proxy transparente. Assim, o usuário não tem escolha, senão usar o proxy, sem precisar configurar ele no navegador.
Para ativarmos esta opção precisamos adicionar a opção:
http_port 3128 transparent
Já devemos ter uma linha chamada http_port 3128 no squid.conf. Simplesmente iremos adicionar a opção transparent ao lado.
Mas ainda precisamos de mais. Temos que fazer com que todas as requisições que entrem na porta 80 do nosso servidor (já que é a padrão da web) sejam reencaminhadas para a 3128 (evitando assim de alterar as configurações no navegador). Quem fará esse serviço é o iptables, com o comando:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
Lembrando das configurações de iptables, vemos que nessa linha dizemos ao iptables para utilizar a tabela nat, na chain PREROUTING, utilizando a interface eth0(importante notar se essa é a interface usada), no protocolo tcp, na porta 80, para dar um REDIRECT para a porta 3128. Simples, temos nosso proxy transparente agora.
#echo 1 > /proc/sys/net/ipv4/ip_forward Ou, numa maneira mais “elegante”: #sysctl -w net.ipv4.ip_forward=1
Referências
http://www.picoloto.com.br/linux/squid.php
http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch32_:_Controlling_Web_Access_with_Squid
http://wiki.squid-cache.org/
http://wiki.squid-cache.org/SquidFaq/
http://www.mlaureano.org/guias_tutoriais/GuiaInstSquid.htm