[FUG-BR] Testando Lusca no FreeBSD 8.0-RELEASE-p2

Marcelo Gondim gondim em linuxinfo.com.br
Segunda Abril 19 22:21:32 BRT 2010


Buenas lista,

Esses dias resolvi montar um ambiente aqui pra testes pois estou querendo
implementar um Lusca/Squid com FreeBSD 8 usando o TProxy e assim o cliente
sair com seu próprio IP pelo Proxy. Antes disso fiz funcionar um Lusca
transparente em um FreeBSD 8 como bridge redirecionando os acessos pro Proxy
via PF porque com o ipfw não consegui mas não testei muito. :) perdi um bom
tempo porque estou mais acostumado com o Netfilter/IPTables. Esse ambiente
de bridge o servidor de teste estava com 2 interfaces de rede. Lógico :)
Nesse ambiente transparente o usuário não sabia da existência do Proxy e
ainda pude fazer algumas regras de Firewall. Ficou show de bola! 

A conf que fiz como bridge, sendo 192.168.10.171 o IP do servidor Proxy
Lusca Transparent:

/etc/rc.conf
============
cloned_interfaces="bridge0"
ifconfig_bridge0="inet 192.168.10.171 netmask 255.255.255.0 addm re0 addm
em0 up"
ifconfig_re0="up"
ifconfig_em0="up"
defaultrouter="192.168.10.254"
hostname="proxy.localdomain.net"
keymap="br275.iso.acc"
sshd_enable="YES"
squid_enable="YES"
pf_enable="YES"
pf_rules="/etc/pf.conf"

/etc/pf.conf
============
rdr pass on bridge0 inet proto tcp from any to any port 80 -> 192.168.10.171
port 3128

No kernel adicionei:
====================
device pf
device pflog
device pfsync
device if_bridge

Se for usar o squid31 do ports ainda precisei fazer isso. O lusca não
precisei:
============================================================================
===
chgrp squid /dev/pf
chmod 660 /dev/pf

no squid.conf:
==============
http_port 192.168.10.171:3128 transparent

Foi importante usar o IP ao invés de 127.0.0.1, porque não funcionou de
outro jeito. :) 
Aí da minha estação(192.168.10.177) saía um cabo que entrava numa interface
do proxy e do proxy outro cabo no meu router Mikrotik e o gateway da estação
era o 192.168.10.254.
Essa solução ficou perfeita pra bridge transparent mas não consegui fazer
com tproxy. Então mudei o ambiente de teste.

Nesse novo ambiente o servidor FreeBSD tinha apenas 1 interface de rede e
nesse caso usei o ipfw fwd para direcionar as requisições para o Proxy, sem
a bridge. Minha configuração ficou assim:

/etc/rc.conf
============
ifconfig_re0="inet 192.168.10.171 netmask 255.255.255.0 up"
defaultrouter="192.168.10.254"
hostname="proxy.localdomain.net"
keymap="br275.iso.acc"
sshd_enable="YES"
squid_enable="YES"
firewall_enable="YES"
firewall_script="/etc/rc.ipfw"

/etc/rc.ipfw
============
#!/bin/sh
fw="/sbin/ipfw"
rede_interna="192.168.10.0/24"
ifi="re0"
#
$fw -f flush
#
# Liberando rede da Caixa Econômica Federal do Proxy
$fw add fwd 192.168.10.254 all from $rede_interna to 200.201.160.0/20 80 in
via $ifi
#
$fw add fwd 127.0.0.1,3128 tcp from $rede_interna to any 80 in via $ifi
 
/etc/sysctl.conf
================
net.inet.ip.forwarding=1

No kernel usei essa conf:
=========================
options IPFIREWALL
options IPFIREWALL_FORWARD
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=100
options IPFIREWALL_DEFAULT_TO_ACCEPT
options IPDIVERT
options DUMMYNET
options HZ=1000
options LIBALIAS

squid.conf:
===========
http_port 3128 transparent

Coloquei o gateway da minha estação sendo o 192.168.10.171 e funcionou
perfeitamente o modo transparent do Proxy. Aí fiz o seguinte para tentar
usar o tproxy:

No squid.conf mudei para:
=========================
http_port 3128 transparent tproxy

No mikrotik router 192.168.10.254 criei as seguintes regras:
============================================================
add comment="Proxy" disabled=no distance=1 dst-address=0.0.0.0/0
gateway=192.168.10.171 routing-mark=proxy scope=30 target-scope=10

add action=mark-routing chain=prerouting comment="Proxy IN" disabled=no
src-port=80 in-interface=ether1 new-routing-mark=proxy passthrough=yes
protocol=tcp dst-address=192.168.10.0/24

Obs.: ether1 é a interface de fora da Internet e a ether2 a interface da
rede interna.

No rc.ipfw as regras ficaram assim no final do arquivo:
=======================================================
$fw add fwd 127.0.0.1,3128 tcp from $rede_interna to any 80  in via $ifi
$fw add fwd 127.0.0.1,3128 tcp from any 80 to $rede_interna  in via $ifi

E mesmo assim o tproxy não funcionou. No cache.log acusava o seguinte erro:

2010/04/19 11:03:00| comm_fdopen6: FD 21: TPROXY comm_ips_bind_rem() failed:
errno 1 ((1) Operation not permitted)
2010/04/19 11:03:01| comm_fdopen6: FD 23: TPROXY comm_ips_bind_rem() failed:
errno 1 ((1) Operation not permitted)
2010/04/19 11:03:02| comm_fdopen6: FD 24: TPROXY comm_ips_bind_rem() failed:
errno 1 ((1) Operation not permitted)
2010/04/19 11:03:02| comm_fdopen6: FD 26: TPROXY comm_ips_bind_rem() failed:
errno 1 ((1) Operation not permitted)
2010/04/19 11:03:02| comm_fdopen6: FD 28: TPROXY comm_ips_bind_rem() failed:
errno 1 ((1) Operation not permitted)
2010/04/19 11:03:02| comm_fdopen6: FD 30: TPROXY comm_ips_bind_rem() failed:
errno 1 ((1) Operation not permitted)

E ao invés de abrir a página requisitada, exibia uma página de erro do
Lusca.

Alguém já passou por isso e sabe como resolver? Tentei de tudo :D mas ainda
não descobri. Nem que seja alguma doc, howto, faq rsrsrsrs
Qualquer coisa pra eu sair desse erro. Rsrsrs

Grande abraço a todos e desculpem o enorme texto explicativo do meu
laboratório.



Mais detalhes sobre a lista de discussão freebsd