MAL - Memória Auxiliar do Lutieri

quarta-feira, setembro 05, 2007

POG no Mysar

Já escrevi um artigo anteriormente falando do mysar.

Implementei o squid com autenticação NTLM. Sendo assim quando o browser envia uma requisição para o squid ele nega e aí o browser envia novamente a requisição acompanhada da autenticação. O problema é que esse primeiro registro, que é a requisição de um objeto sem a autenticação também é logado. Quando eu vou ver os relatórios tem um monte de acessos com username igual a hífen. E isso é um saco. Sendo assim tomei liberdade de modificar o código fonte do mysar-importer.php.

Esse é o script que faz a importação dos dados do arquivo access.log para o banco de dados MySql. Lá pela linha 170 do arquivo bin/mysql-importer.php, estou usando a versão 2.1.4, inseri mais uma simples condição que resolve o meu problema:

if($dbRecord['authuser']=='-') {
updateConfig('lastLogOffset',ftell($handle));
continue;
}


That's all folks!

Marcadores:

SQUID: Software caused connection abort

httpAccept: FD 47: accept failure: (53) Software caused connection abort
httpAccept: FD 47: accept failure: (53) Software caused connection abort
httpAccept: FD 47: accept failure: (53) Software caused connection abort
httpAccept: FD 47: accept failure: (53) Software caused connection abort
httpAccept: FD 47: accept failure: (53) Software caused connection abort
httpAccept: FD 47: accept failure: (53) Software caused connection abort
httpAccept: FD 47: accept failure: (53) Software caused connection abort
httpAccept: FD 47: accept failure: (53) Software caused connection abort
httpAccept: FD 47: accept failure: (53) Software caused connection abort
httpAccept: FD 47: accept failure: (53) Software caused connection abort
httpAccept: FD 47: accept failure: (53) Software caused connection abort
httpAccept: FD 47: accept failure: (53) Software caused connection abort
httpAccept: FD 47: accept failure: (53) Software caused connection abort

É assim que anda o cache.log do meu squid.

Procurei tanto as respostas pra isso e só via uma palavra que hoje ecoa dentro da minha cabeça:

harmless

Eu vou estar com 70 anos e não vou esquecer o significado: "que não causa danos".

Não causa danos... aham.. isso quando for lá de vez em quando que essa mensagem for vista. No meu caso essa desgraça aparece umas 40 vezes por minuto. Procurando mais próximo a fonte, leia-se squid-user mailing list, encontrei um dos desenvolvedores falando a mesmíssima coisa:
This is a harmless message.

Tá! o fato é que ela tava me causando danos sim. Estava criando arquivos de log com tamanhos desnecessários. Portanto resolvi apelar. Descobri que uma boa forma de ter um sistema rodando sem erros é indo lá e comentando a linha de código onde diz algo como: printf... echo... debug....

Pronto!!! Os erros não aparecem mais nos logs :-) Isso que é a real POG.

Bom... mas claro que eu como um administrador não posso simplesmente ocultar o erro. Mas Henrik Nordstrom pode. Ele é o cara que recomendou fazer essa gambiarra. E ele não é nada mais nada menos que o cara que desenvolve o squid. Portanto se ele diz que pode eu acredito.

Vamos ao workaround, a.k.a, POG:


No código fonte do squid temos o seguinte arquivo: src/client_side.c
No meu caso, estou rodando a versão 2.6stable14. Sendo assim, encontro dentro desse arquivo, mais precisamente na linha 4513, o seguinte comando:

debug(50, 1) ("httpAccept: FD %d: accept failure: %s\n",


HA HA! tá aqui a fonte da minha cefaléia.

Henrik recomenda aumentar o nível do log que é o segundo parâmetro do comando debug. Está atualmente setado para 1, como se pode ver. 0 é crítico, 1 é nível importante e acima de 2 é para debug.

Sendo assim nossa linha 4513 fica assim:

debug(50, 2) ("httpAccept: FD %d: accept failure: %s\n",

Henrik disse isso aqui.

Para efetuar esse procedimento no FreeBSD através do ports deve-se proceder da seguinte maneira:

cd /usr/ports/www/squid
make fetch
make config
make patch
vi work/squid-2.6STABLE14/src/client_side.c
:4513


Coloca o cursor sobre o número 1 e pressione CTRL+a. Isso incrementa o número. E só por curiosidade CTRL+x decrementa.

:x
make install clean

E todos viveram felizes para sempre.

Marcadores: ,

terça-feira, setembro 04, 2007

Seções squid para fazer debug

#cat debug-sections.txt

section 0 Announcement Server
section 0 CGI Cache Manager
section 0 Client Database
section 0 Debug Routines
section 0 DNS Resolver
section 0 WWW Client
section 1 Startup and Main Loop
section 2 Unlink Daemon
section 3 Configuration File Parsing
section 4 Error Generation
section 5 Socket Functions
section 6 Disk I/O Routines
section 7 Multicast
section 8 Swap File Bitmap
section 9 File Transfer Protocol (FTP)
section 10 Gopher
section 11 Hypertext Transfer Protocol (HTTP)
section 12 Internet Cache Protocol
section 13 High Level Memory Pool Management
section 14 IP Cache
section 15 Neighbor Routines
section 16 Cache Manager Objects
section 17 Request Forwarding
section 18 Cache Manager Statistics
section 19 Store Memory Primitives
section 20 Storage Manager
section 21 Misc Functions
section 22 Refresh Calculation
section 23 URL Parsing
section 24 WAIS Relay
section 25 MIME Parsing
section 26 Secure Sockets Layer Proxy
section 27 Cache Announcer
section 28 Access Control
section 29 Authenticator
section 30 Ident (RFC 931)
section 31 Hypertext Caching Protocol
section 32 Asynchronous Disk I/O
section 33 Client-side Routines
section 34 Dnsserver interface
section 35 FQDN Cache
section 36 Cache Directory Cleanup
section 37 ICMP Routines
section 38 Network Measurement Database
section 39 Cache Array Routing Protocol
section 40 User-Agent and Referer logging
section 41 Event Processing
section 42 ICMP Pinger program
section 43 AIOPS
section 44 Peer Selection Algorithm
section 45 Callback Data Registry
section 46 Access Log
section 47 Store Directory Routines
section 48 Persistent Connections
section 49 SNMP
section 50 Log file handling
section 51 Filedescriptor Functions
section 52 URN Parsing
section 53 AS Number handling
section 54 Interprocess Communication
section 55 HTTP Header
section 56 HTTP Message Body
section 57 HTTP Status-line
section 58 HTTP Reply (Response)
section 59 auto-growing Memory Buffer with printf
section 60 Packer: A uniform interface to store-like modules
section 61 Redirector
section 62 Generic Histogram
section 63 Low Level Memory Pool Management
section 64 HTTP Range Header
section 65 HTTP Cache Control Header
section 66 HTTP Header Tools
section 67 String
section 68 HTTP Content-Range Header
section 69 HTTP Header: Extension Field
section 70 Cache Digest
section 71 Store Digest Manager
section 72 Peer Digest Routines
section 73 HTTP Request
section 74 HTTP Message
section 75 WHOIS protocol
section 76 Internal Squid Object handling
section 77 Delay Pools
section 78 DNS lookups
section 79 Lowlevel store I/O
section 80 WCCP
section 81 Cache Store
section 82 External ACL
section 83 SSL accelerator support
section 84 Helper process maintenance

Exemplo:
debug_options ALL, 1 28,3

Marcadores:

segunda-feira, setembro 03, 2007

Lentidão no SQUID em FreeBSD

Pra quem quer acompanhar o sofrimento de um pobre admin unix acesse:

http://www.fug.com.br/historico/html/freebsd/2007-08/threads.html#00809

Acho que foi uma das threads mais longas da lista. Mas juro. Eu não queria.

Fui inventar de migrar o firewall e proxy que estão(avam) rodando com Debian para FreeBSD. Que vamos combinar: é muito melhor e mais fácil de usar. Isso mesmo. Eu sempre ouvi que o FreeBSD é casca grossa. Que tudo era difícil. Que difícil o que.. Em menos de um mês, bem folgado, fazendo outras coisas ao mesmo tempo, migrei o meu firewall de iptables para PF, migrei o serviço de DNS, HTTP, NTP, Nagios e migrei também o Squid. E é aí que começa meu problema.

Ouvi dizer por aí, que o squid tem problemas de I/O pra rodar no FreeBSD. Bom.. meu problema foi que quando fiz a migração dos clientes para esse proxy novo, no FreeBSD, após ter uns 45/50 usuários fazendo uso do mesmo, isso significa 10 minutos depois de mudar o IP do registro PROXY no servidor DSN, O acesso a internet ficava lentíssimo e cada vez piorava mais.

Aprendi que quando se instala um sistema operacional novo, antes de mais nada deve-se testar o hardware pra ter certeza de que tudo está em perfeita ordem. Do contrário, vai acontecer que você vai descobrir um problema como lentidão no squid e pode ser disco, memória, kernel, placa de rede, enfim... temos várias opções.

Então o melhor é testar todo o hardware antes de começar acusar um pobre software.

Faça algumas coisas como:
  • Teste a memória RAM;
  • Use ferramentas de benchmark;
  • Teste escrita/leitura de discos;
  • Teste a controladora SCSI;
  • Teste as placas de rede;
  • Obtenha velocidades máximas dos itens citados acima;
  • Instale ferramentas como o munin para acompanhar o status do servidor.

Eu descobri que isso deve ser feito de uma maneira não muito agradável. Comecei threads acusando o squid de lentidão quando lá pelas tantas descobri que podiam ser meus discos. Sorte que não foi.. senão eu ia passar vergonha...

Cheguei a entrar na lista de discussão freebsd-scsi para questionar sobre a velocidade da minha controladora. Sendo que eu achava que era baixa demais e me mostraram que era decente a velocidade que eu estava obtendo.

Portanto antes de sair por aí botando a culpa em alguma coisa, seja software, hardware, firmware tenha certeza disso. As pessoas vão se basear no que você fala para poder te ajudar.

Voltando ao problema:

A migração do squid, rodando em linux, para o novo, rodando em FreeBSD, era feita apenas mudando o IP de um registro DNS. Baixava o TTL do regsitro para 1 minuto e alterava-o para apontar para o servidor novo. No momento que batia a lentidão eu trocava o IP, de novo, para apontar para o servidor velho(linux).

Esse registro está configurado em todos os navegadores da empresa através de um GPO do windows.

É uma forma de fazer migração que eu considero bastante vantajosa. Uma vez que, se não funcionar de primeira é muito simples voltar para a situação anterior.

Acredite: troquei várias vezes esse IP. hehe

Iniciei meus testes recompilando o kernel. Fiz um artigo contendo os arquivos necessários e que devem ser modificados e os passos para compilar o kernel. Link aqui.

Bom alterei o cache do squid para diskd entre outras mudancas no squid.conf que coloco no final do artigo.

Bom as mudancas que fiz foram tantas e de uma vez soh que nao consegui saber exatamente o que solucionou o problema. Mas vamos analizando:

As alterações foram as seguintes:

  • Compilei o squid2.6stable14 com o gcc42
  • Utilizei os seguintes parâmetros para a compilação: make -DNO_KERBEROS SQUID_CONFIGURE_ARGS="--enable-dlmalloc --enable-async-io --with-pthreads --with-aio --enable-ntlm-fail-open" SQUID_LANGUAGES="English Portuguese" install
  • Atualizei o samba da versão que estava na versão 3.0.23 para a mais recente no ports a 3.0.25a. Com isso foi atualizado o /usr/local/bin/ntlm_auth também.

Apesar de ter feito todas as alterações, acima citadas, de uma só vez, acredito que a solução se deu por causa dos parâmetros passados ao squid.

Já havia compilado sem esses parâmetros com o gcc 4.2 e o problema persistia.
Já havia compilado com a opção --enable-async-io e também não havia resolvido.

Acredito ter sido por causa dos parâmetros restates: --enable-dlmalloc --with-pthreads --with-aio --enable-ntlm-fail-open

Na lista squid-users me indicaram setar a opção half_closed_clients para off. Também com ela sozinha não havia solucionado a lentidão.

Ou ainda a solução se deu por atualizar o samba. Uma vez que eu uso autenticação NTLM contra um AD W2k3.

Por fim, quando eu não usava autenticação o proxy funcionava extremamente bem, porém se eu ativasse apenas uma ACL se quer, que envolvesse autenticação, a lentidão dava sua cara.

Infelizmente testar opção por opção para descobrir qual foi a que solucionou o problema se torna inviável. Levando em consideração que esse proxy já deveria estar em produção há mais tempo não posso testar agora.

Lembre-se: São nessas horas de dificuldades que devemos honrar o saco no meio das pernas. Não desista, por mais difícil que esteja sendo. É apenas uma monte de linhas de código. Apenas instruções lógicas empilhadas. Tem que funcionar e ponto.

E vencendo as dificuldades você se sente melhor e se o seu chefe acompanhou seu sofrimento e viu que você venceu e dá crédito a você. E isso é bom... hehe






squid.conf:

grep -v "^#" /usr/local/etc/squid/squid.conf | grep -v "^\ " | grep -v ^$
http_port 1xxx.xxx.xxx.xxx:3128
http_port 127.0.0.1:3128
icp_port 0
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
cache_mem 600 MB
maximum_object_size 64 MB
minimum_object_size 0 KB
maximum_object_size_in_memory 2560 Kb
cache_replacement_policy heap LFUDA
memory_replacement_policy heap GDSF
cache_dir diskd /cache/1 4520 16 256 Q1=128 Q2=100
cache_dir diskd /cache/2 4520 16 256 Q1=128 Q2=100
access_log /usr/local/squid/logs/access.log squid
auth_param ntlm program /usr/local/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp -d 2
auth_param ntlm children 60
auth_param ntlm keep_alive on
auth_param basic program /usr/local/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 10
auth_param basic realm Proxy server
auth_param basic credentialsttl 2 hours
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
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 Safe_ports port 900 # Sinercom
acl CONNECT method CONNECT
acl password proxy_auth REQUIRED
acl redelocal src 192.168.0.0/16
acl redelocal src 172.16.0.0/16
acl sitesemcache url_regex -i "/usr/local/etc/squid/semcache.txt"
always_direct allow sitesemcache redelocal
no_cache deny sitesemcache
acl paginapare dstdomain squidweb.xyz.gov.br
acl usuarioslib proxy_auth -i "/usr/local/etc/squid/usuarioslib.txt"
acl usuariosrestritos proxy_auth -i "/usr/local/etc/squid/usuariosrestritos.txt"
acl usuarios_chineses proxy_auth -i "/usr/local/etc/squid/chineses_msn.txt"
acl msn_chineses url_regex -i gateway.messenger.
acl msn_chineses url_regex -i login.live.com
acl msn_chineses url_regex -i gateway.dll
acl msn_chineses url_regex -i msn.com
acl bloqueados url_regex -i "/usr/local/etc/squid/bloqueados.txt"
acl liberados url_regex -i "/usr/local/etc/squid/liberados.txt"
acl servidores src "/usr/local/etc/squid/servidores.txt"
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
deny_info http://malware.hiperlinks.com.br/denied.shtml malwares
http_access allow servidores
http_access allow liberados password
http_access allow usuarioslib
http_access deny usuariosrestritos
http_access deny bloqueados all
deny_info http://squidweb.xyz.gov.br bloqueados
http_access allow localhost
http_access allow redelocal password
http_access deny all
http_reply_access allow all
icp_access allow all
visible_hostname proxy
logfile_rotate 5
forwarded_for off
header_access From deny all
header_access Server deny all
header_access Link deny all
error_directory /usr/local/etc/squid/errors/Portuguese
coredump_dir /usr/local/squid/cache

Marcadores: ,

quinta-feira, março 01, 2007

MSN liberado através do SQUID

Hoi!(olá em holandês) :

Houve a necessidade de ser liberado o MSN aqui na empresa para alguns usuários. Inicialmente foram liberados os IP's dos usuários e a porta 1863 para os mesmos. Porém, alguns usuários tinham notebooks e se moviam de um site da empresa pra outro sendo que, por razões de roteamento, não seria possível usar o mesmo IP em sites diferentes. Por isso surgiu a necessidade de que fosse liberado o usuário e não mais o IP.

Tenho na lista de bloqueio várias palavras-chaves e sites. Sei que estava bloqueando o MSN através do proxy.

Bom, vamos começar a configuração no cliente msn. Montei uma imagem pra ajudar:


Imagem

É só seguir os números e configurar o usuário e senha para o servidor http proxy.
No meu caso, não estava disponível os campos para servidor e porta, pois ele pegou do internet explorer e alguma GPO do windows bloqueou.

Bom, no squid tive que criar as seguintes regras:

##Usuarios
acl usuarios_msn proxy_auth -i "usuarios_msn.txt"
##Site MSN
acl msn url_regex -i gateway.messenger.
acl msn url_regex -i login.live.com
acl msn url_regex -i gateway.dll
acl msn url_regex -i msn.com

##ACL's MSN
http_access allow usuarios_msn msn
http_access deny usuarios_msn all


No arquivo usuarios_msn.txt deve conter o nome dos usuários que terão acesso ao msn via proxy.

as URL's liberadas eu constatei através do acompanhamento do log do squid. Configurei o MSN pra navegar via proxy com o usuário JOHN. E usei o tail pra verificar quais endereços o msn tentava acessar:

tail -f /var/log/squid/access.log | grep JOHN

Essa configuração foi feita usando o msn Live 8. alguma coisa... Acredito que deve funcionar pra qualquer versão que aceite proxy http com autenticação.


Burn dia!!!

Marcadores:



Chat with Lutieri G. B.

Subscribe in a reader