Академический Документы
Профессиональный Документы
Культура Документы
4 21/04/2010
16:07
Para montar nosso servidor precisaremos ter o mínimo exigido para que este funcione.
Pré-requisitos abaixo:
- Kernel 2.6.30 ou 2.6.31, não usem o 2.6.32 porque esse está com problemas no
TProxy e por isso não é aconselhado seu uso até que seja resolvido. Existem versões
mais novas do kernel, mas ainda não fiz testes com elas.
- IPTables 1.4.3
- Squid 3.1.1
- libcap2-devel
Como o CentOS 5.4 não possui esses requisitos, seremos obrigados à baixá-los,
compilarmos e instalarmos estes. Uma outra coisa, esse tutorial não ensinará à instalar
um CentOS 5.4, pois já existem diversas documentações por aí. O que precisaremos é
de um sistema preparado para compilar programas. Precisará pelo menos disso:
# yum update
Agora veremos como está nossa rede de testes, nossa topologia antes do Servidor Proxy
em Bridge:
Nessa rede acima cada cliente sai com seu IP público e se colocássemos um Proxy
Transparente mesmo que em Bridge, teríamos o problema do IP que sairia para
navegação, que seria o do Proxy. Meu objetivo aqui é mostrar como configurar um
Proxy 100% transparente e em bridge usando o TProxy no kernel, iptables, ebtables e
Squid. Agora vejamos como ficará nossa nova topologia. Reparem que o gateway
continua sendo o mesmo 186.193.x.1, porque o Proxy, para a rede, não existirá:
Então agora vamos por a mão na massa e fazer isso funcionar de vez. Rsrsrs
Vamos baixar nossos pré-requisitos:
# cd /usr/src
# wget -c http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.10.tar.bz2
# wget -c http://ftp.iitm.ac.in/pub/linux/libs/security/linux-privs/libcap2/libcap-
2.19.tar.gz
# wget -c http://www.netfilter.org/projects/iptables/files/iptables-1.4.3.2.tar.bz2
# wget -c http://www.squid-cache.org/Versions/v3/3.1/squid-3.1.1.tar.gz
Vamos então descompactar nosso kernel, configurar ele com os módulos necessários,
compilá-lo e instalá-lo:
Agora vamos copiar uma config para o nosso kernel e depois marcar o que vamos
precisar:
# cp /boot/config-2.6.18-164.15.1.el5 .config
# make menuconfig
Agora em:
Networking support
Networking options
Network packet filtering framework (Netfilter)
Core Netfilter Configuration
<M> Netfilter connection tracking support
<M> Transparent proxying support (EXPERIMENTAL)
.
.
<M> "TPROXY" target support (EXPERIMENTAL) (NEW)
.
.
.
<M> "socket" match support (EXPERIMENTAL)
# make
# make modules_install
# make install
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=186.193.x.3
NETMASK=255.255.255.224
ONBOOT=yes
DELAY=0
No exemplo acima usei 186.193.x.3 para o IP do Proxy, nem preciso dizer que o ‘x’ é
para mascarar o IP real que tenho. Rsrsrs Vocês precisam substituir pelo IP que vocês
forem realmente usar nos testes.
Agora vamos editar as outras interfaces de rede que já devem existir no sistema de
vocês:
/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/ifcfg-eth1
# reboot
Após o boot chequem se o novo kernel foi mesmo carregado com o comando abaixo:
# uname –a
Linux proxy.localdomain 2.6.30.10 #1 SMP Tue Apr 20 03:43:59 BRT 2010 i686
athlon i386 GNU/Linux
# cd /usr/src/
# tar –xvjpf iptables-1.4.3.2.tar.bz2
# cd iptables-1.4.3.2/
# ./configure --prefix=/
# 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
mas muito IMPORTANTE!
# cd /usr/src
# tar –xvzpf libcap-2.19.tar.gz
# cd libcap-2.19/
# make && make install
# 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
# 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 idéia mas as
optimizações vai 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
# 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
http_port 3128
http_port 3129 tproxy
hierarchy_stoplist cgi-bin ?
coredump_dir /var/spool/squid
# 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
prog="$SQUID"
RETVAL=0
start() {
if [ -z "$SQUID" ]; then
echo "Insufficient privilege" 1>&2
exit 4
fi
stop() {
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 $?
# chmod +x /etc/init.d/squid
# chkconfig --levels 235 squid on
Agora que temos nosso ambiente quase pronto vamos precisar fazer os devidos
redirecionamentos e para isso vamos precisar do ebtables e ele não está nos repositórios
do CentOS. O ebtables é muito importante para o funcionamento desse nosso servidor
em modo Bridge. Se alguém estiver usando esse tutorial mas não querendo fazer uma
bridge, então poderá pular essa parte do ebtables e suas regras. Para instalarmos o
ebtables vamos adicionar o repositório do EPEL, da turma do Fedora para o
CentOS/RHEL. Antes instalaremos o yum-priorities para delegarmos prioridade nesses
repositórios e não bagunçarmos nosso ambiente.
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
priority=1
#released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?
release=$releasever&arch=$basearch&repo=updates
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
priority=1
Ainda nos repositórios vamos editar agora o epel.repo e deixá-lo como abaixo:
[epel]
name=Extra Packages for Enterprise Linux 5 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/5/$basearch
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-5&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL
priority=12
[epel-debuginfo]
name=Extra Packages for Enterprise Linux 5 - $basearch - Debug
#baseurl=http://download.fedoraproject.org/pub/epel/5/$basearch/debug
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-debug-
5&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL
gpgcheck=1
priority=12
[epel-source]
name=Extra Packages for Enterprise Linux 5 - $basearch - Source
#baseurl=http://download.fedoraproject.org/pub/epel/5/SRPMS
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-source-
5&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL
gpgcheck=1
priority=12
Quanto maior o valor do priority, menor é a prioridade dos pacotes assim se tiverem 2
pacotes iguais, um no repositório do CentOS e outro no EPEL, o pacote que será
instalado será o do CentOS e não do EPEL.
Pronto!!! Agora temos tudo que precisamos no sistema. Só precisamos fazer mais uns
acertos e uns scripts e pronto teremos nossa bridge funcionando com Squid + TProxy.
Vamos modificar a variável net.ipv4.ip_forward do /etc/sysctl.conf e adicionar mais 2
novas. Ficaria assim:
net.ipv4.ip_forward = 1
net.netfilter.nf_conntrack_acct = 1
net.ipv4.conf.lo.rp_filter = 0
Para finalizar vamos criar 2 scripts no /root/ e colocá-los em /etc/rc.local para serem
executados no boot do sistema:
/root/frw1.sh
#!/bin/bash
iptables -F -t mangle
iptables -X -t mangle
iptables -t mangle -N DIVERT
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
/root/frw2.sh
#!/bin/bash
ebtables -t broute -A BROUTING -i eth1 -p ipv4 --ip-proto tcp --ip-dport 80 -j redirect
--redirect-target DROP
cd /proc/sys/net/bridge/
for i in *
do
echo 0 > $i
done
unset i
Agora colocamos os scripts para serem executados no boot. Para isso editem o
/etc/rc.local e adicionem as 4 linhas abaixo:
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100
/root/frw1.sh
/root/frw2.sh
http://wiki.squid-cache.org/ConfigExamples/Intercept/CentOsTproxy4?
action=show&redirect=ConfigExamples
%2FTPROXYPatchingCentOS#TPROXY_v4_with_CentOS_5.3
http://wiki.squid-cache.org/Features/Tproxy4
http://techfree.com.br/wordpress/2009/01/18/tuning-no-squid/