Squid + Bridge + TProxy no CentOS 5.4

Depois de inúmeras tentativas buscando por documentações na Internet usando o Google, consegui através de pedaços de documentações e testes realizados em minha casa e em um dos provedores para o qual presto serviço realizar o que essa documentação se propõe. Mostrar como podemos configurar um CentOS 5.4 como bridge e ao mesmo tempo servir de proxy totalmente transparente através do TProxy.

[ Hits: 61.482 ]

Por: Marcelo Gondim em 26/05/2010


IPtables, libcap e Squid



Agora vamos compilar e instalar o iptables que baixamos:

# cd /usr/src/
# tar -xvjpf iptables-1.4.3.2.tar.bz2
# cd iptables-1.4.3.2/
# ./configure --prefix=/


Agora se seu sistema for 32bits (i386) use os comandos abaixo:

# make BINDIR=/sbin LIBDIR=/lib KERNEL_DIR=/usr/src/linux
# make BINDIR=/sbin LIBDIR=/lib KERNEL_DIR=/usr/src/linux install


Já se o seu sistema for 64 bits (x86_64) use os seguintes comandos:

# make BINDIR=/sbin LIBDIR=/lib64 KERNEL_DIR=/usr/src/linux
# make BINDIR=/sbin LIBDIR=/lib64 KERNEL_DIR=/usr/src/linux install


Para confirmarem que estão usando o iptables que acabamos de instalar:

# iptables -v
iptables v1.4.3.2: no command specified
Try `iptables -h' or 'iptables --help' for more information.

Perfeito! Agora já temos Kernel mais recente já com o suporte ao TProxy habilitado e o iptables novo compilado e instalado. Não precisamos aplicar patches no iptables porque esta versão que instalamos já vem com suporte ao TProxy.

Agora partiremos para o Squid, mas antes este precisará da libcap2 que baixamos. IMPORTANTE!!! Sem a libcap2 ou uma versão 2.09 ou superior, o TProxy não irá funcionar porque o Squid não compilará com o devido suporte. Isto realmente é muito, muito IMPORTANTE!

# cd /usr/src
# tar -xvzpf libcap-2.19.tar.gz
# cd libcap-2.19/
# make && make install


Simples assim mesmo. Agora podemos partir para o Squid:

# cd /usr/src
# tar -xvzpf squid-3.1.1.tar.gz
# cd squid-3.1.1/
# ./configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --localstatedir=/var/lib --sysconfdir=/etc/squid --libexecdir=/usr/libexec/squid --localstatedir=/var --datadir=/usr/share/squid --enable-removal-policies=lru,heap --enable-icmp --disable-ident-lookups --enable-cache-digests --enable-delay-pools --enable-arp-acl --with-pthreads --with-large-files --enable-htcp --enable-carp --enable-follow-x-forwarded-for --enable-snmp --enable-ssl --enable-async-io=32 --enable-linux-netfilter --enable-epoll --disable-poll --with-maxfd=16384 --enable-err-languages=Portuguese --enable-default-err-language=Portuguese
# make
# make install


Dos parâmetros acima, no ./configure, o mais importante para que funcione é o --enable-linux-netfilter. Não entrarei em detalhes de cada parâmetro acima, pois sairia muito do escopo desse tutorial.

Vamos criar o user e group do Squid:

# groupadd -g 23 squid
# useradd -u 23 -g 23 -d /var/spool/squid -s /sbin/nologin squid


Precisaremos acertar o squid.conf, vou usar o padrão para vocês terem uma ideia, mas as otimizações vão de cada um. Vamos editar o /etc/squid.conf e deixá-lo como este abaixo:

cache_mem 100 MB
cache_effective_user squid
cache_effective_group squid
access_log /var/log/squid/access.log squid
cache_store_log /var/log/squid/store.log
netdb_filename /var/log/squid/netdb.state
cache_log /var/log/squid/cache.log

acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl localhost src ::1/128
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32
acl to_localhost dst ::1/128

# Se sua rede de teste for uma dessas abaixo, então descomente a correta ou as que for usar.
#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

# Abaixo vou colocar as redes de teste como nos meus desenhos do tuto, mas alterem para o teste de vocês
acl localnet src 186.194.x.0/24
acl localnet src 186.193.x.0/27

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

http_access allow manager localhost
http_access deny manager

http_access deny !Safe_ports

http_access deny CONNECT !SSL_ports

http_access allow localnet
http_access allow localhost
http_access deny all

http_port 3128
http_port 3129 tproxy

hierarchy_stoplist cgi-bin ?

cache_dir ufs /var/spool/squid 30000 64 256

coredump_dir /var/spool/squid

# Add any of your own refresh_pattern entries above these.
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .

Reparem na configuração acima: a linha em destaque (http_port 3129 tproxy) é muito importante!

Agora vamos criar uns diretórios com suas permissões:

# mkdir -p /var/spool/squid
# chown squid:squid /var/spool/squid
# mkdir -p /var/log/squid
# chown squid:squid /var/log/squid


Precisaremos inicializar o Squid e nesse momento preste atenção para ver se ele mostrará alguma mensagem de erro:

# squid -z

Vamos precisar de um script para inicializar e parar o Squid quando precisarmos. Então vamos criar um em /etc/init.d/ chamado squid com o conteúdo abaixo:

#!/bin/bash
# squid This shell script takes care of starting and stopping
# Squid Internet Object Cache
#
# chkconfig: - 90 25
# description: Squid - Internet Object Cache. Internet object caching is
# a way to store requested Internet objects (i.e., data available
# via the HTTP, FTP, and gopher protocols) on a system closer to the
# requesting site than to the source. Web browsers can then use the
# local Squid cache as a proxy HTTP server, reducing access time as
# well as bandwidth consumption.
# pidfile: /var/run/squid.pid
# config: /etc/squid/squid.conf


ulimit -HSn 16384

PATH=/usr/bin:/sbin:/bin:/usr/sbin
export PATH

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# don't raise an error if the config file is incomplete
# set defaults instead:
SQUID_OPTS=${SQUID_OPTS:-"-D"}
SQUID_PIDFILE_TIMEOUT=${SQUID_PIDFILE_TIMEOUT:-20}
SQUID_SHUTDOWN_TIMEOUT=${SQUID_SHUTDOWN_TIMEOUT:-100}

# determine the name of the squid binary
[ -f /usr/sbin/squid ] && SQUID=squid

prog="$SQUID"

# determine which one is the cache_swap directory
CACHE_SWAP=`sed -e 's/#.*//g' /etc/squid/squid.conf | \
        grep cache_dir |  awk '{ print $3 }'`
[ -z "$CACHE_SWAP" ] && CACHE_SWAP=/var/spool/squid

RETVAL=0

start() {

        #check if the squid conf file is present
        if [ ! -f /etc/squid/squid.conf ]; then
            echo "Configuration file /etc/squid/squid.conf missing" 1>&2
            exit 6
        fi

        # don't raise an error if the config file is incomplete.
        # set defaults instead:
        SQUID_OPTS=${SQUID_OPTS:-"-D"}
        SQUID_PIDFILE_TIMEOUT=${SQUID_PIDFILE_TIMEOUT:-20}
        SQUID_SHUTDOWN_TIMEOUT=${SQUID_SHUTDOWN_TIMEOUT:-100}

        if [ -z "$SQUID" ]; then
                echo "Insufficient privilege" 1>&2
                exit 4
        fi

        for adir in $CACHE_SWAP; do
        if [ ! -d $adir/00 ]; then
             echo -n "init_cache_dir $adir... "
             $SQUID -z -F -D >> /var/log/squid/squid.out 2>&1
        fi
    done
    echo -n $"Starting $prog: "
    $SQUID $SQUID_OPTS >> /var/log/squid/squid.out 2>&1
    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
       timeout=0;
       while : ; do
          [ ! -f /var/run/squid.pid ] || break
          if [ $timeout -ge $SQUID_PIDFILE_TIMEOUT ]; then
             RETVAL=1
             break
          fi
          sleep 1 && echo -n "."
          timeout=$((timeout+1))
       done
    fi
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$SQUID
    [ $RETVAL -eq 0 ] && echo_success
    [ $RETVAL -ne 0 ] && echo_failure
    echo
    return $RETVAL
}

stop() {

    # don't raise an error if the config file is incomplete.
    # set defaults instead:
    SQUID_SHUTDOWN_TIMEOUT=${SQUID_SHUTDOWN_TIMEOUT:-100}
    echo -n  $"Stopping $prog: "
    $SQUID -k check >> /var/log/squid/squid.out 2>&1
    RETVAL=$?
    if [ $RETVAL -eq 0 ] ; then
        $SQUID -k shutdown &
        rm -f /var/lock/subsys/$SQUID
        timeout=0
        while : ; do
                [ -f /var/run/squid.pid ] || break
                if [ $timeout -ge $SQUID_SHUTDOWN_TIMEOUT ]; then
                    echo
                    return 1
                fi
                sleep 2 && echo -n "."
                timeout=$((timeout+2))
        done
        echo_success
        echo
    else
        echo_failure
        echo
    fi
    return $RETVAL
}

reload() {
    # don't raise an error if the config file is incomplete.
    # set defaults instead:
    SQUID_OPTS=${SQUID_OPTS:-"-D"}
    $SQUID $SQUID_OPTS -k reconfigure
}

restart() {
    stop
    start
}

condrestart() {
    [ -e /var/lock/subsys/squid ] && restart || :
}

rhstatus() {
    status $SQUID && $SQUID -k check
}

probe() {
    return 0
}

case "$1" in
start)
    start
    ;;

stop)
    stop
    ;;

reload)
    reload
    ;;

restart)
    restart
    ;;

condrestart)
    condrestart
    ;;

status)
    rhstatus
    ;;

probe)
    exit 0
    ;;

*)
    echo $"Usage: $0 {start|stop|status|reload|restart|condrestart}"
    exit 2
esac

exit $?

Vamos colocar ele para iniciar no boot:

# chmod +x /etc/init.d/squid
# chkconfig --levels 235 squid on


Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Configurando o Kernel e a Bridge
   3. IPtables, libcap e Squid
   4. Adicionando repositório EPEL
   5. Instalando o ebtables e configurações finais
Outros artigos deste autor

Adicionando suporte ao Layer7 no Debian Lenny

Adicionando suporte ao Layer7 no CentOS 5.3

Leitura recomendada

Squid e firewall em 5 minutos

Squid + IPtables com dois links de internet

Proxy com autenticação em servidores Samba ou Windows NT

Bloqueando conteúdo com Squid no RedHat 9

Squid3 + Ubuntu Lucid 10.04 + Kerberos Auth + AD

  
Comentários
[1] Comentário enviado por removido em 26/05/2010 - 14:54h

Fala Gondim.

Parabéns por mais um grande Artigo.

[]'s

[2] Comentário enviado por joaopaulobrinate em 15/06/2010 - 00:38h

Rapaz parabens pela sua documentacao.... vc ta de parabens.... abs ai amigo... aki passa o msn ai rapaz...

[3] Comentário enviado por removido em 22/06/2010 - 19:32h

amigo boa noite..estou montando um server com cent os 64 bits mas queria saber como deixar o squid 3.1 no cent os com cache full pois ele vem com o path zph nativo mas tem que sair na compilação...qual comando adiciono na linha? e quais linhas adiciono no squid.conf para o cache full?


[4] Comentário enviado por gondim em 23/06/2010 - 09:20h

Opa. Ainda não usei esse cara não mas você pode tentar adicionar na linha do ./configure esse parâmetro: --enable-zph-qos

Tipo ficaria algo assim:

./configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --localstatedir=/var/lib --sysconfdir=/etc/squid --libexecdir=/usr/libexec/squid --localstatedir=/var --datadir=/usr/share/squid --enable-removal-policies=lru,heap --enable-icmp --disable-ident-lookups --enable-cache-digests --enable-delay-pools --enable-arp-acl --with-pthreads --with-large-files --enable-htcp --enable-carp --enable-follow-x-forwarded-for --enable-snmp --enable-ssl --enable-async-io=32 --enable-linux-netfilter --enable-epoll --disable-poll --with-maxfd=16384 --enable-err-languages=Portuguese --enable-default-err-language=Portuguese --enable-zph-qos

[5] Comentário enviado por demattos em 27/07/2010 - 13:00h

opa bom dia, muito bom este artigo e proveitoso, fiz todo o processo e funciona show de bola. Mas ocorreo o seguinte ,fiz todos os testes em bancada e funcionou perfeitamente mas quando coloquei na rede com ip valido minha rede ficou doida, queria saber se ocorreo isto com vc,

Meu cenario e o seguinte

Tenho um swite ligado em um roteador com a rede 200.215.XX192/29 e um firewall ( squid+NAT+controle) ligado por uma placa de rede ligado no swit do roteador e outra placa ligado em um swit com rede 172.31.XX.1 que sai para rede interna. Bom eu fiz o que ? montei esta maquina Tproxy e liguei do swit do roteador pela placa eth0 e a eth1 liguei no swit da rede interna para prover ip valido em algumas maquina desta rede, ai que ficou feia a coisa rsrsr a rede parou de fucionar....tem alguma ideia do que seja, acredito q e vacilo meu mas nao achei o erro.
OBS: queria q o firewall e o a maquina Tproxy na mesma rede onde para algumas maquina colocario o ip valido e outras continuaria com a rede do firewall.




Por favor me ajude....rsrsrs
Obrigado pela atencao.

[6] Comentário enviado por gondim em 29/07/2010 - 10:50h

Opa, aqui funciona exatamente como está no desenho da rede. Nossa rede tem atualmente mais de 1000 conexões simultâneas e links de 100Mbps. Todos os nossos assinantes recebem IPs públicos dinamicamente.
Para o TProxy funcionar o mesmo teria que ter roteamento até as estações dos clientes, porque o TProxy spoofa o IP do assinante e depois responde para ele, se nesse momento o Tproxy não tiver roteamento para o cliente aí não vai funcionar mesmo. Vamos dizer que o IP do assinante fosse 192.192.192.50 quando passa pelo TProxy o mesmo spoofa esse IP e passa à usar o 192.192.192.50 para fazer as consultas daquele assinante. No retorno os pacotes precisam passar pelo Tproxy e aí o mesmo envia os dados para a máquina 192.192.192.50. Resumindo se do Tproxy não tiver roteamento para dele chegar ao IP 192.192.192.50, então não funcionará. :)

[7] Comentário enviado por demattos em 31/07/2010 - 12:54h

E verdade,descobri o erro e foi resolvido, era exatamente o que vc relatou, coloquei o tproxy em sequencia do roteador como no diagrama ai funcionou perfeitamente.....obrigado pela atencao

[8] Comentário enviado por luiginardelli em 12/08/2010 - 17:30h

Boa Tarde Godim,

Caramba, quanta coisa que tem alterar para fazer funcionar o tproxy né, chamais conseguiria sem o auxilio de seu artigo, muito bom mesmo.. parabéns.

Tenho uma dúvida será que você poderia me ajudar ?

Olha só, a pergunda é semelhante a do "demattos" só que a diferença é que estou com o tproxy em sequencia veja só :

>>>>---| Clientes |-->>>--| Router RB800 |-->>>>--| Tproxy |-->>>--| Router Rb450G |-->>>--| Internet |

Clientes: 192.168.X.0/24
Rb800: 192.168.X.254
Tproxy: 192.168.X.200
Rb450G: 192.168.Y.254

Erro no squid: O servidor DNS retornou: Timeout via navegador

esse erro se deu quando habilito a regra do ebtables...

Outra coisa: qual é a verdadeira função do ebtables e porque ele está em DROP ?

Obrigado pela paciencia e atenção...

Atenciosamente

Luiz


[9] Comentário enviado por luiginardelli em 19/08/2010 - 08:28h

Descobri meu erro e agora está funcionando, meu erro estava em um gateway que não existia (hehehehe) desculpe a todos...

Tenho outra dúvida, meu squid está gerando no arquivo "store.log" o seguinte aviso:

WARNING: HTTP: Invalid Response: Bad header encountered from www.qualquersite.combr AKA www.qualquersite.combr

O que é isso ?

Obrigado

Luiz

[10] Comentário enviado por cicerosouza em 11/11/2010 - 15:51h

Caro amigo, como faço para aplicar o TProxy no kernel 2.6.26-2?

Obrigado

[11] Comentário enviado por gondim em 11/11/2010 - 17:00h

Opa veja se esse meu tuto lhe ajuda:

http://www.linuxinfo.com.br/squid_tproxy_ubuntu.htm

[]´s

[12] Comentário enviado por luizrfabri em 07/04/2011 - 15:02h

Olá, configurei exatamente como manda seu tuto ( por sinal excelente), porem da erro ao iniciar o squid, conforme o log abaixo do squid.out:
WARNING: -D command-line option is obsolete.
O que poderia estar causando esse erro?

Acabei resolvendo o problema logo em seguida, no seu script o squid aponta os logs para /var/logs/squid e no meu centos o default é /var/log/squid, fiz as devidas alterações, acertei as permissões dos arquivos e rodou tudo certinho.

[13] Comentário enviado por gondim em 07/04/2011 - 15:35h

Olá, isso não é um erro e sim um warning, que diz que o parâmetro -D é obsoleto para a versão de squid que você tá usando. Para não dar a mensagem basta rodar sem o -D. :)

[14] Comentário enviado por luizrfabri em 09/04/2011 - 13:33h

Olá gondim, ja que vc respondeu tão prontamente a minha duvida, vou deixar mais uma aqui srsr:

Eu preciso que um dominio nao seija cacheado, ou seja, os clintes tem que acessar o mesmo sem q seja armazenado, exsite alguma regra que eu possa fazer no squid ou no iptables para que eu retire esse dominio do proxy?
Lembrando que essa regra terá que ser valida para todos os usuarios.
Grato por qualquer ajuda.

Luiz

[15] Comentário enviado por thiagoirch em 12/05/2011 - 16:48h

Gondim, show de bola teu tuto, tive de fazer alguma alterações para adquar a meu ambiente (Provedor de internet com 6 mil usuários) e realmente a performance ficou muito boa e a economia de link na casa de 20% no entanto estou com um problema e não consigo detectar a solução. O Squid ou a Bridge está interrompendo download de usuários mais sensiveis. Por exemplo o usuário começa a baixar um arquivo de 100MB quando chega em 40% (número aleatório as vezes é 20 as vezes 80) o download é do nada "concluido" ainda com o arquivo incompleto. Se puder me ajudar.

[16] Comentário enviado por blaizer em 22/06/2014 - 16:02h

Otimo tutorial !!

Deu certinho aqui , no centos 6.5, tive dificuldade apenas com o libpcap .. mas resolvi.

Uma duvida amigo, montei tudo encima de 192.168.0.0/24 , funcionou.... se eu trafegar nesta bridge com 192.168.1.0/24 "subnet diferente" ele não funciona.

Você teria alguma ideia doque poderia ser?

Já adicionei as rotas das subnet e mesmo assim não funcionou, o server até faz ping nos pc's da outra subnet, mas nada de navegar.

Obrigado


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts