Squid - Dicas - script, modelos e comandos na manutenção de servidor proxy - Squid

Atualizado em: 04/09/2006



Sobre este documento

Resumo de comandos, linhas de comando e scripts utilizados na manutenção de servidor proxy - Squid (na minha opinião e como eu uso, copiar e colar)

Os comandos e dicas podem não atender as suas necessidades, não ser compatível com sua instalação, use como referencia, tente adaptar ao seu ambiente.


Dicas - Solução de problemas

Tente instalar e configurar por partes, tente isolar o problema, facilita na localização do problema e solução, na manutenção ou instalação tente seguir esta ordem.

Passo 1 - Configure o servidor para navegar e pingar as maquinas da rede interna, configure as duas placas de rede e teste com ping para a rede interna e internet, prossiga com a instalação somente depois de obter respostas do comando ping para as maquinas da rede interna e navegar normalmente, quando não tem ambiente gráfico na maquina, use o lynx para testar a navegação, wget para download, outro serviço que possa testar o funcionamento da internet, ou arrisque prosseguir com o ping, no caso do ping faça testes com ping para um dominio.

Passo 2 - Compartilhe a conexão, sem firewall, somente compartilhe para testar a navegação a partir de uma estação, em lugar do firewall utilize estas regras de iptables.

  modprobe iptable_nat
  iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
  echo 1 > /proc/sys/net/ipv4/ip_forward

Ajuste o device de acordo com sua rede, ppp0 como no exemplo acima para conexões via modem discado ou ADSL conectado via pppoe, conexões de ADSL com IP fixo ou obtido por DHCP o device é eth0, altere no exemplo acima para o device em uso.

Passo 3 - Configure a estação para navegar, ainda não tem nada de proxy, configure somente o gateway e DNS, com esta configuração a estação navega sem restrição alguma, veja mais dicas sobre compartilhamento de internet em

http://www.zago.eti.br/adsl-compartilhar.txt

Somente depois que conseguir navegar a partir de uma estação, passe para a configuração do Squid.

Passo 4 - Instale, configure e inicie o Squid, lembrando que não basta instalar, a configuração padrão não funciona, precisa de alguns ajustes na configuração. Explicando, precisa de um ajuste minimo no squid.conf, diretivas como classe de IP da rede, nome da maquina e outros detalhes, dependendo do controle desejado precisa criar ACL, usuários, senhas e outros detalhes. Tente fazer uma configuração sem controle algum, pelo menos para entender o funcionamento, subir o Squid e testar a navegação, no FAQ tem varios modelos prontinhos para copiar e colar, não deve servir para o seu proposito, mas são instalações testadas e que funcionam, utilize uma delas pelo menos para entender como funciona e testar, depois faça a sua configuração a partir de zero, para trocar a configuração, basta substituir o squid.conf, apagar cache e recriar novamente, não precisa remover ou reinstalar nada, somente limpar o cache e trocar o squid.conf, também criar ou alterar as ACL conforme a nova configuração.

Inicie o squid e verifique se está rodando OK, prossiga com os proximos tópicos somente depois de iniciar sem mensagens de erro e o status acusar que está rodando.

Passo 5 - Redirecionando o trafego da porta 80 para a porta 3128, altere as regras de compatilhamento, de novo, ajuste o device caso seja diferente de ppp0 como neste exemplo, ajuste também a classe de rede caso seja diferente de 192.168.1.0.

  modprobe iptable_nat
  /usr/sbin/iptables -t nat -A PREROUTING -p tcp -m multiport -s 192.168.1.0/24 --dport 80,443 -j REDIRECT --to-ports 3128
  /usr/sbin/iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
  echo 1 > /proc/sys/net/ipv4/ip_forward

Antes de configurar a estação, teste a rede novamente, mesmo aplicando a regra acima, nas estações o ping tem que alcançar dominios na internet.

Passo 6 - Configurar estações para usar o proxy, no navegador, procure pelas opções de configuar proxy, em IP informe o IP do micro que roda Squid em porta informe 3128, salve a configuração e teste a nevagação, as condições de acesso a sites vai depender da configuração do Squid, de qualquer forma vai obter alguma resposta, navegar ou a tela de erro do Squid, não esqueça dos logs, no servidor abra um console e execute a linha de comando.

tail -f /var/log/squid/access.log

Este comando exibe no console as mensagens de log, exibe em tempo real, no momento em que estão sendo formadas, tente a navegação na estação e veja os resultados no console, até aqui fica fácil isolar o problema, se navegava antes do redirecionamento e agora não navega, já sabe onde procurar, inicie verificando se está o Squid está rodando, configurações do squid, diretivas, ACL, permissões nos arquivos e diretórios utilizados pelo squid, documentação de configuração do Squid, pegue a mensagem de erro e coloque na caixa de pesquisa do Google..

Procure também nas mensagens de outros arquivos de log do sistema, qualquer dúvida volte ao inicio e vá testando passo a passo, quando Ok, configure o firewall.

Passo 7 - Firewall, as regras acima não tem proteção alguma, maquinas de cara para a internet precisa de um firewall minimo, os exemplos acima são regras para compartilhar e não oferece proteção, portanto precisa criar seu firewall, como pode notar, precisa de uma linha de comando no firewall para redirecionar o trafego da porta 80 para a porta 3128 controlada pelo Squid, no seu firewall substitua a linha que faz NAT por esta linha.

/usr/sbin/iptables -t nat -A PREROUTING -p tcp -m multiport -s 192.168.1.0/24 --dport 80,443 -j REDIRECT --to-ports 3128

Lembrando que o Squid controla somente a navegação pela porta 80, os demais serviços que utilizam outras portas são controlados pelo Iptables, tais como clientes de e-mail, eles utilizam as portas 25 e 110 que não passam pelo squid, conexões via ssh que utilizam a porta 22, outros serviços que utilizam outras portas diferente da porta 80, configure e controle com regras no iptables, um exemplo para fazer NAT para o restante, tudo que não passar pela porta 80, no firewall, coloque depois da regra de redireconamento.

  /usr/sbin/iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE 
  echo 1 > /proc/sys/net/ipv4/ip_forward

Criar ambiente de testes e backup da instalação

Considere criar um ambiente de testes, não adianta reclamar que não tem "verba" ou não tem maquina, não custa nada, o pouco tempo que investir agora vai lhe poupar muito mais no futuro além de evitar muitos problemas, considere um bom investimento de tempo, pode instalar diversos squid pela rede sem problema algum.

Veja dicas de como fazer duas instalações Linux no mesmo HD, utilize estações para testes, evite em servidores embora seja possivel, passo a passo em
http://www.zago.eti.br/boot_div.txt

Dual boot Linux e windows - Aproveite e veja a dica sobre backup da instalação completa do windows na partição Linux, quando algum virus comer o windows ou precisar reinstalar, vai poupar muito tempo, basta uma simples cópia de volta para recuperar a instalação do windows, passo a passo em.
http://www.zago.eti.br/boot-dual-win-e-linux.html

Nesta estação (instalação) de testes, vai consumir somente parte do espaço do HD e nada mais, utilizando maquina que está atrás de firewall não precisa de mais uma placa de rede, funciona com somente uma placa, configure a nova instalação como uma estação para acessar à internet, sem passar por outro Squid, caso já tenha algum fazendo o controle de acesso à internet, caso ele esteja rodando ma maquina que compartilha a conexão, então inclua no firewall a regra que exclua a maquina de testes do proxy, com esta maquina navegando sem passar por outro proxy voce tem o servidor que precisa para seus testes, basta instalar o Squid e configurar uma estação para usa-lo como servidor proxy, ou melhor alterar o endereço de proxy e gateway apontando para o IP da maquina testes.

Regra de iptables para excluir um IP do redirecionamento, no meu firewall para excluir a maquina de testes, utilizo esta regra.

  /usr/sbin/iptables -t nat -A PREROUTING -i eth1 -s \! 192.168.1.53 -p tcp -m multiport  --dport 80,443 -j
   REDIRECT --to-ports 3128
  /usr/sbin/iptables -A POSTROUTING -t nat -o eth0 -j MASQUERADE

Neste exemplo a estação com IP 192.168.1.53 acessa internet sem passar pelo proxy e pode ser usada para rodar outro squid, nesta maquina configure o squid, utilize outra estação da rede para utilizer este novo Squid, altere somente o endereço de IP do proxy e gateway apontando para o segundo servidor proxy, prontinho, tenho outro Squid rodando e estações passando por ele, este segundo proxy sai pelo firewall sem problema algum, ambiente perfeito para testes.

Além de testes ou para backup, serve também como um segundo proxy, não encontrei utilidade para esta opção, mas é possivel manter dois squid na mesma rede, rodando independente e com regras diferentes,

Em ambiente de testes vale usar um modem discado nesta maquina, esta opção também é indicada para testar firewall, regras de squid e outros serviços de rede, pode até ser usado quando cai o link ou ADSL, embora muito mais lento permite acesso à internet enquanto o ADSL não volta.

Com o squid configurado na maquina de testes (clone do principal), utilize qualquer estação da rede, configure ou altere as configurações de proxy apontando para o servidor de testes, prontinho, tem tudo que precisa para testar ACL, diretivas do Squid e muito mais, quando concluir a configuração, basta repetir o processo no principal, ou simplificando, copiar os arquivos de configuração.

Considere manter esta instalação como backup, em casos de emergencia, nunca se sabe quando vai ocorrer acidentes, queimar a maquina, HD ou uma pane na configuração que pare tudo, nestas situações basta alterar o IP que as estações nem ficam sabendo da troca, em menos de um minuto se faz a troca do IP e sobe o Squid.

Use ferramentas como VNC, SSH, FreeNX, Putty e outras, não fique pulando pra lá e pra cá, indo de maquina em maquina, a partir do ambiente gráfico da maquina Linux, abra um console para acompanhar os logs e acesse o VCN da estação windows para simular o uso. A partir da estação windows faça conexão via FreeNX ou Putty para abrir o console e acompanhar os resultados do que acontece com os acessos pela estação windows.

Ainda está difícil, faltando opções?, problemas com falta de hardware?, então use maquina virtual, veja dicas no FAQ;
http://www.zago.eti.br/qemu.txt

Porque não pensei nisso antes!

Resumo - Dicas - Comandos de uso frequente...

Configuração via ambiente gráfico e remotamente

Algumas distros tem ferramentas próprias de configuração, como exemplo Yast2 no SUSE 10 tem configurador proxy, estas ferramentas nem sempre atende todas as necessídades, mesmo nestas distros pode se utilizar outras ferramentas como webmin ou editar os arquivos de configuação manualmente.

webmin tem modulo para configurar Squid e outros recursos, na aba "servidores" procure pelo icone "Servidor Proxy Squid", em outros idiomas ou versões mais antigas procure por algo relacionado a servidores e proxy. Veja mais sobre webmin, como acessar remotamente e outras dicas em
http://www.zago.eti.br/webmin.txt
SSH - Considere o uso do ssh, permite executar aplicativos do ambiente gráfico remoto, tem varios aplicativos para windows, tanto em ambiente gráfico como texto (shell) é a mais segura e melhor ferramenta para acesso remoto, altamente configurável.

Acesso remoto via ssh em ambiente gráfico, cliente windows utilizando - Winscp - putty - Freenx - tutorial em
http://www.zago.eti.br/ssh/ssh-gui.html

FAQ, instalar, configurar, dicas e exemplos de uso do SSH em
http://www.zago.eti.br/ssh/ssh.txt
Arquivos de configuração podem ser editados e manipulados com simples editor de texto, seja para fazer toda a configuração ou simples ajustes, pode utilizar ferramentas como webmin e refinar os ajustes com seu editor de texto preferido, pode copiar estes arquivos de outra instalação, portanto fique à vontade para fazer a seu modo, veja mais dicas de como manipular arquivos de configuração em
http://www.zago.eti.br/modelos/A-menu-modelos.html

Veja também na página principal sobre squid, tópico " Ferramentas de configuração... ", manutenção via web.

Iniciar, parar, reiniciar, status

Parar, iniciar, reiniciar e carregar as novas alterações.

Verifique qual o comando para sua distro, são diferentes entre as distros,

Comandos comum na maioria das distro.

squid -k reconfigure Carregar alterações no squid.conf ou ACL, execute sempre que fizer alterações no squid.conf ou ACL.

squid -k shutdown Parar o serviço, derrubar o Squid, prefira esta opção em lugar de outras semelhantes como "service squid stop" ou "rcsquid stop".

Segue alguns exemplos para Conectiva e SUSE.

Configurar para iniciar junto com o boot da maquina: chkconfig squid on

SUSE 10.1

rcsquid restart Reiniciar o serviço, evite esta opção, prefira squid -k reconfigure.

Conectiva 10

service squid restart - Reiniciar Squid, evite esta opção, prefira squid -k reconfigure.

service squid start Iniciar Squid manualmente

squid -D iniciar sem testar DNS, pode usar no /etc/rc.d/rc.local.

Esta opção (-D) serve para não testar o DNS, deve ser usada quando a maquina que roda o squid não está conectada na net no momento que inicia o squid e portanto não como testar o DNS e resulta em erro, ocorre em conexões via modem discado ou ADSL conectado via pppoe, quando tenta iniciar o squid antes de conexão com a net ocorre o erro porque não tem como testar o DNS, organize a inicialização de forma que o Squid seja iniciado depois de completar a conexão com a internet, tente iniciar o squid via rc.local lembre de incluir a linha do Squid depois da linha que conecta na net.

Caso ainda falhe, tente com esta:

squid -D z

service squid status conferir status, se está rodando ou não, retorna mensagem semelhante a esta.

root@faqcl9# service squid status
squid inativo mas seus subsistemas trancados

Tenho detectado este problema principalmente após alterações nas configurações do Squid, depois de "mexer e fuçar" nas configurações ele para de rodar ou passa ter comportamento estranho, não grava logs, não inicia ou morre logo em seguida.

Tente resolver o problerma apagando o arquivo de pid do squid, localize squid.pid e remova este arquivo, exemplo.

Localizar o processo, execute: find / -name squid.pid

Deverá retornar algo como:

/var/run/squid.pid

Matar o processo, execute: kill -9 /var/run/squid.pid

Caso não resolva, verifique se a maquina está conectada na internet, tente limpar o cache, zerar os logs e outros procedimentos indicados em outros tópicos deste documemnto.

Mais dicas sobre como iniciar serviços e acompanhar procesoss.

http://www.zago.eti.br/iniciar.txt
http://www.zago.eti.br/processos.txt

Logs, exemplos de comandos e filtros

Acompanhando os logs em tempo real

Acompanhe os logs em tempo real, enquanto eles são formados voce pode acompanhar as entradas dos registros no log do Squid, execute:

tail -f /var/log/squid/access.log

Consulte também os log do sistema, veja o que disponível em /var/log.

ls -la /var/log/

tail -f /var/log/messages

Refinar a pesquisa, ideal em casos de muitos registros nos logs, para acompanhar somente os registros da estação com IP 192.168.1.53, execute

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

Substitua 192.168.1.53 por outro termo que deseja procurar, exemplo, exibir somente os logs que contenha sexo em qualquer parte do registro.

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

Em lugar de sexo, use a palavra que deseja procurar, foto, msn, orkut, mail e etc....

Para salvar o resultado deste filtro em arquivo, use os redirecionadores, exemplo para salvar em arquivo /tpm/logteste.txt

tail -f /var/log/squid/access.log | grep sexo >> /tmp/logteste.txt

Alguns exemplos.

Exibir as ultimas 100 linhas e sair.

tail -100 /var/log/squid/access.log

Refinar o resultado, exibir somente o IP e a URL, exemplo;

tail -f /var/log/squid/access.log | awk '{print "IP="$3"\t URL="$7}'

Formato e exemplo de resultado:

IP=192.168.1.53 URL=http://www.zago.eti.br/log.txt

Exibir outros campos do Log, troque "IP="$3", pela coluna que deseja, altere IP para o nome que deseja exibir e $3 pela coluna que deseja exibir, neste exemplo o IP é a terceira coluna e a URL é a setima, para exibir IP e tipo de acesso que fica na coluna 4 use:

tail -f /var/log/squid/access.log | awk '{print "IP="$3"\t CODIGO="$4}'

Formato e exemplo de resultado:

  IP=192.168.1.53  CODIGO=TCP_MISS/200
  IP=192.168.1.53  CODIGO=TCP_MISS/200

Com curingas pode acompanhar no mesmo console e simultaneamente diversos arquivos de log, exemplos para abrir todos os arquivos que terminam com .log em /var/log/squid

tail -F /var/log/squid/*.log

tail -f /var/log/squid/*.log

Com filtro por usuário, IP, URL ou outra opção registradas nos logs, use o grep como neste exemplo;

tail -f /var/log/squid/*.log | grep 192.168.1.53

Abrir também o /var/log/messages, observe que tem um espaço separando os dois endereços.

tail -f /var/log/squid/*.log /var/log/messages

tail -f /var/log/squid/*.log /var/log/messages | grep 192.168.1.53

Faça testes, modifique os exemplos acima, tente outras opções.

Veja mais sobre grep em:
http://www.zago.eti.br/grep.txt

Veja mais sobre awk em:
http://www.zago.eti.br/awk.txt

Saber o tamanho do cache, veja no squid.conf o caminho do cache, o local não é padrão, portanto, procure na sua instalação, pode pegar o endereço no squid.conf, procure pela linha semelhante a esta;

cache_dir ufs /var/cache/squid 100 16 256

Neste exemplo o cache está em /var/cache/squid , saber o tamanho, espaço ocupado, execute; du -sh /var/cache/squid e o resultado deverá ser semelhante a 109M /var/cache/squid.

O local muda conforme a distro, script de instalação ou a gosto do administrador, o mais comum é procurar pelo sub-diretório squid abaixo de /var/spool, neste caso utilize o comando du -sh /var/spool/squid, ou localize o caminho correto, navegue pelos diretórios, consulte o squid.conf, use o find e sua intuição...

Tem mais opções, inclusive como gerar gráficos individualizados, relatórios em HTML via SARG e muitos outros recursos, veja mais sobre log e relatórios no FAQ

http://www.zago.eti.br/squid/sarg.html

http://www.zago.eti.br/log.html

http://www.zago.eti.br/squid/log.txt

Mais ajuda e dicas de pesquisa

Help do Squid

/usr/sbin/squid -help

man squid

Ver com quais com quais flags o Squid foi compilado:

/usr/sbin/squid -v

Quando não entender a mensgem de erro porque está em ingles, utilize tradudores como Altavista ou Google, se ainda não entendeu a mensagem, então coloque parte dela na caixa de pesquisa do Google.

Explore o mecanismo de busca do Google, coloque na caixa de dialogo a mensagem de erro ou parte dela, tente combinar a pesquisa para refinar os resultados.

httptunnel, furos de bloqueio - freeproxy, webproxy

Nas regras de bloqueio (ACL) inclua o bloqueio a estes endereços e as indicações deles:

http://www.guardster.com/

http://proxy.amsistemas.com.br

http://www.proxy4free.com/index.html

http://www.the-cloak.com/anonymous-surfing-home.html http://www.the-cloak.com/login.html

http://www.megaproxy.com/

http://www.freeproxy.com/

http://surfeasy.info/surfeasy/

http://www.publicproxyservers.com/page1.html

http://www.hopster.com/

Neste site tem um software que burla o proxy e firewall, não testei.

http://www.wproxy.com https://wproxy.com/

Caso teus usuários consiga acessa-los, atraves deles vão burlar o proxy e acessar qualquer outro site na internet, vai anular totalmente as regras de bloqueio do teu Squid, alguns tem software que instalam na estação para permitir o acesso e uso deles mesmo com eles bloqueado nas regras do squid e firewall, parece ser demais, ainda não detectei esta situação, como tudo é possivel, acho que a solução é a constante vigilancia, analise dos logs e trafego, refinar as regras pra dificultar ao maximo e nunca vacilar com a segurança e monitoramento.

Não tenho como listar todos aqui, mesmo porque não sei quais são, o ideal é acompanhar os logs do squid, pelos relatorios do SARG fica muito mais fácil descobrir acesso a sites estranhos e suspeitos, depois é só acrescentar na lista de sites bloqueados.

Procure no google por httptunnel, anonimato e expressões semelhantes vai se surpreender com o que tem disponivel para usuários criar problemas na tua rede e burlar proxy ou firewall.

Firewall - regras Iptables - redirecionamento

Exemplos de regras que redirecionam o trafego

Redirecionar todo o trafego da porta 80 para o Squid.

Forçar as estações passarem pelo proxy, precisa colocar uma regra no firewall pra redirecionar todo o trafego da porta 80 para a porta 3128, o local de inserir a regra também é muito importante, tem que ser antes da regra que faz nat para evitar que as estações continue navegando sem passar pelo proxy, veja este exemplo:

      modprobe iptable_nat
      iptables -t nat -A PREROUTING -p tcp -m multiport -s 192.168.1.0/24 --dport 80,443 -j REDIRECT --to-ports 3128
      iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
      echo 1 > /proc/sys/net/ipv4/ip_forward

Cuidado com a quebra de linha no seu browser, cliente de e-mail ou editor, no exemplo acima esta parte:

iptables -t nat -A PREROUTING -p tcp -m multiport -s 192.168.1.0/24 --dport 80,443 -j REDIRECT --to-ports 3128

tem que ser uma única de linha, tem que ajustar para sua rede, neste exemplo estou permitindo proxy pra toda a rede interna com IP 192.168.1.0/24, altere para a sua classe de rede, ajuste também no squid.conf "acl minharede src 192.168.1.0/255.255.255.0" tem que ser da mesma classe de rede. Neste exemplo 192.168.1.0/24, todas as maquinas da rede permite alterações somente no ultimo octeto 192.168.1.x, mantenha a mesma classe em todas as maquinas, nas estações, no squid.conf e placa de rede interna do micro que compartilha a conexão (firewall), o Squid pode rodar em outra maquina com IP da mesma classe de rede.

As demais linhas no exemplo acima serve pra fazer NAT para os demais serviços como ftp, cliente de e-mail e qualquer acesso à web sem ser pela navegação na porta 80.

Cuidado com a segurança, o exemplo acima serve somente pra ilustrar onde deverá ser colocada a regra de redirecionamento, aplique as suas regras de firewall, qualquer problema altere posição da regra acima para o inicio do firewall.

Excluir uma estação do redirecionamento - acessar a net sem proxy

Qualquer excessão que queira fazer via iptables, tem que ser acrescentada no firewall antes da regra que direciona o trafego pro Squid, o IPtables para a execução do script (analize das regras) na primeira condição que for atendida. Pra excluir um IP do redirecionamento pro Squid, a regra tem que estar no script do firewall, antes da que redireciona o trafego pro Squid.

Esta regra redireciona todo o trafego da porta 80 para a porta 3128 do Squid.

  /usr/sbin/iptables -t nat -A PREROUTING -p tcp -m multiport -s 192.168.1.0/24 --dport 80,443 -j REDIRECT --to-ports 3128

Com a regra acima todas as estações todas as estações são forçadas a passar pelo proxy pra alcançar a net, portanto submetendo às regras configuradas no Squid, mas é possível manter o proxy para toda a rede e excluir algumas maquinas do proxy, ficam sujeitas somente às regras de iptables.

Excluir somente uma estação, pode aplicar direto na regra de redirecionamento, quando precisar excluir mais de uma maquina (IP), crie uma regra (linha abaixo) para cada maquina, obrigatoriamente a ordem destas regras no script tem que ser colocadas na posição antes da regra de redirecionamento, no exemplo a seguir inclue a regra de redirecionamento para facilitar o entendimento, segue alguns exemplos de regras para tirar do proxy as maquinas com final 42, 53 e 155,

  /usr/sbin/iptables -t nat -A PREROUTING -i eth1 -s 192.168.1.42/32 -p tcp -m multiport  --dport 80,443 -j ACCEPT
  /usr/sbin/iptables -t nat -A PREROUTING -i eth1 -s 192.168.1.53/32 -p tcp -m multiport  --dport 80,443 -j ACCEPT
  /usr/sbin/iptables -t nat -A PREROUTING -i eth1 -s \! 192.168.1.155 -p tcp -m multiport  --dport 80,443 -j REDIRECT --to-ports 3128
  
  Ou se preferir, outro formato com o mesmo resultado;
  
  /usr/sbin/iptables -t nat -A PREROUTING -i eth1 -s 192.168.1.42/32 -p tcp -m multiport  --dport 80,443 -j ACCEPT
  /usr/sbin/iptables -t nat -A PREROUTING -i eth1 -s 192.168.1.53/32 -p tcp -m multiport  --dport 80,443 -j ACCEPT
  /usr/sbin/iptables -t nat -A PREROUTING -i eth1 -s 192.168.1.155/32 -p tcp -m multiport  --dport 80,443 -j ACCEPT
  /usr/sbin/iptables -t nat -A PREROUTING -p tcp -m multiport -s 192.168.1.0/24 --dport 80,443 -j REDIRECT --to-ports 3128
  

Onde eth1 é interface interna e 192.168.1.0 é toda a rede interna (clase de rede), altere conforme sua rede.

  Mais um exemplo;
  
  iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.32/32 -j MASQUERADE
  iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.53/32 -j MASQUERADE
  iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.155/32 -j MASQUERADE
  
  Ou também; 
  
  iptables -t nat -A POSTROUTING -s 192.168.1.53 -o ppp0 -j MASQUERADE
  iptables -t nat -A POSTROUTING -s 192.168.1.53 -o eth0 -j MASQUERADE
  
  A primeira linha é pra quem levanta a interface ppp0 e a segunda é pra quem levanta a eth0, no exemplo acima a estação com IP 192.168.1.53 não vai passar pelo proxi nem pelas regras do Squid.

No meu firewall utilizo esta regra para excluir do redirecionamento a maquina com ip 192.168.1.53.

/usr/sbin/iptables -t nat -A PREROUTING -i eth1 -s \! 192.168.1.53 -p tcp -m multiport --dport 80,443 -j REDIRECT --to-ports 3128

/usr/sbin/iptables -A POSTROUTING -t nat -o eth0 -j MASQUERADE

onde

eth0 = interface externa (que sai pra net)
eth1 = interface interna (rede interna)

Nestas estações não configure proxy no navegador, caso configure vai passar pelo proxy como outra estação qualquer, quem usa mais de um navegador, pode configurar um deles passando pelo proxy e outro não, em ambiente de testes pode ser muito útil.

Confira se as regras de NAT estão ativas para os IP em questão, após a inclusão das regras, execute o script de firewall e depois veja se os IP aparecem na listagem do comando;

iptables -L -v -t nat

Configurando estações - Clientes do proxy

Configurar clientes do proxy Squid

Estações que estão atrás de um servidor proxy, precisam de configuração especial sobre a rede, além da configuração de rede na estação, IP, DNS, gateway e rota, quando acessam a internet pelo proxy como Squid, precisam configurar os navegadores e demais serviços que utilizam a porta 80 para acessar a internet pelo proxy, brownser como Mozilla, konqueror, I.E tem opções de configuração do proxy, procure no seu navegador pela opção de configurar o servidor proxy, informe o IP e porta, onde IP é o IP do micro que roda o Squid e a porta em que está ouvindo, normalmente é a 3128.

No Firewall deve ter uma regra redirecionando o trafego da porta 80 para a porta 3128, algo semelhante a estas regras.

  modprobe iptable_nat
  /usr/sbin/iptables -t nat -A PREROUTING -p tcp -m multiport -s 192.168.1.0/24 --dport 80,443 -j REDIRECT --to-ports 3128
  /usr/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
  echo 1 > /proc/sys/net/ipv4/ip_forwardd

Quando falhar o acesso a FTP, acrescente as regras pra fazer NAT também de FTP, são estas regras:

      modprobe ip_conntrack_ftp
      modprobe ip_nat_ftp
      modprobe iptable_nat

No firewall precisa carregar os modulos responsaveis pelo NAT de FTP, requer no minimo estas regras e nesta ordem:

  modprobe ip_conntrack_ftp
  modprobe ip_nat_ftp
  modprobe iptable_nat
  /usr/sbin/iptables -t nat -A PREROUTING -p tcp -m multiport -s 192.168.1.0/24 --dport 80,443 -j REDIRECT --to-ports 3128
  /usr/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
  echo 1 > /proc/sys/net/ipv4/ip_forward

Agora faça um teste com o konqueror nas estações, na aba:

    configurações
       Configurar konqueror
          Proxy
  	   selecione usar proxy e configurações específicas manualmente, clique
  	   em configurar, na linha FTP não preencha, deixe esta linha vazia e
  	   não selecione a opção [] usar o mesmo servidor proxy para todos os
  	   protocolos, o proxy Squid não controla a porta do ftp, portanto não
  	   marque esta opção.

Teste com servidor de FTP externo, tente com servidores de ftp anonimo como a unicamp, teste com este endereço

ftp://ftp.unicamp.br/pub/

Servidores de FTP que requer login, exemplo, atualizar sites, acrescente na URL o login e senha, neste formato:

ftp://meulogin:minhasenha@www.zago.eti.br/

Configurar I.E, tente este caminho:

Em primeiro lugar por questões de segurança tente não usar I.E. tem muitas recomendações de segurança indicando outros navegadores em lugar do I.E.

Quando o ping alcança a internet e o I.E. não navega, procure nas opções de configurar para navegar por uma rede LAN, procure pelas opções de proxy e informe o IP do servidor proxy e a porta. Com isto deverá navegar, caso falhe, veja nas configurações de rede se tem o IP da mesma classe, gateway e DNS, veja se o ping alcança o micro que compartilha a conexão, tente com outros navegadores, com outros serviços de acesso à internet para tentar isolar o problema.

Quando o I.E. navega mas não acessa sites de FTP e no micro que compartilha a conexão carrega os modulos como indicado acima, outros navegadores acessa e falha somente com I.E, então é problema de configuração do I.E. Na barra de menu do internet explorer -> guia avançado no item "navegação" procure pelas opções com referencia a FTP, desmarque ou marque a opção "Ativar o modo de exibição de pastas para sites ftp". Tente acessar ftp, caso falhe inverta as opções, vai tentando que a solução é nestes itens.

Configurar I.E direto no registro do windows, tópico em testes com win98 SE.

Faça testes antes de aplicar esta solução na rede, verifique em uma maquina se o caminho confere, avalie e teste em uma maquina antes de aplicar em todas.

Crie um script com edit do DOS ou bloco de notas, como sugestão de nome proxyon.reg com este conteúdo;

  REGEDIT4
  
  [HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
  "ProxyEnable"=dword:00000001
  "ProxyServer"="192.168.1.2:3128"
  "ProxyOverride"="<local>"

No exemplo acima altere somente o IP 192.168.1.2 para o do seu servidor proxy, as demais linhas não altere mantenha o REGEDIT4 como está, nome pode mudar mas tem que terminar com .reg, no prompt do DOS execute;

regedit -s \\caminho\proxyon.reg

Desfazer a configuração, crie o proxyoff.reg com este conteúdo;

  REGEDIT4
  
  [HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Internet Settings] "ProxyEnable"=dword:00000000
  "ProxyServer"=" "
  "ProxyOverride"="<local>"

no prompt do DOS execute; regedit -s \\caminho\proxyoff.reg

Não precisa reiniciar Windows, precisa fechar todas as janelas do I.E. e abrir novamente.

Não exibe a configuração em propriedades do navegador, fica tudo transparente.

Duplo clique sobre o arquivo tem o mesmo resultado, optei pelo exemplo acima porque serve para executar na linha de comando (prompt do DOS), incluir no logon script do Samba.

Considere incluir no iniciar, login script do Samba ou outro metodo de execução automatica, com um servidor DHCP fornecendo IP e gateway, não precisa configurar nada nas estações win98

wget, lynx e outros clientes sem config própria.

Alguns serviços como wget, lynx, e outros serviços que também acessam a net pela porta 80 e não tem opção para configurar o proxy, eles utilizam a configuração do sistema, a configuração de proxy é diferente, portanto precisa configurar no sistema e não no serviço que vai usar, formato da linha de comando para configurar proxy para wget, lynx e outros.

export http_proxy=http://ip.do.proxy:porta-do-proxy

Exemplo da linha de comando que libera estações para acesso à internet compartilhada com proxy Squid, onde o servidor tem o IP 192.168.1.2 e todo o trafego é redirecionado para a porta 3128, nos navegadores deve utilizar como servidor proxy 192.168.1.2 porta 3128, para wget e lynx acessarem a internet nesta mesma rede, o comando fica assim:

export http_proxy=http://192.168.1.2:3128

Ajuste o IP e porta para sua rede, 192.168.1.2 é meu gateway, IP da maquina que roda Squid.

Após o comando, teste a navegação ou download, navegar com lynx, execute.

lynx http://www.zago.eti.br/comandos.txt

Donload com wget

wget http://www.zago.eti.br/comandos.txt

Use também a dupla "vi" + lynx, converte páginas da web para texto limpo diretamente no editor "vi", aproveite e faça o teste, dentro do editor "vi" em modo comando, cole esta linha:

:r !lynx -dump http://200.204.198.164/zago/comandos.txt

Ou importe este documento que voce está lendo, limpinho, sem nada de HTML dentro do editor "vi".

:r !lynx -dump http://www.zago.eti.br/squid/dicas-e-truques.html

Esta configuração de proxy se perderá quando desligar a maquina, para tornar permanente precisa incluir nos arquivos de configuração do sistema, pode configurar para todos usuários da maquina ou somente para usuários específicos.

Configuração permanente e restrita a alguns usuários, insira a linha de comando no .bash_profile dos usuários, basta editar o arquivo .bash_profile que fica no home do usuário e acrescentar após a ultima linha:

export http_proxy=http://192.168.1.2:3128

Pronto, automatizado a execução desta linha no login do usuário.

Configurando para todos os logins nesta maquina, acrescente no final do arquivo /etc/profile, use o um editor pra acrescentar a linha:

export http_proxy=http://192.168.1.2:3128

Ou da maneira mais simples:

echo "export http_proxy=http://192.168.1.2:3128" >> /etc/profile

A partir do próximo boot da maquina a configuração do proxy já vem configurado para wget, lynx e demais serviços que pegam os dados do proxy na variável de ambiente, quando optar pelo /etc/profile valerá para todos os usuários, portanto não precisa incluir no .bash_profile dos usuários

apt-get, smart e proxy autenticado

APT-GET Somente pra maquinas atrás de proxy squid.... no CL basta copiar e colar esta linha no shell:

echo 'Acquire::HTTP::proxy "http://192.168.1.2:3128";' >> /etc/apt/apt.conf

Ajuste o IP e porta para sua rede, 192.168.1.2 é meu gateway, IP da maquina que roda Squid.

Não precisa fazer alterações no squid.

Fazer NAT também para FTP precisa incluir no firewall os modulos:

      modprobe ip_conntrack_ftp
      modprobe ip_nat_ftp
      modprobe iptable_nat

Com autenticação.

Com proxy autenticado, quando requer senha para acessar internet, precisa liberar por usuário, pra informar login e senha, coloque no arquivo /etc/apt/apt.conf, normalmente ele está vazio, caso não existir pode criar, dentro dele coloque a linha neste formato:

  Acquire::HTTP::proxy "http://usuario:senha@192.168.1.2:3128/;
  Acquire::HTTP::proxy "http://zago:minhasenha@192.168.1.2:3128;

Variavel de ambiente.

Como variavel de ambiente, pra usar somente na sessão atual, precisa executar no shell toda vez que for usar, pode digitar ou copiar e colar, colocar dentro de um script, vale também colocar no .bashrc do root ou outro meio qualquer que possa comandar a execução, precisa criar duas variáveis de ambiente, elas valem somente até reiniciar a maquina, veja exemplo:

  export ftp_proxy=http://usuario:senha@192.168.1.2.8:3128
  export http_proxy=http://usuario:senha@192.168.1.2:3128

Pra conferir, ver o conteúdo da variavel:

  echo $ftp_proxy
  echo $http_proxy

Caso não funcione com apt-get, procure por proxy no FAQ sobre apt, pesquise em
http://www.zago.eti.br/apt.txt

Veja também as regras de firewall que podem bloquear portas ou a saida da conexão.

BitTorrent atrás de servidor proxy, procure por proxy neste FAQ:
http://www.zago.eti.br/bittorrent.txt
Smart - Veja exemplos no FAQ
http://www.zago.eti.br/smart-dicas.html
http://www.zago.eti.br/smart.txt

smart config --set http-proxy=<seu-proxy>

ACL - Manutenção

ACL - Manutenção, alterações nas ACL, incluir, excluir ou alterar palavras de bloqueio e etc....

Acompanhe os logs ou relatorios do sarg, quando encontrar sites sendo bloqueados ou liberados indevidamente basta fazer a correção no arquivo que contém as palavras, use qualquer editor de texto puro, por exemplo "vim", após salvar o arquivo, pra recarregar o squid execute:

squid -k reconfigure

ou

service squid reload

Não precisa parar e reiniciar o squid.

Pra muitas alterações, faça duas conexões via ssh, torne root, alterne entre os terminais, um pra fazer alterações e outro para acompanhar os logs em tempo real, execute:

tail -f /var/log/squid/access.log

Na outra conexão vá pro diretório /etc/squid, pra fazer alterações edite o arquivo desejado, salve e recarregue o squid com (squid -k reconfigure), volte ao terminal dos logs e continue acompanhado.

O ideal é editar o arquivo e acrescentar as palavras em ordem alfabetica, facilita a organização e manutenção.

Zerar configurações, limpar cache

Limpar cache - reiniciar processo - solução de problemas.

OBS. Dica para aplicar em instalação que parou de funcionar, Squid que não inicia ou morre alguns segundos após iniciar, a provável causa pode ser algum arquivo travado, erro no cache ou algum arquivo de dados, zerando estes arquivos, volta à condição inicial como funcionava na instalação, esta dica não resolve erros nem falhas de configuração ou hardware.

Agora tente parar e reiniciar o serviço, na maioria das vezes vai resolver o problema, caso persista, então resta a força bruta (radicalismo), apague tudo e recrie novamente, deve existir outras formas, utilizo a recurso acima quando falha sigo a dica passada pelo Anderson andersonmsp@click21.com.br, em varios casos que a opção acima falhou, a dica abaixo funcionou, tenho até um resumo no final pra copiar e colar, veja que funciona na minha instalação do CL10, pode não servir pra tua instalação que pode ter nomes de arquivos e diretórios diferentes, procure pelo equivalente na sua instalação.

Tem que funcionar porque zera tudo, caso persista o problema, tente voltar a copia de um squid.conf e ACL que funcionavam antes das alterações, verifique o espaço em disco, hardware, processos e use a intuição pra descobrir a causa do problema.

Antes de aplicar os procedimentos abaixo, pare todos os processos do squid, verifique se ainda tem algum processo rodando

``ps -aux | grep squid ``

Para solucionar o problema, proceda assim:

remova o diretório /var/spool/squid rm -rf /var/spool/squid

recrie novamente mkdir squid

Libere a permissão chmod -R 777 squid

Copie os arquivos de log para outro diretório, mova ou renomeie, exemplo para mover os logs para /tmp, execute:

    mkdir /tmp/squidlog
    mv /var/log/squid/* /tmp/squidlog

Caso não precise dos logs pode remover tudo que estiver em: /var/log/squid/

rm -rf /var/log/squid/*

Recrie o arquivo access.log

touch /var/log/squid/access.log

Libera geral ou seu modo:

chmod 777 access.log

inicie o squid, demora um pouco, deve voltar a funcionar normalmente, faça um teste, veja o status.

service squid start

Ou em uma tacaca só, resumo dos comandos (copiar e colar), colinha do zago e Anderson.

Neste exemplo, todos os logs serão movido para /tmp.

Instalação com cache em /var/spool/squid e log em /var/log/squid:

  service squid stop
  mkdir /tmp/squidlog-`date +%d.%b.%Y-%H-%M`
  mv /var/log/squid/* /tmp/squidlog-`date +%d.%b.%Y-%H-%M`
  rm -rf /var/spool/squid
  mkdir /var/spool/squid
  chmod -R 777 /var/spool/squid
  rm -rf /var/log/squid/*
  touch /var/log/squid/access.log
  chmod 777 /var/log/squid/access.log
  squid -z
  service squid start

Instalação com cache em /var/cache/squid e log em /var/log/squid:

  service squid stop
  mkdir /tmp/squidlog-`date +%d.%b.%Y-%H-%M`
  mv /var/log/squid/* /tmp/squidlog-`date +%d.%b.%Y-%H-%M`
  rm -rf /var/log/squid/*
  rm -rf /var/cache/squid
  mkdir /var/cache/squid
  touch /var/log/squid/access.log
  chmod 777 /var/log/squid/access.log
  chown proxy.proxy /var/cache/squid
  chgrp proxy /var/cache/squid
  chmod 777 /var/log/squid/access.log
  chown proxy.proxy /var/log/squid/access.log
  chgrp proxy /var/log/squid
  squid -z
  service squid start

Opção para zerar somente o cache, apagar e recriar somente o cache:

  service squid stop
  rm -rf /var/spool/squid/*
  squid -z
  service squid start

CUPS e servidor web interno

ACL para liberar acesso ao servidor web interno (CUPS, Apache e etc...).

Sempre que possível, mantenho um servidor web interno para disponibilizar os pacotes mais utilizados, tais como OpenOffice, Firefox, ClamWIN e outros pacotes que consomem muito download, mantenho este servidor atualizado como um mirror, isto agiliza o download pelas estações e economiza banda, veja em:
http://www.zago.eti.br/apache.txt

Liberar o acesso a este servidor e aos servidores CUPS (servidor de impressão) precisa criar uma acl para liberar o acesso à maquinas da rede interna, exemplo de acl para acrescentar no squid.conf:

  acl ipinterno dst 192.168.1.0/24
  http_access allow ipinterno all

Neste exemplo, libera todos os servidores interno para todas as estações, servidores web, cups e etc.., caso queira liberar somente um servidor, por exemplo, liberar somente o servidor web que está no IP 192.168.1.3:

  acl ipinterno dst 192.168.1.3/32
  http_access allow ipinterno all

Liberar o acesso a servidor CUPS, precisa incluir a porta 631 na "acl Safe_ports ", exemplo no squid.conf que libera a porta 631:

acl Safe_ports port 80 21 443 563 631 70 210 1863 1025-65535

Não imprime com proxy habilitado no I.E. Estação com win98 não imprime na impressora compartilhada pelo CUPS, quando habilita o proxy no I.E perde a impressão, envia e nada acontece, removendo as configurações de proxy a estação imprime sem problema algum. Enquanto não descubro a solução estou contornando o problema com a seguinte solução; deixe o I.E sem configurações de proxy e use o Firefox com proxy configurado para navegar, desta forma a estação imprime normalmente.

Remover comentarios do arquivo de configuração

Limpar arquivo de configuração, retirar todos os comentarios e linhas em brando do squid.conf, isto é opcional, mas é prático pra enviar o arquivo de configuração para outras pessoas analizarem, as duas linhas de comando abaixo estão prontas para copiar e colar, para evitar acidentes e subrescrever o squid.conf, faça cópia para outro local, no exemplo abaixo, a primeira linha faz copia do squid.conf para /tmp, a segunda limpa o arquivo e salva o resultado em /tmp/squid.conf-limpo.

   cp /etc/squid/squid.conf /tmp/squid.conf-comentado
   egrep -v "^#|^$" /tmp/squid.conf-comentado > /tmp/squid.conf-limpo

Comparar dois squid.conf e salvar as diferenças entre eles em /tmp/squidif (altere o caminho e nome dos arquivos)

  egrep -v "^#|^$" /etc/squid/squid.conf > /tmp/squid1
  egrep -v "^#|^$" /etc/squid/squid.confori > /tmp/squid2
  diff -y --suppress-common-lines /tmp/squid1 /tmp/squid2 | tr -d '\011' > /tmp/squiddif
  less -Nis /tmp/squiddif

Controle de IP na rede

Controlar maquinas por IP pode não ser eficiente, quando os usuários descobrirem que podem trocar o IP pra fugir das regras voce perderá o controle.

Uma solução é centralizar tudo em um servidor de DHCP pra fornecer o IP pras estações, pra melhorar a eficiencia, amarre o IP ao MAC-ADRESS da placa de rede, este servidor de DHCP pode ser configurado pra fornecer além do IP, também o DNS e gateway da rede, isto poupa o trabalho de configuração das estações e centraliza tudo em um só lugar, pra saber mais sobre DHCP veja:

http://www.zago.eti.br/dhcpd.txt
http://www.zago.eti.br/pluguse.txt

veja também regras de iptables pelo MAC-ADRESS em:
http://www.zago.eti.br/firewall/iptables-mac.txt

Bloqueio de Banners
Protegendo usuários com antivírus
Autenticando usuários
Controle de Banda
Usando ACLs externas
MAC Address
Tags da seção Access Control Lists
tipos de acl
Relatorios e muito mais, acesse:

http://www.linuxman.pro.br/squid/

Formato e manipulação de data no log.

No inicio da linha de log do Squid aparece um numero semelhante a: 1085173079.594

Este numero representa a data e hora no formato Unix, converter para hora humana, por exemplo, 1085173079.594, o que vem depois do ponto são milesimos de sengundos que não interessa na data, mesmo porque não usamos este formato de tempo, portanto elimine o ponto e o que vem depois dele, o formato da linha de comando é este: date --date='1/1/1970 + <UNIXTIME> seconds', para converter a data 1085173079.594, execute esta linha de comando:

date --date='1/1/1970 + 1085173079 seconds'

Veja o resultado:

zago@faqcl9$ date --date='1/1/1970 + 1085173079 seconds'
Sex Mai 21 20:57:59 UTC 2004

Caso ocorra uma diferença de 3 horas é problema com a configuração do locale, no Brasil são 3 horas a menos do que o GMT, acerte isto nas configurações de fuso horario.

Exemplo em perl, data 1085173079.594 no formato Linux (unix), converter para o formato humano

perl -e "print scalar localtime(shift||1085173079.594)"

Retorna;
  [zago@faqcl10 zago]$ perl -e "print scalar localtime(shift||1085173079.594)"
  Fri May 21 20:57:59 2004
Veja mais sobre data no FAQ

http://www.zago.eti.br/data.txt

Problemas no acesso ao Hotmail + I.E. + Squid.

Algumas estações windows não acessam o Hotmail, tem algo a ver com a versão do I.E, outros navegadores como Firefox acessa sem prolemas, caso o problema seja somente com I.E. pra acessar o Hotmail. então faça esta alteração no teu squid.conf

Adicione no squid.conf as linhas:

    acl hotmail_domains dstdomain .hotmail.msn.com
    header_access Accept-Encoding deny hotmail_domains

recarregue o squid com: squid -k reconfigure

Prontinho, as estações windows com I.E. passam acessar o hotmail passando pelo Squid.

Solução indicada pelo colega Andersonmsp@yahoo.com.br

Indicações:

Tirar anuncios atraves do squid,veja que legal
http://www.linuxdicas.com.br/article678.html

Página principal sobre Squid, indicações, FAQ, tutoriais, modelos de configuração, squid.conf, modelos de acl e mais dicas em:
http://www.zago.eti.br/squid/A-menu-squid.html
Página principal sobre Firewall - iptables
http://www.zago.eti.br/firewall/A-menu-firewall.html

Página principal deste site (FAQ)
http://www.zago.eti.br/menu.html