[FUG-BR] howto - pf + squid (2.5 ou 2.6) com proxy transparente + webmim

Marcelo/Porks marcelorossi em gmail.com
Quarta Setembro 20 11:36:40 BRT 2006


Pessoal, eu estava precisando fazer um proxy transparente
com o squid + pf e uma interface web para administrar (webmin)
Encontrei aqui na lista um email que falava sobre o squid 2.6,
porém era usando ipfw + squid 2.6 que tem no ports. O problema é que
com o esse squid do ports eu não consegui fazer funcionar,
mas consegui fazer funcionar compilando o squid 2.6 apartir dos sources.

Ah.. também consegui fazer funcionar o squid 2.5 do ports.
Então resolvi fazer uma receitinha de bolo e postar aqui,
caso alguém precise disso no futuro
(sabe como é, né? dicas nunca são ruins).

o 'documento' que segue está escrito de um modo bem
mastigado e então serve para quem não tem experiência no freebsd,
espero que sirva para alguém...

Ah. Acho que está meio 'porco' esse monte de 'echo' que deixei aqui
(principalmente quando a linha do echo tem os caracteres: ! ` $
hehe portanto acho que se você não estiver usando o bash como shell
(eu estou usando) você vai ter um comportamento diferente, mas ai
você dá seus pulos, né?)

E claro, façam correções nos erros que vocês encontrarem aqui.

Bom, vai ai:

#==========================================================
#==========================================================
#==========================================================
#Tanto para o squid 2.5 quanto para o 2.6 você vai precisar recompilar o kernel
#para usar o pf no FreeeBSD (eu estou usando o FreeBSD 6.1, mas tenho certeza
#que no 6.0 é a mesma coisa e acredito que no 5.4 também deve ser o mesmo)

#########################################################
#### compilar o kernel GENERIC com suporte ao pf, ALTQ (no mínimo),
pflog e pfsync
#### se o source do kernel não existir (/usr/src/sys/)
#### use o /usr/sbin/sysinstall para baixá-lo
####     (sysinstall --> Configure --> Distributions --> src --> sys
#diretório do source para o kernel na arquitetura i386
cd /usr/src/sys/i386/conf/

#o arquivo de configuração do kernel é esse (GENERIC), vamos tirar
#uma cópia dele no $home do root (deixando o 'original' intacto)
cp GENERIC /root/KERNEL.HOST

#fazendo um link para a cópia do kernel no diretório de configuração
#(/usr/src/sys/i386/conf)
ln -s /root/KERNEL.HOST

#isso vai fazer 'aparecer' no seu sistema o /dev/pf
echo "device pf" >> KERNEL.HOST

#não é necessário, mas sei lá.. vamos adicionar também, né?
echo "device pflog" >> KERNEL.HOST

#também não é necessário, mas...
echo "device pfsync" >> KERNEL.HOST

#se não adicionar suporte ao ALTQ você vai receber uma mensagem chatinha do pf
#dizendo que o suporte ao ALTQ está desabilitado, então vamos colocá-lo também
echo "options ALTQ" >> KERNEL.HOST
echo "options ALTQ_CBQ" >> KERNEL.HOST
echo "options ALTQ_RED" >> KERNEL.HOST
echo "options ALTQ_RIO" >> KERNEL.HOST
echo "options ALTQ_HFSC" >> KERNEL.HOST
echo "options ALTQ_PRIQ" >> KERNEL.HOST
echo "options ALTQ_CDNR" >> KERNEL.HOST

#gera as informações para compilação
/usr/sbin/config KERNEL.HOST

#entra no diretório com as informações de compilação
cd ../compile/KERNEL.HOST/

#compila as dependências do kernel
make depend

#compila o kernel
make

#instala o kernel: o novo kernel está em /boot/kernel
#e o antigo foi renomeado para /boot/kernel.old
#se na hora de reiniciar der problema no kernel, você poderá bootar
#com o kernel antigo digitando:
#kernel.old, mas nós temos sorte e não vamos precisar disso ; )
make install
#########################################################

#pronto. o kernel foi compilado e suporta o uso do pf, agora
#temos que dizer para o FreeBSD ativar o PF na inicialização:

#########################################################
####            "ligar" o pf durante o boot         #####
echo "pf_enable=\"YES\"" >> /etc/rc.conf
echo "pf_rules=\"/etc/pf.conf\"" >> /etc/rc.conf
echo "pf_flags=\"\"" >> /etc/rc.conf
echo "pflog_enable=\"YES\"" >> /etc/rc.conf
echo "pflog_file=\"/var/log/pflog\"" >> /etc/rc.conf
echo "pflog_flags=\"\"" >> /etc/rc.conf
echo "gateway_enable=\"YES\"" >> /etc/rc.conf
#########################################################

#e para fazer o proxy ser transparente, vamos redirecionar o que vai sair
#pela porta 80 para o squid

#########################################################
####  fazer o proxy transparente                     ####
####  (vr0 é a interface interna)                    ####
echo "rdr pass on vr0 proto tcp from any to any port 80 -> 127.0.0.1
port 3128" >> /etc/pf.conf
#########################################################

#==========================================================
#==========================================================
#==========================================================
#até agora o que foi feito serve para você usar tanto o squid 2.5
quanto o squid 2.6
#agora vou mostrar o que deve ser feito para usar o squid 2.5 e
#mais para baixo o squid 2.6
#==========================================================
#==========================================================
#==========================================================

#############################################################
#### Se for o usar o squid 2.5 - instale pelo ports      ####
cd /usr/ports/www/squid
make clean
make SQUID_CONFIGURE_ARGS="--bindir=/usr/local/sbin
--sysconfdir=/usr/local/etc/squid --datadir=/usr/local/etc/squid
--libexecdir=/usr/local/libexec/squid --localstatedir=/usr/local/squid
'--enable-removal-policies=lru heap' '--enable-auth=basic digest'
'--enable-basic-auth-helpers=NCSA PAM MSNT SMB YP' --enable-async-io
--with-pthreads --with-aio '--enable-storeio=ufs diskd null aufs coss'
--enable-delay-pools --enable-snmp --enable-htcp
--enable-cache-digests --enable-underscores --enable-useragent-log
--enable-arp-acl --enable-pf-transparent --with-large-files
--enable-large-cache-files --enable-stacktraces
--enable-err-languages=Portuguese
--enable-default-err-language=Portuguese --prefix=/usr/local"
make install clean
#############################################################

#o squid já está instalado, agora vamos adicionar umas regrinhas de
exemplo no squid.
#Essas regras bloqueiam todas as url que tenham a sigla 'ol' e 'orkut',
#a não ser que a url tenha também as siglas 'mail' ou 'bol'.
#Para todo o resto o acesso é liberado
#na prática significa que se são bloqueados os sites:
#www.uol.com.br www.gol.com.br www.olimpia.com.br www.orkut.com
#mas não são bloqueados os sites:
#zipmail.uol.com.br www.gmail.com www.bol.com.br

#############################################################
####    colocar em /usr/local/etc/squid/squid.conf    #####
####    caso estiver usando o squid 2.5
echo "" > /usr/local/etc/squid/squid.conf
echo "http_port 127.0.0.1:3128" >> /usr/local/etc/squid/squid.conf
echo "acl all src 0.0.0.0/0.0.0.0" >> /usr/local/etc/squid/squid.conf
echo "acl to_localhost dst 127.0.0.1" >> /usr/local/etc/squid/squid.conf
echo "acl blockSites url_regex orkut ol" >> /usr/local/etc/squid/squid.conf
echo "acl unblockSites url_regex mail bol" >> /usr/local/etc/squid/squid.conf
echo "" >> /usr/local/etc/squid/squid.conf
echo "http_access deny to_localhost" >> /usr/local/etc/squid/squid.conf
echo -n "http_access deny blockSites " >> /usr/local/etc/squid/squid.conf
echo -n ! >> /usr/local/etc/squid/squid.conf
echo "unblockSites" >> /usr/local/etc/squid/squid.conf
echo "http_access allow all" >> /usr/local/etc/squid/squid.conf
echo "" >> /usr/local/etc/squid/squid.conf
echo "#visible_hostname seuhostname.seudominio" >>
/usr/local/etc/squid/squid.conf
echo "httpd_accel_host virtual" >> /usr/local/etc/squid/squid.conf
echo "httpd_accel_port 80" >> /usr/local/etc/squid/squid.conf
echo "httpd_accel_with_proxy on" >> /usr/local/etc/squid/squid.conf
echo "httpd_accel_uses_host_header on" >> /usr/local/etc/squid/squid.conf
#############################################################

#criar os diretórios do cache
squid -z

#adicona no /etc/rc.conf a linha para iniciar o squid no boot
echo "squid_enable=\"YES\"" >> /etc/rc.conf

#o squid precisa ter premissão rw no /dev/pf, então muda-se o grupo do
#pf para 'squid' e dá as permissões rw para o dono(root) e grupo(squid)
echo "own /dev/pf root:squid" >> /etc/devfs.conf
echo "perm /dev/pf 0660" >> /etc/devfs.conf

#pronto! é só rebootar a máquina que tudo vai funcionar.
#Para você configurar o squid edite o arquivo /usr/local/etc/squid/squid.conf,
#ai você vai ter que pesquisar como fazer as configurações nesse arquivo,
#ou então você pode usar o webmin para configurar (entre outras
coisas) o squid 2.5

#############################################################
#### se estiver usando o squid 2.5 compilar              ####
#### o webmin pelo ports (Versão 1.290)                  ####
cd /usr/ports/sysutils/webmin/
make clean
make install clean
#agora configure o webmin, algumas perguntas serão feitas,
#deixe todas com o valor padrão e não esqueça da senha
/usr/local/lib/webmin/setup.sh
#########################################################

#ah! e só falta dizer para o FreeBSD 'ligar' o webmin no boot

echo "webmin_enable=\"YES\"" >> /etc/rc.conf

#Pronto! Reinicie a máquina. Para acessar o webmin acesse pela porta 10000,
#ou seja http://ipdamaquina:10000/
#os clientes da sua rede necessitam ter como gateway essa máquina,
#do resto não é necessário nenhuma outra
#informação/configuração.

#==========================================================
#==========================================================
#==========================================================
#se você quiser usar o squid 2.6 as instruções estão a seguir.
#eu tentei compilar o squid 2.6 pelo ports, mas tive um comportamento bem chato.
#se eu configurasse o squid 2.6 do ports para ficar na porta 3128 (a padrão)
#então quando alguém tentasse acessar um site (www.bol.com.br , por exemplo)
#o squid tentava acessar http://www.bol.com.br:3128
#(entendem? ao invés de usar a porta 80...
#o squid tentava usar a porta dele para acessar o site.
#se eu colocasse o squid em outra porta (5050, por exemplo)
#então quando o usuário digitasse no navegador http://www.bol.com.br
#o squid tentava acessar http://www.bol.com.br:5050
#e assim para qualquer porta. Não sei se é
cabeçada/cagada/imbecilidade **minha**,
#só sei que não consegui com o squid 2.6 do ports,
#mas consegui usar o squid 2.6 quando eu
#compilei apatir dos sources do site do squid
#ah claro! se eu usasse o squid do ports e colocasse ele na porta 80
então funcionava,
#mas ai eu não poderia usar esse computador para servir páginas e
seria bem porco isso...
#==========================================================
#==========================================================
#==========================================================
#############################################################
#### Se for o usar o squid 2.6 - baixe o source no site  ####
#### http://www.squid-cache.org/Versions/v2/2.6/         ####
cd /usr/src
wget http://www.squid-cache.org/Versions/v2/2.6/squid-2.6.STABLE3.tar.gz
tar -zxvf squid-2.6.STABLE3.tar.gz
cd squid-2.6.STABLE3
./configure --bindir=/usr/local/sbin --sysconfdir=/usr/local/etc/squid
--datadir=/usr/local/etc/squid --libexecdir=/usr/local/libexec/squid
--localstatedir=/usr/local/squid '--enable-removal-policies=lru heap'
'--enable-auth=basic digest' '--enable-basic-auth-helpers=NCSA PAM
MSNT SMB YP' --enable-async-io --with-pthreads --with-aio
'--enable-storeio=ufs diskd null aufs coss' --enable-delay-pools
--enable-snmp --enable-htcp --enable-cache-digests
--enable-underscores --enable-useragent-log --enable-arp-acl
--enable-pf-transparent --with-large-files --enable-large-cache-files
--enable-stacktraces --enable-err-languages=Portuguese
--enable-default-err-language=Portuguese --prefix=/usr/local
make all
make install

pw adduser -n squid -d /dev/true

chown -R squid:squid /usr/local/squid
chown -R squid:squid /usr/local/etc/squid

chmod -R 740 /usr/local/squid
chmod -R 740 /usr/local/etc/squid
#############################################################

#o squid já está instalado, agora vamos adicionar umas regrinhas de
exemplo no squid.
#Essas regras bloqueiam todas as url que tenham a sigla 'ol' e 'orkut',
#a não ser que a url tenha também as siglas 'mail' ou 'bol'.
#Para todo o resto o acesso é liberado
#na prática significa que se são bloqueados os sites:
#www.uol.com.br www.gol.com.br www.olimpia.com.br www.orkut.com
#mas não são bloqueados os sites:
#zipmail.uol.com.br www.gmail.com www.bol.com.br

#############################################################
####    colocar em /usrl/local/etc/squid/squid.conf    #####
####    caso estiver usando o squid 2.6
echo "" > /usr/local/etc/squid/squid.conf
echo "cache_effective_user squid" >> /usr/local/etc/squid/squid.conf
echo "cache_effective_group squid" >> /usr/local/etc/squid/squid.conf
echo "http_port 127.0.0.1:3128 transparent" >> /usr/local/etc/squid/squid.conf
echo "acl all src 0.0.0.0/0.0.0.0" >> /usr/local/etc/squid/squid.conf
echo "acl to_localhost dst 127.0.0.1" >> /usr/local/etc/squid/squid.conf
echo "acl our_networks src 192.168.1.0/24" >> /usr/local/etc/squid/squid.conf
echo "acl blockSites url_regex orkut ol" >> /usr/local/etc/squid/squid.conf
echo "acl unblockSites url_regex mail bol" >> /usr/local/etc/squid/squid.conf
echo "" >> /usr/local/etc/squid/squid.conf
echo "http_access deny to_localhost" >> /usr/local/etc/squid/squid.conf
echo -n "http_access deny blockSites " >> /usr/local/etc/squid/squid.conf
echo -n ! >> /usr/local/etc/squid/squid.conf
echo "unblockSites" >> /usr/local/etc/squid/squid.conf
echo "http_access allow all" >> /usr/local/etc/squid/squid.conf
#############################################################

#criar os diretórios do cache
squid -z

#############################################################
#criar um script de inicialização:
echo -n "#" > /usr/local/etc/rc.d/squid
echo -n ! >> /usr/local/etc/rc.d/squid
echo "/bin/sh" >> /usr/local/etc/rc.d/squid
echo "" >> /usr/local/etc/rc.d/squid
echo "# PROVIDE: squid" >> /usr/local/etc/rc.d/squid
echo "# REQUIRE: LOGIN cleanvar" >> /usr/local/etc/rc.d/squid
echo "" >> /usr/local/etc/rc.d/squid
echo ". /etc/rc.subr" >> /usr/local/etc/rc.d/squid
echo "" >> /usr/local/etc/rc.d/squid
echo "name=\"squid\"" >> /usr/local/etc/rc.d/squid
echo "rcvar=\`set_rcvar\`" >> /usr/local/etc/rc.d/squid
echo "command=/usr/local/sbin/squid" >> /usr/local/etc/rc.d/squid
echo "stop_cmd=\"squid_stop\"" >> /usr/local/etc/rc.d/squid
echo "start_cmd=\"squid_start\"" >> /usr/local/etc/rc.d/squid
echo "" >> /usr/local/etc/rc.d/squid
echo "squid_stop() {" >> /usr/local/etc/rc.d/squid
echo "        echo \"Stopping \${name}.\"" >> /usr/local/etc/rc.d/squid
echo "        \${command} -k kill" >> /usr/local/etc/rc.d/squid
echo "}" >> /usr/local/etc/rc.d/squid
echo "" >> /usr/local/etc/rc.d/squid
echo "" >> /usr/local/etc/rc.d/squid
echo "squid_start() {" >> /usr/local/etc/rc.d/squid
echo "        echo \"Starting \${name}.\"" >> /usr/local/etc/rc.d/squid
echo "        \${command} -D" >> /usr/local/etc/rc.d/squid
echo "}" >> /usr/local/etc/rc.d/squid
echo "" >> /usr/local/etc/rc.d/squid
echo "load_rc_config \${name}" >> /usr/local/etc/rc.d/squid
echo "run_rc_command \"\$1\"" >> /usr/local/etc/rc.d/squid
chmod 740 /usr/local/etc/rc.d/squid
#############################################################

#adicona no /etc/rc.conf a linha para iniciar o squid no boot
echo "squid_enable=\"YES\"" >> /etc/rc.conf

#o squid precisa ter premissão rw no /dev/pf, então muda-se o grupo do
#pf para 'squid' e dá as permissões rw para o dono(root) e grupo(squid)
echo "own /dev/pf root:squid" >> /etc/devfs.conf
echo "perm /dev/pf 0660" >> /etc/devfs.conf

#pronto! é só rebootar a máquina que tudo vai funcionar.
#Para você configurar o squid edite o arquivo /usr/local/etc/squid/squid.conf,
#ai você vai ter que pesquisar como fazer as configurações nesse arquivo,
#ou então você pode usar o webmin para configurar (entre outras
coisas) o squid 2.6
#o detalhe é que o webmin que existe no ports não funciona (ainda)
para o squid 2.6
#então temos que pegar o webmin lá no site dele a versão que usei do webmin que
#funciona com o squid 2.6 é a versão 'teste' 1.300

#############################################################
####    se estiver usando o squid 2.6 tem que baixar os  ####
####        sources do webmin "beta" (Versão 1.300)      ####
####      http://download.webmin.com/devel/tarballs/     ####
####    descompactar e no diretorio onde descompactou    ####
cd /usr/src/
wget http://download.webmin.com/devel/tarballs/webmin-1.300.tar.gz
tar -zxvf webmin-1.300.tar.gz
cd webmin-1.300
#agora configure o webmin, algumas perguntas serão feitas,
#deixe todas com o valor padrão e não esqueça da senha
./setup.sh
#############################################################

#ah! e só falta dizer para o FreeBSD 'ligar' o webmin no boot
#na verdade acho que essa versão do webmin já adiciona essa
#linha no rc.conf, mas é bom garantir...

echo "webmin_enable=\"YES\"" >> /etc/rc.conf

#Pronto! Reinicie a máquina. Para acessar o webmin acesse pela porta
10000, ou seja http://ipdamaquina:10000/
#os clientes da sua rede necessitam ter como gateway essa máquina, do
resto não é necessário nenhuma outra
#informação/configuração.



-- 
Marcelo Rossi


Mais detalhes sobre a lista de discussão freebsd