Português do Brasil English
Devin no Facebook  Devin no Twitter  RSS do Site 
Servidores    

Páginas de erros no squid


Comentários  8
Visualizações  
552.942

O squid é um servidor de proxy que geralmente é usado para servir os navegadores dos usuários e ser o intermediário entre eles e os servidores web espalhados pela Internet. Quando usamos proxy, uma característica importante é que todas as requisições são feitas pelo navegador, inclusive as de DNS. Isso significa que se o navegador conseguiu conectar-se ao servidor proxy, todo o resto das ações é feito pelo proxy. Quer ver um teste prático sobre isso? Um simples DNS hijacking!

Um exemplo: dns hijacking

Em um servidor Squid, altere o arquivo /etc/hosts e adicione uma linha como essa:

74.125.234.216 www.dominio-palhacitos.com.br

Reinicie o squid. Agora abra um navegador em outra máquina (que não tenha a modificação do /etc/hosts) e tente acessar esse www.dominio-palhacitos.com.br.

Exatamente… O domínio não existe na Internet e nem na máquina do navegador. Mas como o servidor squid conhece esse domínio pelo /etc/hosts, ele responde perfeitamente (no nosso exemplo, redireciona para a página do google). Parabéns, você acaba de fazer uma espécie de DNS Hijack: fez com que um domínio respondesse como se fosse outro.

Apesar de ser um exemplo dumau e que eu recomende você nunca usar isso para fins malévolos (:P), serve como um ótimo exemplo de como ver que as requisições do navegador passam todas pelo proxy, todas.

Como o squid lida com os erros

Normalmente e sem proxy, um navegador quando encontra algum erro apresenta sua própria página de erro. Mas agora com um proxy configurado, ele não tem como saber que possa ter acontecido algum erro. Para os navegadores, a conexão foi estabelecida e a requisição foi enviada. Se existe um DNS ou não, se o servidor web da página está funcionando ou não, é outra história.

Por causa disso, o squid vem com algumas páginas de erros amigáveis que substituem as do navegador. Tanto na versão 2.x quanto na 3.x.

Essas páginas de erros no squid se encontram nos diretórios (dependendo da versão e distribuição):

  • /usr/share/squid/errors
  • /usr/share/squid3/errors (Debian Ubuntu com squid 3.x)

Dentro desse diretório há vários outros com os idiomas das páginas. Como um bom software internacional, as páginas de erros no squid foram traduzidas para diversos idiomas. Por padrão, o squid identifica qual o idioma do navegador do usuário e apresenta as páginas na língua correspondente.

Vamos fazer um teste: certifique-se de que a linha do /etc/hosts do exemplo anterior não esteja presente e tente acessar o domínio www.dominio-palhacitos.com.br. Olha o que acontece por aqui:

Squid Erro DNS

Se eu não utilizar o proxy, olha como fica:

Navegador Erro DNS

Agora verifique o arquivo (varie o diretório de acordo com sua distribuição e versão) /usr/share/squid/errors/pt-br/ERR_DNS_FAIL. O que você modificar neste arquivo, vai aparecer na página de erro anterior (você precisará recarregar a configuração do squid). Faça o teste. Exemplo:

Squid Erro DNS em Pânico

Configurações

No arquivo de configuração do squid (exemplos: /etc/squid/squid.conf ou /etc/squid3/squid.conf), temos algumas diretrizes que controlam o comportamento dessas páginas de erros.

Na versão 2.x do squid, as coisas ainda eram um pouco simples e por isso só tínhamos poucas configurações relacionadas aos erros. Nessa versão, o squid não mostra os idiomas das páginas de erro dinamicamente através do idioma do navegador. Ao invés disso, a página com o idioma padrão geralmente é um link simbólico na diretriz error_directory.

O error_directory diz em qual diretório as páginas de erros estão, exemplo:

# em português
error_directory /usr/share/squid/errors/Portuguese

# em portugues na versão 3.x
error_directory /usr/share/squid/errors/pt-br

# ou em inglês
error_directory /usr/share/squid/errors/English

# em inglês na versão 3.x
error_directory /usr/share/squid/errors/en

# ou em chinês!
error_directory /usr/share/squid/errors/Traditional_Chinese

Se você usar o error_directory na versão 3.x, você perde a funcionalidade de variar os idiomas das mensagem de acordo com o idioma do navegador (cabeçalho HTTP Accept-Language).

No err_html_text, você pode especificar um e-mail ou link para o site responsável pelo proxy. Essa informação aparece nos templates via tag %L (mais detalhes em diante).

Já no deny_info, você consegue associar uma página de erro à um acesso negado criado por ACLs e o http_access. Muito útil para personalizar as páginas de acesso negado por departamento, grupos de usuários, empresas, entre outros.

Outras configurações disponíveis apenas na versão 3.x:

  • error_default_language: especifica um idioma caso a identificação do idioma no navegador falhar. Por padrão ele vai pro inglês (en);
  • error_log_languages: se (e apenas se) a identificação do idiona no navegador falhar, loga no cache.log. Útil para detectar idiomas não suportados. Padrão ligado (on);
  • email_err_data: junto ao link de e-mail na página erro, enviar também o conteúdo do erro no corpo do e-mail. Padrão ligado (on);
  • err_page_stylesheet: um arquivo css padrão para ser usado nas páginas de erros. Nos templates, o conteúdo do arquivo é substituído na tag %l.

Templates

Dentro do diretório de páginas de erros, temos uma série de arquivos, cada um para um erro diferente. Alguns dos mais importantes são:

  • ERR_ACCESS_DENIED: Acesso negado. Usado quando o usuário tenta acessar algo que uma ACL (e o http_access) não permitiu;
  • ERR_ACL_TIME_QUOTA_EXCEEDED: Quota de tempo Excedida. Usado quando o usuário é limitado a uso por tempo e passa desse limite;
  • ERR_CACHE_ACCESS_DENIED: Acesso negado ao cache. Usado quando o usuário precisa de usuário e senha corretos para usar o proxy;
  • ERR_CACHE_MGR_ACCESS_DENIED: Acesso negado ao gerenciador de cache. Mesmo que o anterior, mas para o gerenciador do proxy squid;
  • ERR_CANNOT_FORWARD: Impossível encaminhar esta requisição nesse momento. Usado quando o proxy não consegue sair pela Internet (ou outro proxy) para buscar a página;
  • ERR_CONNECT_FAIL: Conexão falhou. Usado quando o proxy não conseguiu se conectar no servidor web da página requisitada;
  • ERR_DIR_LISTING: Não é necessariamente uma página de erro. Para diretórios sem um documento de índice (exemplo: index.html) e que listam seus arquivos, o squid pode montar uma página personalizada. Listagem de FTPs são um exemplo para esta página;
  • ERR_DNS_FAIL: O proxy não conseguiu resolver o IP do domínio pedido pelo usuário;
  • ERR_FTP_DISABLED: Usado quando o usuário tenta usar um FTP via proxy mas na configuração o suporte à FTP está desabilitado;
  • ERR_FTP_FAILURE: Mostra um erro genérico que pode ter acontecido numa requisição FTP;
  • ERR_FTP_UNAVAILABLE: Mostra o erro genércio que pode ter acontecido ao tentar se conectar a um servidor FTP (exemplo: muito ocupado);
  • ERR_FTP_*: Diversas mensagens sobre erros de FTP: falhas nos comandos put, delete, permissão negada, não encontrado, entre outros;
  • ERR_INVALID_REQ: Requisição inválida. O cliente mandou uma requisição de forma errada. Requisições de proxy são diferentes de requisições HTTP comuns;
  • ERR_INVALID_RESP: Resposta inválida. O servidor web mandou uma resposta HTTP inválida de volta;
  • ERR_INVALID_URL: URL inválida. O cliente requisitou uma URL que não tem nada haver com nada e não seguem os padrões (dá zero pra ele);
  • ERR_LIFETIME_EXP: Tempo de conexão expirou. O proxy cansou de esperar o servidor web responder e desistiu da requisição. Pode ocorrer com intermitências na rede, firewalls, e outros tipos de time outs;
  • ERR_READ_TIMEOUT: Tempo de leitura expirou. O proxy conseguiu se conectar no servidor web, mas cansou de esperar uma resposta de requisição. Pode ocorrer quando o servidor está sobrecarregado;
  • ERR_READ_ERROR: Erro de leitura. Usado quando a conexão da requisição com o servidor web termina abruptamente, como um erro de rede.
  • ERR_WRITE_ERROR: Erro ao enviar. Usando quando conexão do envio de dados com o servidor web termina abruptamente, como um erro de rede;
  • ERR_SECURE_CONNECT_FAIL: Falha na conexão segura. Usado quando há alguma falha no estabelecimento de uma conexão SSL entre o cliente e o servidor Web;
  • ERR_SHUTTING_DOWN: Desligando. Quando o cliente pede alguma página, mas o squid está sendo desligado e por isso não pode responder;
  • ERR_TOO_BIG: A requisição é grande demais (ui). Usado quando o usuário tenta mandar ou obter algo muito grande pela rede e isto não é permitido pelo proxy;
  • ERR_UNSUP_HTTPVERSION: Versão HTTP não suportada. Não adianta pedir um GET com versão HTTP/5.0, porque não existe essa versão e o squid manda essa página de erro;
  • ERR_UNSUP_REQ: O tipo de requisição (GET, PUT, etc) não é suportada pelo squid;
  • ERR_ZERO_SIZE_OBJECT: Resposta de tamanho zero. Usado quando o proxy conectou-se ao servidor web, requisitou a página, mas a resposta veio vazia;

Tags que podem ser usadas nos templates

Os templates das páginas ERR_ podem ganhar um pouco de dinamismo usando as tags. É só usar uma tag e o squid substitui pelo dado correspondente. Estas são as tags:

  • %a: Identidade do usuário (o usuário HTTP caso tenha se autenticado);
  • %B: URL do FTP formatado com ‘%2f’;
  • %c: Código de erro do Squid;
  • %D: detalhes sobre o erro gerados pelo squid (para versão 3.2.0.4+);
  • %e: número do erro;
  • %E: número do erro traduzido em uma string (vira um código ;P);
  • %f: Requisição FTP usada;
  • %F: Resposta do FTP;
  • %g: Mensagem do servidor FTP;
  • %h: O hostname do proxy (opção visible_hostname na configuração);
  • %H: O hostname do servidor web;
  • %i: Endereço IP do cliente / usuário;
  • %I: Endereço IP do servidor web;
  • %l: CSS local (opção err_page_stylesheet, para versão 3.1+);
  • %L: Conteúdo da opção err_html_text;
  • %M: Método de requisição (GET, POST, PUT, etc…);
  • %m: Mensagem de erro retornada pelo autenticador externo (quando usado, opção auth_param);
  • %o: Mensagem retornada pelo autenticador externo (quando usado, opção auth_param);
  • %p: Porta da URL usada;
  • %P: Protocolo usado;
  • %R: A requisição HTTP completa;
  • %S: A assinatura padrão do squid;
  • %s: O nome do software e a versão;
  • %t: Hora local;
  • %T: Hora universal (UTC);
  • %U: URL sem a senha;
  • %u: URL com a senha (versão 2.5+);
  • %W: Detalhes sobre o erro encodados para URL (para o link de mandar e-mail pro administrador);
  • %w: Endereço de e-mail do administrador do cache (cachemgr;
  • %x: Identificador ou nome de erro específico em nível de aplicação (exemplo: SSL);
  • %z: Mensagem de erro do DNS;
  • %Z: Mensagem gerada enquanto um processo falha (exemplo: processamento ESI).

Casos de uso

Algumsa dicas do que fazer com essas páginas de erro:

  • Personalizar as páginas de acesso negado por departamento, grupos de usuários, empresas, entre outros, com a opção deny_info;
  • Direcionar erros de DNS para uma página de busca;
  • Adicionar ajuda ao usuário em todas as páginas;
  • Colocar a cara da empresa nas páginas de erro, com links que ajudam o usuário;

Agradecimentos e Referências

Obrigado por Tobias Sette Ferreira por ter me dado a idéia do tutorial enquanto me perguntava sobre algo relacionado à este assunto.

Outras páginas com esse assunto:

552.942

Comentários  8
Visualizações  
552.942


TagsLeia também

Apaixonado por Linux e administração de sistemas. Viciado em Internet, servidores, e em passar conhecimento. Idealizador do Devin, tem como meta aprender e ensinar muito Linux, o que ele vem fazendo desde 1997 :-)


Leia também



Comentários

8 respostas para “Páginas de erros no squid”

  1. Raí Carvalho disse:

    Grande artigo manow, Parabéns !

  2. Christian disse:

    muito bom kra ! vlw mesmo ! Por favor siga compartilhando mais tutoriais … vlw !!!

  3. Alexandre disse:

    otimo artigo Man!!
    e estou com um problema, fiz um servidor dhcp + squid transparente + iptables e funcionando legal porem quando acesso pagina do google aparece erro de conexao SSL, porem todas as outras paginas acessa normal só o google que nao, voce sabe oq pode ser?

  4. Douglas disse:

    ótimo artigo. Atualizei meu proxy cache para versão 3.3.8 e o diretório das páginas de erros estavam apontando pro lugar errado e mesmo reiniciando o squid ele não mostrava o erro. Resolvido. Outro exemplo legal foi do dns hijacking. Parabéns pelo artigo.

  5. Daniel Zanata disse:

    Legal o tutorial mais será que teria como dar uma luz ai com pop, imap e smtp?kk
    O que eu faço para conseguir funcionar os emails enviar/receber… lembrando meu squid é autenticado (squid + mysql), já utilizei inúmeros iptables e nada resolveu.

  6. felipe disse:

    ola amigo. tudo bem? otimo site, otimos tutoriais. você faz serviços em servidores?

  7. Weverton Lubask disse:

    Excelente tópico, porém saberia dizer o porque quando utilizo o %a não está retornando o nome de usuário?

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *