Vous êtes sur la page 1sur 52

1)

1) 2) 3) 4)
A) I) B) C) I)

SUMRIO
SUMRIO ................................................................................................... 1 INSTALAO A PARTIR DO CD .................................................................. 3 REMOO DE PACOTES .............................................................................. 4 ATUALIZANDO E AJUSTANDO O SISTEMA .................................................. 5
AJUSTES INICIAIS ................................................................................................................. 5 INTERFACE DE REDE .............................................................................................................. 5 YUM........................................................................................................................................ 5 INSTALANDO PROGRAMAS ESSENCIAIS AO SISTEMA ............................................................ 6 VIM-ENHANCED ..................................................................................................................... 6 NTP CLIENT ........................................................................................................................... 6 SISTEMA DE QUOTAS ......................................................................................................... 7

II) III) D) E)

REMOVENDO PROGRAMAS DA INCIALIZAO ........................................................................ 7 ARQUIVOS PARA BACKUP ...................................................................................................... 7

5)
A) I) II) B) I) C) I)

KERNEL ..................................................................................................... 9
PATCHS PARA O KERNEL ........................................................................................................ 9 LAYER 7 FILTER ..................................................................................................................... 9 BALABIT TRANSPARENT PROXY (TPROXY) ................................................................................. 9 COMPILANDO O KERNEL......................................................................................................... 9 HABILITANDO O LAYER 7 FILTER ............................................................................................. 9 COMPILANDO OUTROS PROGRAMAS NECESSRIOS APS MUDAR O KERNEL....................... 10 IPTABLES ............................................................................................................................ 10

6)
A)

MYSQL 5 .................................................................................................. 11
ARQUIVOS PARA BACKUP .................................................................................................... 11

7)
A) I) II)

FREERADIUS ............................................................................................ 12
CONFIGURANDO O FREERADIUS .......................................................................................... 12 USR/LOCAL/ETC/RADDB/CLIENTS.CONF ................................................................................. 12 USR/LOCAL/ETC/RADDB/RADIUSD.CONF ................................................................................ 12 USR/LOCAL/ETC/RADDB/SQL.CONF .................................................................................... 12 USR/LOCAL/ETC/RADDB/SITES-ENABLED ............................................................................... 13 COLOCANDO O FREERADIUS NA INICIALIZAO DO SISTEMA ............................................ 14 USANDO MIKROTIK .............................................................................................................. 16 HABILITANDO O SIMULTANEOUS-USE ................................................................................. 16 ARQUIVOS PARA SERVIDORES VIRTUAIS ............................................................................ 17 I) II) III) RADIUSD.CONF .................................................................................................................... 17 SQL.CONF ........................................................................................................................... 17 DIRETRIO SITES-ENABLE ................................................................................................ 18

III) IV) B) C) D) E)

F)

ARQUIVOS PARA BACKUP .................................................................................................... 19

8)
A) B)

APACHE (HTTPD), PHP E SERVIDOR FTP ................................................. 20


CONFIGURANDO O APACHE RAPIDAMENTE .......................................................................... 20 SERVIOS DE FTP ................................................................................................................. 20 1

I) C) D) E) I) II) F) I) II) III) G) H)

VSFTPD ............................................................................................................................... 20 INSTALANDO O PHP 5.2 ....................................................................................................... 21 CONFIGURANDO O PHPMYADMIN (NECESSITA PHP 5.2) ..................................................... 21 CONFIGURAO AVANADA DO APACHE.............................................................................. 21 CRIANDO O ARQUIVO /ETC/HTTPD/CONF.D/VIRTUAIS.CONF ..................................................... 22 USANDO O USERDIR ............................................................................................................ 22 INSTALANDO O MRTG/RRDTOOL.......................................................................................... 22 INSTALANDO O MRTG VIA RPM .............................................................................................. 22 COMPILANDO E INSTALANDO O RRDTOOL .............................................................................. 23 EXECUTANDO ARQUIVOS CGI ............................................................................................ 23

INSTALANDO O IPERF .......................................................................................................... 23 ARQUIVOS PARA BACKUP .................................................................................................... 24

9)
A) B) I) II) C) D) E)

BIND9 + CACHE + OPENDNS + MYSQL .................................................... 25


MODO RECURSIVO (DNS CACHE) ......................................................................................... 25 MODO NORMAL .................................................................................................................... 26 CONFIGURANDO O NAMED.CONF ........................................................................................... 27 DUMP DAS ZONAS DAS CNETT............................................................................................... 28 COLOCANDO O NAMED PARA INICIAR COM O SISTEMA ....................................................... 30 CRIANDO UMA CONTA NO OPENDNS (OPCIONAL) ............................................................... 33 ARQUIVOS PARA BACKUP .................................................................................................... 33

10)
A) B) C) D) E) F) G) I) II) H)

SQUID CACHE + TPROXY + CACHE FULL + CACHE YOUTUBE E MAIS ....... 34


CONFIGURANDO O SISTEMA DE CACHE ................................................................................ 34 CONFIGURANDO O SISTEMA DE INICIALIZAO POR SYSTEM V ......................................... 36 CRIAR O ARQUIVO DE ROTAO DE LOGS NO LOGROTATE .................................................. 38 CRIAR O ARQUIVO DE CONFIGURACAO DO SQUID NO SYSCONFIG ...................................... 38 COMO USAR O TPROXY ......................................................................................................... 38 FAZENDO OS PACOTES DO CACHE PASSAREM LOTADO PELO MIKROTIK (CACHE-FULL) ....... 39 HABILITANDO O CACHE DO YOUTUBE PELO FORMATO SCRIPT ............................................ 39 ARQUIVO COMPLETO: /ETC/SQUID/BIAZUS.SH ....................................................................... 41 ARQUIVO COMPLETO: /VAR/WWW/HTML/YOUTUBE/SCRIPTS/BIAZUSPART2.SH .......................... 42 INSTALANDO O VIDEOCACHE PARA YOUTUBE, UOL VIDEOS, METACAFE E VARIOS OUTROS 43

11)
A) I) B) C) I)

FIREWALL E QOS ..................................................................................... 46


ETC/FIREWALL/FIREWALL .................................................................................................. 46 ETC/FIREWALL/DMZ ............................................................................................................. 47 TERMINANDO O FIREWALL .................................................................................................. 48 ELBORANDO UM QOS............................................................................................................ 48 ETC/FIREWALL/QOS/QOS ...................................................................................................... 48

2)

INSTALAO A PARTIR DO CD

A instalao dever ser feita de acordo com as necessidades de cada empresa no quesito parties. No quesito seleo de pacotes deve-se retirar a seleo de todos os pacotes que so instalados por padro. A instalao final fica com +/- 904 Mb (partio master) e 11 Mb (partio de boot).

3)

REMOO DE PACOTES
Aps a instalao necessria a remoo dos pacotes desnecessrio, utilize o

comando:
rpm -e anacron-2.3-45.el5.centos apmd-3.2.2-5 at-3.1.8-82.fc6 audit-1.5.5-7.el5 autofs5.0.1-0.rc2.55 conman-0.1.9.2-8.el5 cups-1.2.4-11.14.el5 dhcdbd-2.2-1.el5 bluez-utils3.7-2.el5.centos firstboot-tui-1.4.27.3-1.el5.centos bluez-utils-3.7-2.el5.centos ibmasm-3.0-9 iptables-ipv6-1.3.5-1.2.1 irda-utils-0.9.17-2.fc6 krb5-workstation-1.6.117.el5 mdadm-2.5.4-3.el5 microcode_ctl-1.17-1.42.el5 NetworkManager-0.6.4-6.el5 nfsutils-1.0.9-24.el5 nscd-2.5-18 oddjob-0.27-7 bluez-utils-3.7-2.el5.centos pcsc-lite1.3.1-7 psacct-6.3.2-41.1 readahead-1.3-7.el5 policycoreutils-1.33.12-12.el5 nfs-utils1.0.9-24.el5 sendmail-8.13.8-2.el5 wpa_supplicant-0.4.8-10.1.fc6 ypbind-1.19-8.el5 yumupdatesd-3.0.5-1.el5.centos.5 redhat-lsb-3.1-12.3.EL.el5.centos redhat-lsb-3.112.3.EL.el5.centos system-config-securitylevel-tui-1.6.29.1-1.el5 amtu-1.0.4-4 oddjoblibs-0.27-7 selinux-policy-2.4.6-104.el5 selinux-policy-targeted-2.4.6-104.el5 setools3.0-3.el5 yp-tools-2.9-0.1 ifd-egate-0.05-15 ccid-1.0.1-6.el5 coolkey-1.1.0-5.el5 nss_ldap-253-5.el5 fontconfig-2.4.1-6.el5 cairo-1.2.4-2.el5 libXft-2.1.10-1.1 pango1.14.9-3.el5.centos gtk2-2.10.4-19.el5 GConf2-2.14.0-9.el5 bluez-gnome-0.5-5.fc6 libwnck-2.16.0-4.fc6 notification-daemon-0.3.5-8.el5 libnotify-0.4.2-6.el5 paps-0.6.617.el5 libgssapi-0.10-2 nfs-utils-lib-1.0.8-7.2.z2 lftp-3.5.1-2.fc6 pcmciautils-014-5 pinfo-0.6.9-1.fc6 ppp-2.4.4-1.el5 rp-pppoe-3.5-32.1.i386 ipsec-tools-0.6.5-8.el5 setuptool-1.19.2-1.el5.centos

Tambm devemos remover antigas configuraes e arquivos desnecessrios dos programas removidos:
rm -rf /etc/pcmcia /etc/ppp/*.rpmsave /etc/readahead.d/

Aps todas as remoes apresentadas seu sistema continuar funcionando perfeitamente e teremos muito menos pacotes a serem atualizados, fora a baixa probabilidade de existirem sploits que poderiam ser usados contra voc. O consumo de memria fsica diminui consideravelmente para +/- 800 Mb.

4)

ATUALIZANDO E AJUSTANDO O SISTEMA


A) AJUSTES INICIAIS

Iremos ajustar alguns arquivos que no sero usados j no comeo de nossos trabalhos, mas daro melhor fora no decorrer das instalaes. I) INTERFACE DE REDE Vamos configurar uma interface de rede lan para que possamos conectar ao box via SSH:
vi /etc/sysconfig/network-scripts/ifcfg-eth0

O contedo do arquivo deve ser algo assim:


DEVICE=eth0 BOOTPROTO=static HWADDR=<MAC da sua placa aqui> ONBOOT=yes TYPE=Ethernet IPADDR=<IP que ira usar aqui> NETMASK=<Mascara que ira usar aqui> GATEWAY=<Gateway da sua rede>

Vamos ajustar o hostname da mquina tambm:


vi /etc/sysconfig/network

O contedo ser algo assim:


NETWORKING=yes HOSTNAME=ns2.cnett.com.br

Vamos setar um servidor, ao menos, para resoluo de nomes:


vi /etc/resolv.conf

O contedo ser algo assim:


search cnett.com.br nameserver 200.163.208.3

E por fim o arquivo /etc/hosts, que ficar com o contedo assim:


127.0.0.1 172.30.0.254 localhost.localdomain ns2.cnett.com.br localhost ns2

Depois disso tudo feito vamos reiniciar a mquina para as configuraes tomarem efeito:
reboot

B)

YUM Vamos antes instalar o RPMForge e fazer o update do sistema:

cd wget http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt rpm --import RPM-GPG-KEY.dag.txt rm -rf RPM-GPG-KEY.dag.txt wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm rpm -Uhv rpmforge-release-0.3.6-1.el5.rf.i386.rpm rm -rf rpmforge-release-0.3.6-1.el5.rf.i386.rpm yum -y update mv -f /etc/pam.d/system-auth.rpmnew /etc/pam.d/system-auth

C)

INSTALANDO PROGRAMAS ESSENCIAIS AO SISTEMA I) VIM-ENHANCED

O VI um editor de texto poderoso e simples. A verso mais completa dele muda as cores dos scripts e arquivos facilitando sua edio e leitura. Para instalarmos essa nova verso usamos o comando:
yum -y install vim-enhanced

Aps a instalao do mesmo vamos renomear o arquivo vi para que ele use o novo programa:
rm -rf /bin/vi ln -s /usr/bin/vim /bin/vi

II)

NTP CLIENT

O NTP serve para atualizar o sistema de hora do computador. Esse atualizador deixar toda a rede em perfeita harmonia, sempre sincronizada, facilitando a analise de logs pois teremos as datas sempre atualizadas.
yum -y install ntp

Como estamos no Brasil vamos sincronizar o sistema usando o NTP.br. Para isso precisamos criar um arquivo e editar outro:
touch /etc/ntp.drift rm -rf /etc/ntp.conf vi /etc/ntp.conf

Insira o contedo abaixo no arquivo e salve:


# "memoria" para o escorregamento de frequencia do micro # pode ser necessario criar esse arquivo manualmente com # o comando touch ntp.drift driftfile /etc/ntp.drift # estatisticas do ntp que permitem verificar o historico # de funcionamento e gerar graficos statsdir /var/log/ntpstats/ statistics loopstats peerstats clockstats filegen loopstats file loopstats type day enable filegen peerstats file peerstats type day enable filegen clockstats file clockstats type day enable # servidores publicos do projeto ntp.br server a.ntp.br iburst server b.ntp.br iburst server c.ntp.br iburst # outros servidores # server outro-servidor.dominio.br iburst # configuracoes de restricao de acesso restrict default kod notrap nomodify nopeer

Vamos editar outro arquivo para que o relgio do hardware da mquina tambm seja sincronizado:
chown ntp.ntp /etc/ntp vi /etc/sysconfig/ntpd

Mude a linha:
SYNC_HWCLOCK=no

Para
SYNC_HWCLOCK=yes

Vamos iniciar o ntp pela primeira vez:


6

ntpd -q -g /sbin/hwclock --systohc /etc/rc.d/init.d/ntpd start chkconfig --level 3 ntpd on

Agora podemos ver o horrio devidamente ajustado. III) SISTEMA DE QUOTAS Para quem quer ter um sistema de quotas setado na mquina sempre interessante que haja o pacote j devidamente instalado e o sistema configurado. Para isso executaremos os seguintes comandos:
yum -y install quota

Aps instalado edite o seu /etc/fstab e adicione as seguintes clausulas as parties que voc quer habilitar as cotas:
,usrquota,grpquota

Seu arquivo ficar mais ou menos assim:


[root@ns2 ~]# cat /etc/fstab # This file is edited by fstab-sync - see 'man fstab-sync' for details LABEL=/1 / ext3 defaults,usrquota,grpquota 1 1 none /dev/pts devpts gid=5,mode=620 0 0 none /dev/shm tmpfs defaults 0 0 none /proc proc defaults 0 0 none /sys sysfs defaults 0 0 LABEL=/var/www /var/www ext3 defaults,usrquota,grpquota 1 2 LABEL=SWAP-sda3 swap swap defaults 0 0

Depois disso execute (as 3 primeiras linhas devem ser executadas para CADA uma das parties em que voc habilitou as cotas de usurios):
touch /aquota.user /aquota.group chmod 600 /aquota.* mount -o remount / quotacheck -avugm quotaon avug

Para criar o arquivo de quotas use o edquota:


edquota u <usurio> ou edquota g <grupo>

Aps isso crie um arquivo no cron para que as quotas sejam verificadas regularmente. Use o vi e crie um arquivo quotacheck no cron.daily com o seguinte contedo:
#!/bin/bash /sbin/quotaoff -avug /sbin/quotacheck -v -a /sbin/quotaon -avug

D)

REMOVENDO PROGRAMAS DA INCIALIZAO

Para que possamos remover os programas da inicializao do sistema utilizaremos o utilitrio ntsysv:
ntsysv

Remova todos os servios que no tero utilidade ao seu servidor. Em geral os servios necessrios so: crond, network, sshd, syslog e xinetd. E) ARQUIVOS PARA BACKUP Os arquivos que devem ser feitos backup na guia sistema so:
7

/etc/sysconfig/network-scripts/ifcfg-* /etc/sysconfig/network /etc/sysctl.conf /etc/resolv.conf /etc/ntp.conf /etc/host* /etc/fstab /aquota* /bk/aquota* /etc/logrotate.d/* /var/log/* /etc/passwd* /etc/shadow* /etc/cron.* /etc/crontab

5)

KERNEL
Vamos primeiro criar o source do kernel.
yum groupinstall "Development Tools" yum -y install ncurses-devel rpm-build redhat-rpm-config unifdef su <usuario sem privigelios> cd mkdir -p rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS} echo '%_topdir %(echo $HOME)/rpmbuild' > .rpmmacros wget http://mirror.centos.org/centos/5/updates/SRPMS/kernel-2.6.18-92.1.22.el5.src.rpm rpm -i kernel-2.6.18-92.1.22.el5.src.rpm 2> /dev/null cd rpmbuild/SPECS rpmbuild -bp --target=`uname -m` kernel-2.6.spec 2> prep-err.log | tee prep-out.log cd ~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.`uname -m` cp configs/kernel-2.6.18-`uname -m`.config .config make oldconfig

A)

PATCHS PARA O KERNEL I) LAYER 7 FILTER

cd wget http://ufpr.dl.sourceforge.net/sourceforge/l7-filter/netfilter-layer7-v2.21.tar.gz tar -xzvf netfilter-layer7-v2.21.tar.gz rm -rf netfilter-layer7-v2.21.tar.gz cd ~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.x86_64/ patch -p1 < ~/netfilter-layer7-v2.21/for_older_kernels/kernel-2.6.18-2.6.19-layer72.9.patch cd cp netfilter-layer7-v2.21/for_older_kernels/kernel-2.6.18-2.6.19-layer7-2.9.patch ~/rpmbuild/SOURCES/custom-l7filter-01.patch

II)

BALABIT TRANSPARENT PROXY (TPROXY)

[ Referncia: http://www.balabit.com/downloads/files/tproxy/ ] cd wget http://www.balabit.com/downloads/files/tproxy/obsolete/linux-2.6/cttproxy-2.6.182.0.6.tar.gz tar -xzvf cttproxy-2.6.18-2.0.6.tar.gz cd ~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.x86_64/ patch -p1 < ~/cttproxy-2.6.18-2.0.6/patch_tree/01-nat_reservations.patch patch -p1 < ~/cttproxy-2.6.18-2.0.6/patch_tree/02-tproxy.patch patch -p1 < ~/cttproxy-2.6.18-2.0.6/patch_tree/03-nat_delete.patch cd cp cttproxy-2.6.18-2.0.6/patch_tree/01-nat_reservations.patch ~/rpmbuild/SOURCES/customtproxy-01.patch cp cttproxy-2.6.18-2.0.6/patch_tree/02-tproxy.patch ~/rpmbuild/SOURCES/custom-tproxy02.patch cp cttproxy-2.6.18-2.0.6/patch_tree/03-nat_delete.patch ~/rpmbuild/SOURCES/customtproxy-03.patch

B)

COMPILANDO O KERNEL Vamos criar o config:

make menuconfig

Agora devemos fazer as escolhas do que deve ou no ser instalado. I) HABILITANDO O LAYER 7 FILTER
Networking > Networking Options > Network packet filtering (replaces ipchains) > IP: Netfilter Configuration

Dentro desta opo iremos marcar:


<M> Transparent Proxying <M> tporxy match support <M> TPROXY target support <M> Layer 7 match support (EXPERIMENTAL)

Antes de continuar iremos editar o arquivo .config e adicionar o tipo de sistema que ser rodado (i386 ou x86_64):
vi ~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.x86_64/.config

Agora vamos compilar o kernel e instalar:


make all make modules_install (como root) make install (como root)

Agora precisa editar o menu do Grub para que inicialize a partio correta. C) COMPILANDO OUTROS PROGRAMAS NECESSRIOS APS MUDAR O KERNEL I) IPTABLES

TODAS AS COMPILAES DEVEM SER FEITAS COM UM USURIO SEM PRIVILGIOS. Aps colocarmos o sistema layer7 e tproxy ativos precisaremos compilar o iptables para aceitar esse novo padro. Vamos baixar os componentes:
wget http://www.netfilter.org/projects/iptables/files/iptables-1.3.7.tar.bz2 tar xjf iptables-1.3.7.tar.bz2 rm -rf iptables-1.3.7.tar.bz2 cd iptables-1.3.7/

Vamos aplicar o patch do layer7 ao iptables:


patch -p1 < ~/netfilter-layer7-v2.21/iptables-1.3-for-kernel-pre2.6.20-layer7-2.21.patch chmod +x extensions/.layer7-test

Vamos aplicar o patch do tproxy:


patch -p1 < ~/cttproxy-2.6.18-2.0.6/iptables/iptables-1.3-cttproxy.diff chmod +x extensions/.tproxy-test

Agora vamos compilar o iptables:


make KERNEL_DIR=~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.x86_64/

Agora precisa ser como root:


cd <local onde est compilado seu novo iptables> rpm -e iptables --nodeps rm -rf /etc/sysconfig/iptables-config.rpmsave make install KERNEL_DIR=/home/nata/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.x86_64/ ln -s /usr/local/sbin/iptables /sbin/iptables

Agora vamos instalar os protocolos do layer7 (pode ser como root):


cd wget http://ufpr.dl.sourceforge.net/sourceforge/l7-filter/l7-protocols-2008-04-23.tar.gz tar -xzvf l7-protocols-2008-04-23.tar.gz cd l7-protocols-2008-04-23 make install

10

6)

MYSQL 5
Vamos a instalao do MySQL:
yum -y install mysql mysql-server

Ao menos um pouco de segurana interessante para o login root do MySQL, assim sendo colocaremos uma senha no MySQL e deixaremos ele para iniciar automaticamente com o sistema:
/etc/rc.d/init.d/mysqld start mysqladmin password <senha que voc quer aqui> ntsysv

Adicione o mysqld a lista dos programas a serem iniciados com o sistema. A) ARQUIVOS PARA BACKUP

/var/lib/mysql/mysql/*

11

7)

FREERADIUS
Para compilar o FreeRadius:
cd wget ftp://ftp.freeradius.org/pub/freeradius/freeradius-server-2.1.3.tar.gz tar -xzvf freeradius-server-2.1.3.tar.gz rm -rf freeradius-server-2.1.3.tar.gz cd freeradius-server-2.1.3 yum y install gcc net-snmpd-utils mysql-devel ./configure --with-snmp make make install rpm -e gcc cpp glibc-devel glibc-headers kernel-headers libgomp

A)

CONFIGURANDO O FREERADIUS I) /USR/LOCAL/ETC/RADDB/CLIENTS.CONF

Este arquivo contem as informaes referentes aos seus concentradores que iro utilizar esse servidor Radius para autenticar seus usurios. Alm disso configuraremos este arquivo para que ele possa ser executado tambm pelo prprio servidor (como no caso de uma desconexo que venha a ser necessria).
# clients.conf client 127.0.0.1 { secret = shortname nastype = } testing123 = localhost other

Esta a configurao bsica apenas para um modelo de autenticao local. II) /USR/LOCAL/ETC/RADDB/RADIUSD.CONF Alguns itens que devem ser alterados no arquivo:
logdir = /var/log/radius user = radiusd group = radiusd stripped_names = yes auth = yes auth_badpass = yes status_server = no

Nesta verso do FreeRadius possvel setar em que interface ou IP o servio estar disponvel. Se for seu caso procure informaes de como fazer isso no radiusd.conf. Vamos criar o usurio e os diretrios necessrios e dar permisso ao radius:
useradd -d /bin/false -s /bin/false radiusd mkdir /var/log/radius chown radiusd.radiusd -R /var/log/radius chown radiusd.radiusd -R /usr/local/var/run/radiusd

III)

/USR/LOCAL/ETC/RADDB/SQL.CONF

Aqui haver a configurao geral do MySQL. As linhas abaixo so as linhas que editei no arquivo:
# Connection info: server = "localhost" #port = 3306 login = "radius" password = "cnett"

Agora precisamos criar as tabelas do MySQL e o usurio. Para isso pode-se usar o sistema pr-configurado:
12

mysql -u root -p(sua senha aqui) < /usr/local/etc/raddb/sql/mysql/admin.sql mysql -u root -p(sua senha aqui) < /usr/local/etc/raddb/sql/mysql/schema.sql

No esquea de editar o arquivo admin e colocar sua senha e nome de usurio requerido. No meu caso mudei o nome de usurio para radiusd. IV) /USR/LOCAL/ETC/RADDB/SITES-ENABLED Este o diretrio onde iremos configurar nosso primeiro servidor (podem haver vrios em um mesmo computador usar a virtualizao do FreeRadius). O nome dele ser cnett.
cd /usr/local/etc/raddb/sites-enabled rm -rf cp ../sites-available/default cnett

Agora vamos editar o arquivo para se adequar a nossa necessidade. Apenas as linhas modificadas esto listadas (as linhas comentadas esto na ordem em que aparecem no arquivo):
authorize { # chap # mschap # eap { # ok = return # } # unix # files sql } accounting { # detail # unix # radutmp sql } session { # radutmp sql } post-auth { # exec # Post-Auth-Type REJECT { # attr_filter.access_reject # } } post-proxy { # eap }

Agora daremos permisses ao usurio do radius para leitura do diretrio:


chown -R radiusd.radiusd /usr/local/etc/raddb

Teoricamente seu FreeRadius est pronto para rodar. Vamos testar criando um usurio para que possamos logar no sistema:
mysql -uroot p<seu password do root>

Aps logado ao MySQL useremos a base de dados do radius:


use freeradius; INSERT INTO radusergroup VALUES ('','teste','cnett'); INSERT INTO radcheck VALUES ('','teste','Password','==','2525'); INSERT INTO radgroupcheck VALUES ('','cnett','Auth-Type',':=','Local');

Agora iniciaremos o radius em modo debug (-X) e abriremos um novo terminal SSH para o teste:
[root@ns2 ~]# radtest teste 2525 localhost 1812 testing123 Sending Access-Request of id 150 to 127.0.0.1:1812 User-Name = "teste" User-Password = "2525" 13

NAS-IP-Address = ns2.cnett.com.br NAS-Port = 1812 rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=150, length=20

Como podemos ver o pacote foi devidamente aceito e o retorno do modo debug do FreeRadius foi:
rad_recv: Access-Request packet from host 127.0.0.1:32768, id=150, length=57 User-Name = "teste" User-Password = "2525" NAS-IP-Address = 255.255.255.255 NAS-Port = 1812 Processing the authorize section of radiusd.conf modcall: entering group authorize for request 1 modcall[authorize]: module "preprocess" returns ok for request 1 modcall[authorize]: module "chap" returns noop for request 1 modcall[authorize]: module "mschap" returns noop for request 1 rlm_realm: No '@' in User-Name = "teste", looking up realm NULL rlm_realm: No such realm "NULL" modcall[authorize]: module "suffix" returns noop for request 1 rlm_eap: No EAP-Message, not doing EAP modcall[authorize]: module "eap" returns noop for request 1 radius_xlat: 'teste' rlm_sql (sql): sql_set_user escaped user --> 'teste' radius_xlat: 'SELECT id,UserName,Attribute,Value,op FROM radcheck WHERE Username = 'teste' ORDER BY id' rlm_sql (sql): Reserving sql socket id: 3 radius_xlat: 'SELECT radgroupcheck.id,radgroupcheck.GroupName,radgroupcheck.Attribute,radgroupcheck.Value,rad groupcheck.op FROM radgroupcheck,usergroup WHERE usergroup.Username = 'teste' AND usergroup.GroupName = radgroupcheck.GroupName ORDER BY radgroupcheck.id' radius_xlat: 'SELECT id,UserName,Attribute,Value,op FROM radreply WHERE Username = 'teste' ORDER BY id' radius_xlat: 'SELECT radgroupreply.id,radgroupreply.GroupName,radgroupreply.Attribute,radgroupreply.Value,rad groupreply.op FROM radgroupreply,usergroup WHERE usergroup.Username = 'teste' AND usergroup.GroupName = radgroupreply.GroupName ORDER BY radgroupreply.id' rlm_sql (sql): Released sql socket id: 3 modcall[authorize]: module "sql" returns ok for request 1 modcall: group authorize returns ok for request 1 rad_check_password: Found Auth-Type Local auth: type Local auth: user supplied User-Password matches local User-Password Login OK: [teste] (from client localhost port 1812) Sending Access-Accept of id 150 to 127.0.0.1:32768 Finished request 1

Ou seja, tudo certo... Parabns! Seu FreeRadius est configurado em modo MySQL! Agora apenas coloque o radius para iniciar com o sistema usando o ntsysv. B) COLOCANDO O FREERADIUS NA INICIALIZAO DO SISTEMA Para isso deve-se criar um arquivo dentro do init.d. Vamos criar o arquivo /etc/init.d/radiusd com o seguinte contedo:
#!/bin/sh # # chkconfig: - 88 10 # description: Start/Stop the RADIUS server daemon # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software 14

# # # #

Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Copyright (C) 2001 The FreeRADIUS Project

02111-1307

USA

http://www.freeradius.org

# Source function library. . /etc/rc.d/init.d/functions RADIUSD=/usr/local/sbin/radiusd LOCKF=/var/lock/subsys/radiusd CONFIG=/usr/local/etc/raddb/radiusd.conf [ -f $RADIUSD ] || exit 0 [ -f $CONFIG ] || exit 0 RETVAL=0 case "$1" in start) echo -n $"Starting RADIUS server: " daemon $RADIUSD RETVAL=$? echo [ $RETVAL -eq 0 ] && touch $LOCKF && ln -s /var/run/radiusd/radiusd.pid /var/run/radiusd.pid 2>/dev/null ;; stop) echo -n $"Stopping RADIUS server: " killproc $RADIUSD RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f $LOCKF ;; status) status radiusd RETVAL=$? ;; reload) echo -n $"Reloading RADIUS server: " killproc $RADIUSD -HUP RETVAL=$? echo ;; restart) $0 stop sleep 3 $0 start RETVAL=$? ;; condrestart) if [ -f $LOCKF ]; then $0 stop sleep 3 $0 start RETVAL=$? fi ;; *) echo $"Usage: $0 {start|stop|status|restart|reload|condrestart}" exit 1 esac exit $RETVAL

D permisso de execuo para ele:


chmod +x /etc/init.d/radiusd

Agora s colocar ele na inicializao do sistema usando o chkconfig:


chkconfig --level 3 radiusd on

Habilitando a rotao do log Vamos criar o arquivo /etc/logrotate.d/radiusd com o seguinte contedo:
15

# There are different detail-rotating strategies you can use. One is # to write to a single detail file per IP and use the rotate config # below. Another is to write to a daily detail file per IP with: # detailfile = ${radacctdir}/%{Client-IP-Address}/%Y%m%d-detail # (or similar) in radiusd.conf, without rotation. If you go with the # second technique, you will need another cron job that removes old # detail files. You do not need to comment out the below for method #2. /var/log/radius/radacct/*/detail { monthly rotate 4 nocreate missingok compress } /var/log/radius/checkrad.log { monthly rotate 4 create missingok compress } /var/log/radius/radius.log { weekly rotate 8 create missingok compress } /var/log/radius/radutmp { monthly rotate 4 create compress missingok } /var/log/radius/radwtmp { monthly rotate 4 create compress missingok } /var/log/radius/sqltrace.sql { monthly rotate 4 create compress missingok }

C)

USANDO MIKROTIK

Caso voc queira usar Mikrotik para autenticar em cima do FreeRadius necessrio a colocao de sua biblioteca, vamos aos passos:
cd /usr/local/share/freeradius/ rm -rf dictionary.mikrotik wget http://www.mikrotik.com/Documentation/manual_2.9/dictionary.mikrotik

D)

HABILITANDO O SIMULTANEOUS-USE

Para que possamos ter o controle sobre o nmero de conexes dos clients preciso usar o comando de login simultneo. Para isso devemos cadastrar em uma das tabelas de check o Simultaneous-Use := 1 (ou o valor que quiser), aps isso descomente, no arquivo /etc/raddb/sql.conf a linha:
simul_count_query = "SELECT COUNT(*) FROM ${acct_table1} WHERE UserName='%{SQL-UserName}' AND AcctStopTime = 0"

16

E)

ARQUIVOS PARA SERVIDORES VIRTUAIS

Aps tentar algumas alternativas resolvi fazer testes com servidores virtuais que cheguei a seguinte estrutura de arquivos: I) RADIUSD.CONF
prefix = /usr/local exec_prefix = ${prefix} sysconfdir = ${prefix}/etc localstatedir = ${prefix}/var sbindir = ${exec_prefix}/sbin logdir = /var/log/radius raddbdir = ${sysconfdir}/raddb radacctdir = ${logdir}/radacct name = radiusd confdir = ${raddbdir} run_dir = ${localstatedir}/run/radiusd db_dir = ${raddbdir} libdir = ${exec_prefix}/lib pidfile = ${run_dir}/${name}.pid user = radiusd group = radiusd max_request_time = 30 cleanup_delay = 5 max_requests = 1024 hostname_lookups = no allow_core_dumps = no regular_expressions = yes extended_expressions = yes checkrad = ${sbindir}/checkrad log { destination = files file = ${logdir}/radius.log syslog_facility = daemon stripped_names = yes auth = yes auth_badpass = yes auth_goodpass = no } security { max_attributes = 200 reject_delay = 1 status_server = no } proxy_requests = no thread pool { start_servers = 4 max_servers = 16 min_spare_servers = 2 max_spare_servers = 8 max_requests_per_server = 0 } modules { $INCLUDE ${confdir}/modules/ $INCLUDE sql.conf $INCLUDE sql/mysql/counter.conf } instantiate { exec expr expiration logintime } $INCLUDE policy.conf $INCLUDE sites-enabled/

II)

SQL.CONF

sql sql_pppoe { database = "mysql" driver = "rlm_sql_${database}" server = "localhost" login = "radiusd" password = "3dg7ce" 17

radius_db = "mikrotik" acct_table1 = "radacct" acct_table2 = "radacct" postauth_table = "radpostauth" authcheck_table = "radcheck" authreply_table = "radreply" groupcheck_table = "radgroupcheck" groupreply_table = "radgroupreply" usergroup_table = "usergroup" deletestalesessions = yes sqltrace = no sqltracefile = ${logdir}/sqltrace.sql num_sql_socks = 5 connect_failure_retry_delay = 60 nas_table = "nas" $INCLUDE sql/${database}/pppoe.conf }

Criar cpia do arquivo dialup.conf para pppoe.conf para se adequar a nova configurao. III) DIRETRIO SITES-ENABLE Dentro deste diretrio eu criei um arquivo para o servio radius do um provedor assim:
################################### # Paths e afins # ################################### prefix = /usr/local exec_prefix = ${prefix} sysconfdir = ${prefix}/etc localstatedir = ${prefix}/var sbindir = ${exec_prefix}/sbin logdir = /var/log/radius raddbdir = ${sysconfdir}/raddb radacctdir = ${logdir}/radacct ################################### # Configuracoes de servidores # ################################### client 172.30.0.166 { shortname secret virtual_server } = pppoe = cnett1298 = ppp

#-#-#-#-# # Servidor virtual para auth/acct # Servico: PPPoE/HotSpot #-#-#-#-# server ppp { # Auth listen { type = auth ipaddr = 172.30.0.27 port = 1812 } # Accounting listen { type = acct ipaddr = 172.30.0.27 port = 1813 } client 172.30.0.166 { shortname = pppoe secret = cnett1298 type = other } authorize { preprocess suffix sql_pppoe expiration 18

logintime pap } authenticate { Auth-Type PAP { pap } Auth-Type CHAP { chap } } preacct { preprocess acct_unique suffix files } accounting { sql_pppoe attr_filter.accounting_response } session { sql_pppoe } }

F)

ARQUIVOS PARA BACKUP

/etc/init.d/radiusd /usr/local/etc/raddb/* /usr/local/share/freeradius/* /var/lib/mysql/mikrotik/*

19

8)

APACHE (HTTPD), PHP E SERVIDOR FTP


Vamos instalar o servidor Apache com suporte a php:
yum -y install httpd php php-mysql

A)

CONFIGURANDO O APACHE RAPIDAMENTE

Para que possamos usar o Apache mais rapidamente apenas editaremos algumas configuraes do mesmo. Edite o arquivo /etc/httpd/conf/httpd.conf e mude as linhas abaixo:
DirectoryIndex index.html index.htm index.shtml index.cgi index.php index.php3 index.pl LanguagePriority pt-BR en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt ru sv zh-CN zh-TW AddDefaultCharset ISO-8859-1

Aps isso inicie o Apache:


/etc/rc.d/init.d/httpd start

Caso queira coloque o Apache na inicializao pelo ntsysv. B) SERVIOS DE FTP I) VSFTPD

O VerySecure FTP Daemon o servidor FTP oficial do Fedora. Vamos instalar ele usando o Yum:
yum -y install vsftpd

Uma configurao simples para o VSFTPd a seguinte:


ftpd_banner=[[ Servidor FTP Cyber Nett ]] hide_file={.*} anonymous_enable=NO chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list chroot_local_user=YES connect_from_port_20=YES data_connection_timeout=120 idle_session_timeout=300 max_clients=4 max_per_ip=2 force_dot_files=YES listen=YES listen_port=2101 nopriv_user=ftp pam_service_name=vsftpd local_enable=YES log_ftp_protocol=YES write_enable=YES local_umask=022 xferlog_enable=YES xferlog_enable=YES xferlog_file=/var/log/vsftpd.log xferlog_std_format=YES

Aps feito isso faremos a configurao dos arquivos necessaries:


touch /etc/vsftpd/chroot_list

20

Para que os clientes possam conectar eles devem estar cadastrados no sistema (usando o useradd) e precisam ter uma Shell vlida. Caso queira que o usurio no seja ENJAULADO (chroot) coloque o login dele dentro do arquivo chroot_list. C) INSTALANDO O PHP 5.2 Caso queira remover alguns bugs e problemas de segurana vamos fazer o upgrade do PHP. Primeiro vamos instalar o repositrio do Yum:
rpm --import http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka vi /etc/yum.repos.d/utterramblings.repo

Coloque o seguinte contedo dentro dele:


[utterramblings] name=Jason's Utter Ramblings Repo baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/ enabled=0 gpgcheck=1 gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka

Agora vamos instalar o PHP 5.2:


yum y --enablerepo=utterramblings install php php-mysql php-mbstring php-mcrypt

Prontinho... Seu PHP est na verso mais atualizada possvel. D) CONFIGURANDO O PHPMYADMIN (NECESSITA PHP 5.2) O PHPMyAdmin um administrador para o banco de dados MySQL muito simples de usar. Para instalar ele devemos proceder da seguinte maneira:
wget http://ufpr.dl.sourceforge.net/sourceforge/phpmyadmin/phpMyAdmin-3.1.1-alllanguages.tar.bz2 tar --bzip2 -xf phpMyAdmin-3.1.1-all-languages.tar.bz2 mv phpMyAdmin-3.1.1-all-languages /var/www/html/phpmyadmin chown apache.apache -R /var/www/html/phpmyadmin

Vamos configurar o PHPMyAdmin pelo Wizard. Para isso precisamos dos comandos:
cd /var/www/html/phpmyadmin mkdir config chmod o+rw config cp config.inc.php config/

Agora entre pelo navegador no endereo http://ip.do.seu.servidor/phpmyadmin/setup e siga os passos. Feito isso vamos copiar o arquivo para o diretrio raiz e apagar o diretrio de configurao.
mv config/config.inc.php config.inc.php chmod o-rw config.inc.php

Pronto! E) CONFIGURAO AVANADA DO APACHE O Apache pode ser configurado mais a fundo quando precisamos ter mais de um domnio rodando no mesmo servidor (neste tutorial no est incluso tutorial sobre como coordenar emails destes outros domnios). Primeiro vamos editar o arquivo base de configurao do sistema (alm das edies feitas no item A deste captulo, adicionaremos as abaixo listadas):
ServerAdmin webmaster@cnett.com.br ServerName ns2.cnett.com.br:80 NameVirtualHost *

21

I)

CRIANDO O ARQUIVO /ETC/HTTPD/CONF.D/VIRTUAIS.CONF

Neste arquivo teremos todos os domnios que sero hospedados nesta mquina. Farei apenas um exemplo de arquivo, o restante apenas adio.
<VirtualHost *> DocumentRoot /var/www/html/dominios/cnett.com.br ServerName www.cnett.com.br ErrorLog logs/cnett.com.br_error_log CustomLog logs/cnett.com.br_access_log common </VirtualHost> <VirtualHost *> DocumentRoot /var/www/html/mrtg ServerName mrtg.cnett.com.br </VirtualHost>

No primeiro exemplo coloco a opo de gravar os logs deste domnio em arquivo separado do geral do servidor. No segundo os logs sero armazenados junto com o restante do servidor. NO ESQUEA DE CRIAR OS DIRETRIOS DE CADA UM DOS DOMNIOS! Caso contrrio o Apache no iniciar. II) USANDO O USERDIR Para usar o sistema de UserDir (www.exemplo.com/~usuario) muito simples basta descomentar as linhas:
UserDir public_html . . . <Directory /home/*/public_html> AllowOverride FileInfo AuthConfig Limit Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec <Limit GET POST OPTIONS> Order allow,deny Allow from all </Limit> <LimitExcept GET POST OPTIONS> Order deny,allow Deny from all </LimitExcept> </Directory>

Agora dentro do diretrio raiz do usurio (/home/usuario) voc deve criar um diretrio public_html assim esse diretrio sera visto pelo servidor web. Para que funcione voc deve dar permiso de leitura e execuo para o usurio do Apache. Na minha opinio crie o usurio dentro do grupo do apache que sera suficiente. F) INSTALANDO O MRTG/RRDTOOL Para monitorar o trfego na rede o MRTG uma importante ferramenta e, para que possamos ter melhor desempenho na elaborao e montagem dos grficos utilizaremos o RRDTOOL. Abaixo explicarei como instalar um e outro. I) INSTALANDO O MRTG VIA RPM O MRTG pode ser instalado via pacote do sistema usando o YUM:
yum y install mrtg

Como no queremos o diretrio do MRTG no local onde colocado moveremos o mesmo e apagaremos o arquivo de configurao do Apache:
mv /var/www/mrtg/ /var/www/html/ rm -rf /etc/httpd/conf.d/mrtg.conf chown apache.apache -R /var/www/html/mrtg/

Aps isso vamos editar o arquivo que criado no cron e adicionarmos um # para comentar a linha existente. Terminado reiniciaremos o apache:
22

vi /etc/cron.d/mrtg /etc/rc.d/init.d/httpd restart

Aps o final da instalao podemos testar o funcionamento do MRTG tentando conectar a um servidor que tenha SNMP habilitado (vamos usar o cfgmaker):
cfgmaker <comunidade>@<ip do servidor>

II)

COMPILANDO E INSTALANDO O RRDTOOL

Infelizmente no h um pacote RPM da verso mais atual do RRDTool disponvel para o CentOS v5.1. Por este motivo compilaremos o sistema:
cd /root wget http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.2.27.tar.gz tar -xzvf rrdtool-1.2.27.tar.gz cd rrdtool-1.2.27 yum y install libpng-devel libart_lgpl-devel freetype-devel python-devel tcl-devel ./configure make make install

Aps feitos todos estes processos seu RRDTool estar instalado no diretrio /usr/local/rrdtool-1.2.27. III) EXECUTANDO ARQUIVOS CGI Para executar arquivos CGI devemos atender para dois fatos: teremos que liberar o acesso CGI a alguns diretrios e devemos adicionar o handler de CGI. Para isso faremos o seguinte:
vi /etc/httpd/conf/httpd.conf

Descomente a linha:
AddHandler cgi-script .cgi

Aps isso criaremos um arquivo com as configuraes dos diretrios com scripts CGI:
vi /etc/httpd/conf.d/cgi.conf

Ele deve conter o seguinte:


<Directory /var/www/html/mrtg> Options +ExecCGI </Directory>

Este contedo deve ser repetido para todos os diretrios que precisarem de execuo CGI. G) INSTALANDO O IPERF O iPerf um programa (socket) para teste de velocidade e desempenho de rede que pode rodar em diversas portas, imitando os programas que sero usados. Para instalar usaremos:
cd wget http://ufpr.dl.sourceforge.net/sourceforge/iperf/iperf-2.0.4.tar.gz tar -xzvf iperf-2.0.4.tar.gz cd iperf-2.0.4.tar.gz ./configure make make install

Para instalar preciso que o GCC-C++ esteja instalado. Aps isso, para rodar o programa usa-se o comando:
ipserf -s

23

Este comando ir executar o sistema em modo servidor. Para que o teste seja feito necessrio uma mquina Windows com o jPerf instalado ou uma mquina Linux com o iPerf instalado e rodando como cliente. H) ARQUIVOS PARA BACKUP

/etc/httpd/* /var/www/* /etc/mrtg/*

24

9)

BIND9 + CACHE + OPENDNS + MYSQL


A) MODO RECURSIVO (DNS CACHE)

Um servidor DNS em modo recursivo far o cache dos nomes pesquisados a partir dele para agilizar a resoluo dos mesmos aos clientes desse servidor. Edite ou crie o arquivo /etc/named.conf com as seguintes informaes:
options { // Para pesquisar usando o OpenDNS forwarders { 208.67.222.222; 208.67.220.220; }; } controls { inet 127.0.0.1 allow { localhost; } keys { rndc-key; }; }; include "/etc/rndc.key"; acl local { localhost; 127.0.0.1/32; <COLOQUE SUAS OUTRAS REDES AQUI> }; view "local" { match-clients { local; }; recursion yes; }; view "externa" { match-clients { any; }; recursion no; additional-from-auth no; additional-from-cache no; };

Caso queira faa a criao do inicializador SYSTEM V do bind (parte C deste captulo) e inicie o sistema:
/etc/rc.d/init.d/named start

Aps iniciado vamos configurar o servidor para que procure por domnios no localhost para isso editaremos o arquivo /etc/resolv.conf e deixaremos ele com apenas uma linha:
nameserver 127.0.0.1

Agora vamos testar o sistema:


[root@ns2 etc]# nslookup www.google.com.br Server: 127.0.0.1 Address: 127.0.0.1#53 Non-authoritative answer: www.google.com.br canonical name = www.google.com. www.google.com canonical name = www.l.google.com. Name: www.l.google.com Address: 72.14.205.104 Name: www.l.google.com Address: 72.14.205.147 Name: www.l.google.com Address: 72.14.205.99 Name: www.l.google.com Address: 72.14.205.103

Veja que o servico est em perfeito funcionamento j que na pesquisa realizada pelo nslookup ao google.com.br este retornou que a resposta veio do servidor 127.0.0.1 (caso voc mude o recursion para no dentro do arquivo named.conf essa resposta no seria expressada).
25

B)

MODO NORMAL Vamos ao passo a passo:

cd wget http://ftp.isc.org/isc/bind9/9.4.3/bind-9.4.3.tar.gz tar -xzvf bind-9.4.3.tar.gz wget http://ufpr.dl.sourceforge.net/sourceforge/mysql-bind/mysql-bind.tar.gz tar -xzvf mysql-bind.tar.gz cp mysql-bind/mysqldb.c bind-9.4.3/bin/named/ cp mysql-bind/mysqldb.h bind-9.4.3/bin/named/include/named/ cd bind-9.4.3/bin/named/ mysql_config --cflags mysql_config --libs vi Makefile.in

Mudar as linhas (colocar as linhas com o contedo abaixo):


DBDRIVER_OBJS = mysqldb.@O@ DBDRIVER_SRCS = mysqldb.c DBDRIVER_INCLUDES = -I/usr/include/mysql -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic fasynchronous-unwind-tables -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE fno-strict-aliasing -fwrapv DBDRIVER_LIBS = -L/usr/lib/mysql -lmysqlclient -lz -lcrypt -lnsl -lm -L/usr/lib -lssl lcrypto

Agora editar o arquivo main.c e adicionar a seguinte linha em negrito:


#include <stdlib.h> #include <string.h> #include <named/mysqldb.h>

Ainda no mesmo arquivo a seguinte linha (negrito):


if (result != ISC_R_SUCCESS) ns_main_earlyfatal("dlz_drivers_init() failed: %s", isc_result_totext(result)); #endif mysqldb_init(); ns_server_create(ns_g_mctx, &ns_g_server);

No mesmo arquivo mais uma linha (negrito):


ns_server_destroy(&ns_g_server); mysqldb_clear(); ns_builtin_deinit();

Agora vamos compilar:


cd .. cd .. ./configure make

Vamos criar o banco de dados. Para isso eu usei o PHPMyAdmin mas pode ser feito por um arquivo com o seguinte modelo (vi bind.sql):
CREATE USER 'bind'@'localhost'; SET PASSWORD FOR 'bind'@'localhost' = PASSWORD('SENHA QUE VOCE QUER'); CREATE DATABASE bind; GRANT ALL ON bind.* TO 'bind'@'localhost'; FLUSH PRIVILEGES; use bind; #--# Aqui vo os dados ja para funcionar depois edite como queira #--26

--- Estrutura da tabela `cnett` -CREATE TABLE IF NOT EXISTS `cnett` ( `name` varchar(128) default NULL, `ttl` bigint(20) unsigned default '3600', `rdtype` varchar(128) NOT NULL default '', `rdata` varchar(128) NOT NULL default '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1; --- Extraindo dados da tabela `cnett` -INSERT INTO `cnett` (`name`, `ttl`, `rdtype`, `rdata`) VALUES ('cnett.com.br', 3600, 'NS', 'ns1.cnett.com.br'), ('cnett.com.br', 3600, 'SOA', 'cnett.com.br. dns.cnett.com.br. 2008121701 2H 2M 1W 1H'), ('www.cnett.com.br', 3600, 'CNAME', 'ns1.cnett.com.br.'), ('ns1.cnett.com.br', 3600, 'A', '200.163.208.2');

Depois d o comando de criao ao SQL:


mysql -u root p(senha do root) < bind.sql

I)

CONFIGURANDO O NAMED.CONF criar o arquivo e editar suas primeiras caractersticas (vi

Vamos /etc/named.conf):

options { // Para pesquisar usando o OpenDNS forwarders { 208.67.222.222; 208.67.220.220; }; }; controls { inet 127.0.0.1 allow { localhost; } keys { rndc-key; }; }; include "/etc/rndc.key"; acl local { localhost; 127.0.0.1/32; }; view "local" { match-clients { local; }; recursion yes; zone "cnett.com.br" { type master; notify no; database "mysqldb bind cnett localhost bind SENHA"; }; }; view "externa" { match-clients { any; }; recursion no; additional-from-auth no; additional-from-cache no; zone "cnett.com.br" { type master; notify no; database "mysqldb bind cnett localhost bind SENHA"; }; };

Depois de feito isso vamos checar a configurao para a criao dos arquivos:
mkdir /var/named rndc-confgen -a 27

Vamos criar um a um os arquivos do bind. II)


---------

DUMP DAS ZONAS DAS CNETT

phpMyAdmin SQL Dump version 3.1.1 http://www.phpmyadmin.net Servidor: localhost Tempo de Gerao: Dez 30, 2008 as 04:43 PM Verso do Servidor: 5.0.45 Verso do PHP: 5.2.6

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; --- Banco de Dados: `bind` --- ---------------------------------------------------------- Estrutura da tabela `200_101_166` -CREATE TABLE IF NOT EXISTS `200_101_166` ( `name` varchar(128) default NULL, `ttl` bigint(20) unsigned default '3600', `rdtype` varchar(128) NOT NULL default '', `rdata` varchar(128) NOT NULL default '' ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT; --- Extraindo dados da tabela `200_101_166` -INSERT INTO `200_101_166` (`name`, `ttl`, `rdtype`, `rdata`) VALUES ('0-127.166.101.200.in-addr.arpa', 3600, 'SOA', 'cnett.com.br. 2008121701 2H 2M 1W 1H'), ('0-127.166.101.200.in-addr.arpa', 3600, 'NS', 'ns1.cnett.com.br'), ('0-127.166.101.200.in-addr.arpa', 3600, 'NS', 'ns2.cnett.com.br'); -- ---------------------------------------------------------- Estrutura da tabela `200_140_222_128` -CREATE TABLE IF NOT EXISTS `200_140_222_128` ( `name` varchar(128) default NULL, `ttl` bigint(20) unsigned default '3600', `rdtype` varchar(128) NOT NULL default '', `rdata` varchar(128) NOT NULL default '' ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT; --- Extraindo dados da tabela `200_140_222_128` -INSERT INTO `200_140_222_128` (`name`, `ttl`, `rdtype`, `rdata`) VALUES ('128-255.222.140.200.in-addr.arpa', 3600, 'SOA', 'cnett.com.br. dns.cnett.com.br. 2008121701 2H 2M 1W 1H'), ('128-255.222.140.200.in-addr.arpa', 3600, 'NS', 'ns1.cnett.com.br'), ('128-255.222.140.200.in-addr.arpa', 3600, 'NS', 'ns2.cnett.com.br'); -- ---------------------------------------------------------- Estrutura da tabela `200_163_208_0` -CREATE TABLE IF NOT EXISTS `200_163_208_0` ( `name` varchar(128) default NULL, `ttl` bigint(20) unsigned default '3600', `rdtype` varchar(128) NOT NULL default '', `rdata` varchar(128) NOT NULL default '' 28 dns.cnett.com.br.

) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT; --- Extraindo dados da tabela `200_163_208_0` -INSERT INTO `200_163_208_0` (`name`, `ttl`, `rdtype`, `rdata`) VALUES ('0-127.208.163.200.in-addr.arpa', 3600, 'SOA', 'cnett.com.br. dns.cnett.com.br. 2008121701 2H 2M 1W 1H'), ('0-127.208.163.200.in-addr.arpa', 3600, 'NS', 'ns1.cnett.com.br'), ('0-127.208.163.200.in-addr.arpa', 3600, 'NS', 'ns2.cnett.com.br'), ('2.0-127.208.163.200.in-addr.arpa', 3600, 'PTR', 'ns1.cnett.com.br.'), ('6.0-127.208.163.200.in-addr.arpa', 3600, 'PTR', 'ns2.cnett.com.br.'), ('10.0-127.208.163.200.in-addr.arpa', 3600, 'PTR', 'loja.cnett.com.br.'); -- ---------------------------------------------------------- Estrutura da tabela `201_35_16_0` -CREATE TABLE IF NOT EXISTS `201_35_16_0` ( `name` varchar(128) default NULL, `ttl` bigint(20) unsigned default '3600', `rdtype` varchar(128) NOT NULL default '', `rdata` varchar(128) NOT NULL default '' ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT; --- Extraindo dados da tabela `201_35_16_0` -INSERT INTO `201_35_16_0` (`name`, `ttl`, `rdtype`, `rdata`) VALUES ('0-255.16.35.201.in-addr.arpa', 3600, 'SOA', 'cnett.com.br. 2008121701 2H 2M 1W 1H'), ('0-255.16.35.201.in-addr.arpa', 3600, 'NS', 'ns1.cnett.com.br'), ('0-255.16.35.201.in-addr.arpa', 3600, 'NS', 'ns2.cnett.com.br'); -- ---------------------------------------------------------- Estrutura da tabela `clickdanoite` -CREATE TABLE IF NOT EXISTS `clickdanoite` ( `name` varchar(128) default NULL, `ttl` bigint(20) unsigned default '3600', `rdtype` varchar(128) NOT NULL default '', `rdata` varchar(128) NOT NULL default '' ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; --- Extraindo dados da tabela `clickdanoite` -INSERT INTO `clickdanoite` (`name`, `ttl`, `rdtype`, `rdata`) VALUES ('web.clickdanoite.com.br', 3600, 'CNAME', 'web.cnett.com.br.'), ('www.clickdanoite.com.br', 3600, 'CNAME', 'web.clickdanoite.com.br.'), ('clickdanoite.com.br', 3600, 'NS', 'ns1.cnett.com.br'), ('clickdanoite.com.br', 3600, 'NS', 'ns2.cnett.com.br'), ('clickdanoite.com.br', 3600, 'SOA', 'cnett.com.br. dns.cnett.com.br. 2008121701 2H 2M 1W 1H'); -- ---------------------------------------------------------- Estrutura da tabela `cnett` -CREATE TABLE IF NOT EXISTS `cnett` ( `name` varchar(128) default NULL, `ttl` bigint(20) unsigned default '3600', `rdtype` varchar(128) NOT NULL default '', `rdata` varchar(128) NOT NULL default '' ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; 29 dns.cnett.com.br.

--- Extraindo dados da tabela `cnett` -INSERT INTO `cnett` (`name`, `ttl`, `rdtype`, `rdata`) VALUES ('ns1.cnett.com.br', 3600, 'A', '200.163.208.2'), ('', 3600, 'MX', '10 aspmx.google.com.'), ('', 3600, 'MX', '20 alt1.aspmx.google.com.'), ('', 3600, 'MX', '20 alt2.aspmx.google.com.'), (' ', 3600, 'MX', '30 aspmx2.googlemail.com.'), ('', 3600, 'MX', '30 aspmx3.googlemail.com.'), ('', 3600, 'MX', '30 aspmx4.googlemail.com.'), ('', 3600, 'MX', '30 aspmx5.googlemail.com.'), ('cnett.com.br', 3600, 'NS', 'ns1.cnett.com.br'), ('cnett.com.br', 3600, 'NS', 'ns2.cnett.com.br'), ('cnett.com.br', 3600, 'SOA', 'cnett.com.br. dns.cnett.com.br. 2008121701 2H 2M 1W 1H'), ('ns2.cnett.com.br', 3600, 'A', '200.163.208.6'), ('dns.cnett.com.br', 3600, 'A', '200.163.208.6'), ('qos.cnett.com.br', 3600, 'CNAME', 'ns1.cnett.com.br.'), ('web.cnett.com.br', 3600, 'CNAME', 'ns2.cnett.com.br.'), ('webmail.cnett.com.br', 3600, 'CNAME', 'ghs.google.com.'), ('docs.cnett.com.br', 3600, 'CNAME', 'ghs.google.com.'), ('www.cnett.com.br', 3600, 'CNAME', 'web.cnett.com.br.'), ('ftp.cnett.com.br', 3600, 'CNAME', 'web.cnett.com.br.'), ('speed.cnett.com.br', 3600, 'CNAME', 'web.cnett.com.br.'), ('apae.cnett.com.br', 3600, 'CNAME', 'web.cnett.com.br.'), ('loja.cnett.com.br', 3600, 'A', '200.163.208.10');

C)

COLOCANDO O NAMED PARA INICIAR COM O SISTEMA

Vamos criar alguns arquivos. O primeiro o /etc/sysconfig/named com o seguinte contedo:


ROOTDIR=/var/named

Agora vamos criar o arquivo /etc/init.d/named e adicionar o seguinte contedo:


#!/bin/bash # # named This shell script takes care of starting and stopping # named (BIND DNS server). # # chkconfig: - 13 87 # description: named (BIND) is a Domain Name Server (DNS) \ # that is used to resolve host names to IP addresses. # probe: true # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. [ -r /etc/sysconfig/network ] && . /etc/sysconfig/network # Check that networking is up. [ "${NETWORKING}" = "no" ] && exit 1 [ -r /etc/sysconfig/named ] && . /etc/sysconfig/named # Don't kill named during clean-up NAMED_SHUTDOWN_TIMEOUT=${NAMED_SHUTDOWN_TIMEOUT:-100} if [ -n "$ROOTDIR" ]; then ROOTDIR=`echo $ROOTDIR | sed 's#//*#/#g;s#/$##'`; rdl=`/usr/bin/readlink $ROOTDIR`; if [ -n "$rdl" ]; then ROOTDIR="$rdl"; fi; fi RETVAL=0 named='named' prog=$named 30

[ -x /usr/local/sbin/$named ] || exit 1 nmdcOption() { let i=0; for a in $*; do ((++i)); if [ $a = -c ]; then ((++i)); eval 'echo $'$i; elif [[ $a = -c* ]]; then echo ${a#-c}; fi; done; } named_c_option=`nmdcOption $OPTIONS`; named_conf=${named_c_option:-/etc/named.conf}; start() { # Start daemons. echo -n $"Starting named: " if [ -n "`/sbin/pidof -o %PPID $named`" ]; then echo -n $"named: already running" failure echo return 1 fi conf_ok=0; if [ -x /usr/local/sbin/named-checkconf ] && [ -x /usr/local/sbin/namedcheckzone ] && /usr/local/sbin/named-checkconf $ckcf_options ${named_conf} >/dev/null 2>&1; then conf_ok=1; else RETVAL=$?; fi if [ $conf_ok -eq 1 ]; then daemon /usr/local/sbin/named ${OPTIONS}; RETVAL=$?; if [ $RETVAL -eq 0 ]; then rm -f /var/run/named.pid rm -f /var/run/named_sdb.pid 2>/dev/null fi; if [ -n "`/sbin/pidof -o %PPID $named`" ]; then # Verify that named actually started (JM 2006-10-04) if [ ! -e /var/run/named.pid ]; then # If there is not a file containing the PID of the now running named daemon then create it (JM 2006-10-04) echo `/sbin/pidof -o %PPID $named` > /var/run/named.pid; fi; fi; else named_err="`/usr/local/sbin/named-checkconf $ckcf_options $named_conf 2>&1`"; echo echo $"Error in named configuration"':'; echo "$named_err"; failure echo if [ -x /usr/bin/logger ]; then echo "$named_err" | /usr/bin/logger -pdaemon.error -tnamed fi; return $RETVAL; fi; [ $RETVAL -eq 0 ] && touch /var/lock/subsys/named echo return $RETVAL } stop() { # Stop daemons. echo -n $"Stopping $named: " /usr/local/sbin/rndc stop >/dev/null 2>&1 RETVAL=$? if [ $RETVAL -eq 0 ]; then timeout=0 while : ; do if /sbin/pidof -o %PPID $named >/dev/null; then 31

if [ $timeout -ge $NAMED_SHUTDOWN_TIMEOUT ]; then killproc $named -TERM >/dev/null 2>&1 RETVAL=$? break else sleep 2 && echo -n "." timeout=$((timeout+2)) fi; else break fi; done fi; if [ $RETVAL -eq 0 ]; then rm -f /var/lock/subsys/named rm -f /var/run/named.pid fi; if [ $RETVAL -eq 0 ]; then success else failure fi; echo return $RETVAL } rhstatus() { /usr/local/sbin/rndc status return $? } restart() { stop # wait a couple of seconds for the named to finish closing down sleep 5 start } reload() { echo -n $"Reloading $named: " p=`/sbin/pidof -o %PPID $named` RETVAL=$? if [ "$RETVAL" -eq 0 ]; then /usr/local/sbin/rndc reload >/dev/null 2>&1 || /bin/kill -HUP $p; RETVAL=$? fi [ "$RETVAL" -eq 0 ] && success $"$named reload" || failure $"$named reload" echo return $? } probe() { # named knows how to reload intelligently; we don't want linuxconf # to offer to restart every time /usr/local/sbin/rndc reload >/dev/null 2>&1 || echo start return $? } checkconfig() { ckcf_options='-z'; # enable named-checkzone for each zone (9.3.1+) ! if [ -n "${ROOTDIR}" -a "x${ROOTDIR}" != "x/" ]; then OPTIONS="${OPTIONS} -t ${ROOTDIR}" ckcf_options="$ckcf_options -t ${ROOTDIR}"; fi; if [ -x /usr/local/sbin/named-checkconf ] && [ -x /usr/local/sbin/namedcheckzone ] && /usr/local/sbin/named-checkconf $ckcf_options ${named_conf} | cat ; then return 0; else return 1; fi } # See how we were called. case "$1" in start) start ;; stop) stop ;; 32

status) rhstatus ;; restart) restart ;; condrestart) if [ -e /var/lock/subsys/named ]; then restart; fi ;; reload) reload ;; probe) probe ;; checkconfig|configtest|check|test) checkconfig ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|reload|probe}" exit 1 esac exit $?

Agora s adicionar ele para iniciar com o sitema:


chkconfig --add named chkconfig --level 3 named on

D)

CRIANDO UMA CONTA NO OPENDNS (OPCIONAL)

Caso queira ter melhores controles e estatsticas de phising e uso de servios DNS na sua rede abara uma conta no OpenDNS: https://www.opendns.com/enterprise/start/device/bind s seguir os 3 passos e depois cadastrar suas redes. E) ARQUIVOS PARA BACKUP

/etc/named.* /var/lib/mysql/bind/*

33

10) SQUID CACHE + TPROXY + CACHE FULL + CACHE YOUTUBE E MAIS


Vamos instalar o Squid com suporte ao TProxy. Para isso use um usurio sem privilgios.
(como root) cp /home/nata/rpmbuild/BUILD/kernel-2.6.18/linux2.6.18.x86_64/include/linux/netfilter_ipv4/ip_tproxy.h /usr/include/linux/netfilter_ipv4/ (como root) cp /usr/include/linux/capability.h /usr/include/sys cd wget http://www.squid-cache.org/Versions/v2/2.6/squid-2.6.STABLE22.tar.bz2 cd squid-2.6.STABLE22 ./configure --enable-linux-netfilter --enable-storeio=ufs,aufs,diskd,null --enable-arpacl --enable-removal-policies=lru,heap --enable-snmp --enable-delay-pools --enablereferer-log --enable-useragent-log --enable-large-files --enable-default-errlanguage=Portuguese --with-filedescriptors=16384 --enable-linux-tproxy make all (como root) make install

Nas opes habilitamos o nmero de FILEDESCRIPTORS para 16384. um nmero grande mas deve ser feito isso para que no tenhamos problemas de falta de FDs no Squid. Para garantirmos o seu funcionamento devemos adicionar o seguinte contedo ao arquivo vi /etc/security/limits.conf:
* * soft hard nofile nofile 17408 17408

Aps isso REINICIE o servidor e continue o processo. A) CONFIGURANDO O SISTEMA DE CACHE Vamos comear pelo ponto principal que criar um atalho para a configurao do squid:
ln -s /usr/local/squid/etc/ /etc/squid

Com isso j teremos a segurana de achar os arquivos de configurao dentro do /etc/squid. Tambm precisamos garantir que o box ir transportar os dados para frente. Para isso usaremos o arquivo rc.local (/etc/rc.d/rc.local) e adicionaremos as seguintes linhas:
echo 1 > /proc/sys/net/ipv4/ip_forward echo 1 > /proc/sys/net/ipv4/ip_nonlocal_bind

REINICIE A MQUINA ANTES DE TESTAR O PROXY! O arquivo principal de configurao o /etc/squid/squid.conf que ter o contedo abaixo:
http_port 3128 tproxy transparent tcp_outgoing_address 172.30.0.17 icp_port 0 cache_mem 128 MB cache_swap_low 92 cache_swap_high 96 maximum_object_size 1000000 KB cache_replacement_policy heap LFUDA memory_replacement_policy heap LFUDA cache_dir cache_dir cache_dir cache_dir aufs aufs aufs aufs /cache/00/00 /cache/00/01 /cache/01/00 /cache/01/01 45500 45500 45500 45500 16 16 16 16 256 256 256 256

cache_store_log none access_log /usr/local/squid/var/logs/access.log squid 34

client_netmask 255.255.255.255 ftp_user squid@cnett.com.br diskd_program /usr/local/squid/libexec/diskd unlinkd_program /usr/local/squid/libexec/unlinkd error_directory /usr/local/squid/share/errors/Portuguese dns_nameservers 200.163.208.6 200.163.208.2 dns_testnames www.uol.com.br www.terra.com.br www.cnett.com.br #acl manager proto cache_object #acl google dstdomain .google.com .orkut.com #acl youtube dstdomain .youtube.com acl acl acl acl acl acl acl acl acl acl acl all src 0.0.0.0/0 localhost src 127.0.0.1/32 to_localhost dst 127.0.0.0/8 QUERY urlpath_regex cgi-bin \? SSL_ports port 443 Safe_ports port 80 21 443 70 210 280 488 591 777 1025-65535 CONNECT method CONNECT PPP_01 src 200.101.166.0/24 PPP_02 src 201.35.16.0/24 EMS_NRT_01 src 192.168.40.0/24 V01 src 200.163.208.0/25 src 10.200.200.0/24 src 172.30.0.0/24 allow TESTE_0 allow TESTE_1 allow allow allow allow PPP_01 PPP_02 V01 EMS_NRT_01

acl TESTE_0 acl TESTE_1 http_access http_access http_access http_access http_access http_access

#http_access allow manager localhost #http_access deny manager http_access allow localhost http_access allow to_localhost #cache allow google #cache allow youtube cache deny QUERY http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access deny all icp_access deny all cache_mgr suporte@cnett.com.br cache_effective_user squid cache_effective_group squid visible_hostname cache.cnett.com.br unique_hostname cache.cnett.com.br

Aps criado o arquivo de configurao vamos criar o diretrio:


mkdir /cache useradd -s /sbin/nologin -d /dev/null squid chown squid.squid /cache/ chmod o-rwx /etc/squid/squid.conf chown .squid /etc/squid/squid.conf

Agora podemos criar os diretrios iniciais:


/usr/local/squid/sbin/squid -z

Caso no queira usar o TPROXY tire a opo do lado do HTTP_port e coloque a normal transparent.
35

B)

CONFIGURANDO O SISTEMA DE INICIALIZAO POR SYSTEM V

Como o Squid no tem um script de inicializao precisaremos criar um. Vamos criar o atalho do squid:
ln -s /usr/local/squid/sbin/squid /usr/sbin/squid

Agora vamos criar o arquivo /etc/init.d/squid com o seguinte conteudo:


#!/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 PATH=/usr/bin:/sbin:/bin:/usr/sbin export PATH # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ ${NETWORKING} = "no" ] && exit 0 # check if the squid conf file is present [ -f /etc/squid/squid.conf ] || exit 0 if [ -f /etc/sysconfig/squid ]; then . /etc/sysconfig/squid 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} # determine the name of the squid binary [ -f /usr/local/squid/sbin/squid ] && SQUID=squid [ -z "$SQUID" ] && exit 0 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() { 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/log/squid/squid.pid ] || break 36

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() { 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/log/squid/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() { $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 ;; 37

restart) restart ;; condrestart) condrestart ;; status) rhstatus ;; probe) exit 0 ;; *) echo $"Usage: $0 {start|stop|status|reload|restart|condrestart}" exit 1 esac exit $?

Depois disso vamos adicion-lo a inicializao do sistema:


chmod 700 /etc/rc.d/init.d/squid chkconfig --add squid chkconfig --level 345 squid on

Assim ele ir iniciar e parar quando o sistema der um reboot, poweroff ou poweron. C) CRIAR O ARQUIVO DE ROTAO DE LOGS NO LOGROTATE O arquivo deve ser criado em /etc/logrotate.d/squid e ter este contedo:
/var/log/squid/access.log { daily rotate 14 copytruncate compress notifempty missingok } /var/log/squid/cache.log { weekly rotate 8 copytruncate compress notifempty missingok }

D)

CRIAR O ARQUIVO DE CONFIGURACAO DO SQUID NO SYSCONFIG Criar o arquivo no diretrio /etc/sysconfig/squid com o contedo:

# default squid options # -D disables initial dns checks. If you most likely will not to have an # internet connection when you start squid, uncomment this SQUID_OPTS="-D" # Time to wait for Squid to shut down when asked. Should not be necessary # most of the time. SQUID_SHUTDOWN_TIMEOUT=100

E)

COMO USAR O TPROXY

O objetivo do TPROXY fazer com que o cliente final no saiba que est passando por um proxy, ou seja, ele ter o cache mas ele no saber desse detalhe. Para isso usaremos um mludo do xtables que j est compilado junto ao kernel e ao iptables (COMPILE O KERNEL E O IPTABLES!).
38

Vamos criar um script que dever rodar depois das regras de firewall (tipo redirecionamento da Conectividade Social) mas antes do NAT (que no poder ser feito nesta mquina!). Para tal vamos criar o arquivo /etc/firewall/squid:
#!/bin/bash IP="/sbin/ip" IPT="/sbin/iptables" $IPT -t tproxy -F #---------# Redes que no devem passar pelo SQUID #---------$IPT t tproxy A PREROUTING d (REDE) j ACCEPT #---------# Regras para o funcionamento TCP do SQUID #---------$IPT -t tproxy -A PREROUTING -s (REDE QUE PASSA PELO PROXY, PODE TER MAIS DE UMA) -p tcp --dport 80 -j TPROXY --on-port 3128

Agora vamos dar permisso de execuo para o arquivo e setar as permisses de usurio:
chmod go-rwx /etc/firewall/squid chmod u+x /etc/firewall/squid

F)

FAZENDO OS PACOTES MIKROTIK (CACHE-FULL)

DO

CACHE

PASSAREM

LOTADO

PELO

[Referncia: http://www.site.ondainternet.com.br/tutorial/mikrotik/]

De acordo com o amigo Alexandre Correa (Onda Internet) possvel marcar os pacotes provenientes do cache dentro do Mikrotik (apenas os pacotes que esto taggeados como HIT). Sendo assim, dentro do Mikrotik o processo simples. O script abaixo pode ser colado diretamente no console (caso haja alguma regra de marcao de pacotes no mangle e no queue simple do Mikrotik mova as regras recem criadas para o topo da lista).
/ip firewall mangle add action=mark-connection chain=forward comment="(cache_full)SQUID:HIT_con" content="XCache: HIT" disabled=no new-connection-mark=squid-conn-HIT passthrough=yes protocol=tcp src-port=80 add action=mark-packet chain=forward comment="(cache_full)SQUID:HIT_pkg" connectionmark=squid-conn-HIT disabled=no new-packet-mark=squid-pkg-HIT passthrough=yes /queue tree add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=squid-download packet-mark=squid-pkg-HIT parent=global-out priority=1 queue=default

G)

HABILITANDO O CACHE DO YOUTUBE PELO FORMATO SCRIPT

[Referncia: http://www.vivaolinux.com.br/artigo/Cache-do-Youtube-efetivo-no-Linux] [Referncia: http://www.biazus.com/]

Para fazermos essa parte funcionar precisamores do Apache instalado e mais algumas outras coisas. Primeiro instale o apache conforme o item 8, captulo A e depois siga os passos abaixo. Adicione ao final do arquivo /etc/httpd/conf/httpd.conf o seguinte contedo:
NameVirtualHost *:80 <VirtualHost *:80> Alias /YOUTUBE /var/www/html/YOUTUBE <Directory "/var/www/html/YOUTUBE"> AllowOverride All Allow from all </Directory> </VirtualHost>

Vamos criar o diretrio recm indicado:


39

mkdir /var/www/html/YOUTUBE

Agora inicie o apache e verifique se rodou. Coloque ele na inicializao do sistema pelo ntsysv. Agora vamos configurar o squid. Editar o squid.conf e adicionar as linhas em nregito:
APS AS ACLS!!!! url_rewrite_children 70 acl store_rewrite_list dstdomain .orkut.com .windowsupdate.com .youtube.com url_rewrite_access allow store_rewrite_list url_rewrite_access deny all url_rewrite_program /etc/squid/biazus.sh acl youtubecache dstdomain .youtube.com cache deny youtubecache

Vamos agorar criar as pastas de acesso e dar as devidas permisses ao squid. Depois iremos baixar os scripts necessrios:
mkdir /var/www/html/YOUTUBE/SCRIPTS mkdir /var/www/html/YOUTUBE/PLAYER chown -R squid.squid /var/www/html/YOUTUBE/ cd /var/www/html/YOUTUBE/PLAYER/ wget http://www.biazus.com/html/rewriter/PLAYER.tar tar -xf PLAYER.tar cd PLAYER mv * ../ cd .. rm -rf PLAYER PLAYER.tar cd .. cd SCRIPTS/ wget http://www.biazus.com/html/rewriter/biazuspart2.sh cd .. cd .. chmod 775 YOUTUBE -R

Agora precisamos editar, a mo, o arquivo biazuspart2.sh que est dentro da pasta SCRIPTS e modificar as linhas:
diretorio="/var/www/html/YOUTUBE" youtubewww="http://200.163.208.14/YOUTUBE" player="http://200.163.208.14/YOUTUBE/PLAYER"

Adicione as seguintes linhas (em negrito):


/bin/mkdir /bin/touch /bin/touch echo "1" > $diretorio/$arquivoachar && $diretorio/$arquivoachar/2 && $diretorio/$arquivoachar/stats && $diretorio/$arquivoachar/stats &&

OBSERVAO 1: Mude o caminho para o touch de /usr/bin/touch para /bin/touch em todos os locais em que ele aparece. OBSERVAO 2: Coloque um -q em todos os locais onde o wget usado. Com isso ele no colocar dados do download no cache.log. Agora vamos baixar o script que ser executado pelo squid:
cd /etc/squid/ wget http://www.biazus.com/html/rewriter/biazus.sh

Edite o arquivo e mude apenas as linhas:


$YOUTUBE = "/var/www/html/YOUTUBE"; $SERVERIP = "200.163.208.14";

Adicione a seguinte linha (em negrito):


else { system("/bin/bash /etc/squid/stats.sh $arquivoachar");

40

print $fh "YOUTUBE REDIRECIONADO http://$SERVERIP/YOUTUBE/$arquivoachar/pagina.html\n";

DE

$url

Para

Crie o arquivo /etc/squid/stats.sh com o seguinte contedo:


#!/bin/bash arquivoachar=$1 touch /var/www/html/YOUTUBE/$arquivoachar/stats visitas=`cat /var/www/html/YOUTUBE/$arquivoachar/stats` visitas=`expr $visitas + 1` echo $visitas > /var/www/html/YOUTUBE/$arquivoachar/stats

Crie o arquivo /etc/squid/youdel.sh com o seguinte contedo:


#!/bin/bash dir="/var/www/html/YOUTUBE" echo "Script de delecao iniciado em `date`" >> /tmp/youdeldebug num="0" for n in `find $dir/ | grep stats` do acessos=`cat $n` if [ "$acessos" -lt "$1" ] then file=`echo $n | cut -d\/ -f 6` data=`date` # rm -rf $dir/$file/ echo "$data Diretorio [$dir/$file/] /tmp/youdeldebug num=`expr $num + 1` fi done echo "Script de delecao /tmp/youdeldebug echo "" >> /tmp/youdeldebug encerrado em `date`.

APAGADO

do

cache."

>>

Diretorios

apagados:

$num."

>>

DESCOMENTE FUNCIONAMENTO.

LINHA

RM

RF

QUANDO

ESTIVER

CONFIANTE

DO

Coloque esse servio para rodar semanalmente no crontab:


33 5 * * 0 root /etc/squid/youdel.sh 5

Este commando indicar ao Cron que execute todos os domingos s 5h33m00s o script youdel.sh e o script apagar todos os diretrios que tenham sido vistos menos de 5 vezes naquela semana. Agora os comandos finais:
chmod +x biazus.sh youdel.sh stats.sh chown squid.squid biazus.sh youdel.sh stats.sh echo > /tmp/debug_url_redirect.log chmod 777 /tmp/debug_url_redirect.log echo > /tmp/youdebug chmod 777 /tmp/youdebug echo > /tmp/youdeldebug chmod 777 /tmp/youdeldebug

Agora reiniciar o Squid e rezar pra tudo funcionar direitinho. I) ARQUIVO COMPLETO: /ETC/SQUID/BIAZUS.SH
#!/usr/bin/perl ########################################################################## # Script de Cache do Youtube Desenvolvido por Luiz Biazus ## # Msn e email luiz@biazus.com ## ########################################################################## #X[0]-> URL EX: IMG1.ORKUT.COM #X[1]-> CLIENT IP: 189.10.203.13/ANGEL.GINET.COM.BR #X[2]-> #X[3]-> GET ou POST 41

#X[4]-> #X[5]-> MYIP : 189.10.203.1 OU 127.0.0.1 #X[6]-> MYPORT EX: 8012 au.download.windowsupdate.com $|=1; $YOUTUBE = "/var/www/html/YOUTUBE"; $SERVERIP = "200.163.208.14"; while (<>) { open $fh, ">>/tmp/debug_url_redirect.log"; @X = split; $url = $X[0]; $metodo = $X[3]; print $fh "entrada: $url\n"; #YOUTUBE if (($url =~ /^http:\/\/br.youtube.com\/watch\?v=/) /^http:\/\/www.youtube.com\/watch\?v=/ )) { @achar = split(/\//, $url); $arquivoachar = $achar[$#achar]; $resultado = `/bin/ls $YOUTUBE`; @array = split(/\n/, $resultado); $flagy = 0; $arquivoachar2 = $arquivoachar; $arquivoachar =~ s/\?/__/; @achar2 = split(/\&/, $arquivoachar); $arquivoachar = $achar2[0]; || ($url =~

for $i (0 .. $#array){ if($array[$i] eq "$arquivoachar") { $baixando=`ls $YOUTUBE/$arquivoachar/2 | wc -l`; if($baixando == 1) { print "$url\n"; print $fh "YOUTUBE AINDA ESTA BAIXANDO $arquivoachar nao redirecionado\n"; $flagy = 1; goto Fora; } else { system("/bin/bash $arquivoachar");

VIDEO

/etc/squid/stats.sh

print $fh "YOUTUBE REDIRECIONADO DE $url Para http://$SERVERIP/YOUTUBE/$arquivoachar/pagina.html\n"; $url = "http://$SERVERIP/YOUTUBE/$arquivoachar/pagina.html"; print $fh "saida: $url\n"; print "http://$SERVERIP/YOUTUBE/$arquivoachar/pagina.html\n"; $flagy = 1; goto Fora; } } $i++; } Fora: if($flagy == 0 ) { print "$url\n"; system("/bin/bash $YOUTUBE/SCRIPTS/biazuspart2.sh $url"); print $fh "YOUTUBE NAO REDIRECIONADO DESTA VEZ A PROXIMA SERAH: arquivoachar $arquivoachar urllllll $url\n"; } } #FIM DO YOUTUBE else { print $fh "nao redirecionado\n"; print "$url\n"; } close $fh; }

II)
#!/bin/bash

ARQUIVO /VAR/WWW/HTML/YOUTUBE/SCRIPTS/BIAZUSPART2.SH

COMPLETO:

42

################################################################################ #Script de cache do youtube parte 2 desenvolvido por Luiz Biazus e Andre Chiodi# #6/09/2008 # ################################################################################ PATH=/sbin:/bin:/usr/sbin:/usr/bin export PATH umask 022 [ -z "${1}" ] && { echo 'Error! Missing url or video_id!' >> /tmp/youdebug ; exit 1 ; } diretorio="/var/www/html/YOUTUBE" swap="$1" ; swap2=`echo $swap | cut -d"/" -f4 | cut -d"&" -f1` ; swap3=`echo $swap2 | sed s/?/__/` arquivoachar=$swap3 youtubewww="http://200.163.208.14/YOUTUBE" player="http://200.163.208.14/YOUTUBE/PLAYER" URL="http://br.youtube.com" /bin/mkdir /bin/touch /bin/touch echo "1" > $diretorio/$arquivoachar && $diretorio/$arquivoachar/2 && $diretorio/$arquivoachar/stats && $diretorio/$arquivoachar/stats &&

#PEGA PAGINA chmod +rx $diretorio/$arquivoachar -R && wget -q -p -k -F -nd --no-cookies --output-document=$diretorio/$arquivoachar/pagina.html $1 && chmod +rx $diretorio/$arquivoachar/pagina.html && #TROCA PLAYERS sed '/<div id="watch-this-vid">/,/<div id="watch-ratings-views">/c \ <div id="watch-this-vid"><div id="watch-player-div" class="flash-player"><embed type="application/x-shockwave-flash" src="'$player'/player.swf" style="" id="bannerswf" name="bannerswf" bgcolor="#ffffff" quality="high" allowfullscreen="true" allowscriptaccess="always" wmode="opaque" flashvars="file='$youtubewww'/'$arquivoachar'/video.flv&fullscreen=true&autostart=true&" width="480" height="350"></div><div id="watch-main-area" > <div id="watch-ratingsviews">' $diretorio/$arquivoachar/pagina.html > $diretorio/$arquivoachar/swap.html && mv $diretorio/$arquivoachar/swap.html $diretorio/$arquivoachar/pagina.html && chmod +rx $diretorio/$arquivoachar/pagina.html && #sed '/<div id="watch-this-vid">/,/<div id="watch-ratings-views">/c \ #<div id="watch-this-vid"> <embed type="application/x-shockwave-flash" src="'$player'/player.swf" style="" id="bannerswf" name="bannerswf" bgcolor="#ffffff" quality="high" allowfullscreen="true" allowscriptaccess="always" wmode="opaque" flashvars="file='$youtubewww'/'$arquivoachar'/video.flv&fullscreen=true&autostart=true&" width="480" height="350"><div id="watch-ratings-views">' $diretorio/$arquivoachar/pagina.html > $diretorio/$arquivoachar/swap.html && #mv $diretorio/$arquivoachar/swap.html $diretorio/$arquivoachar/pagina.html && #chmod +rx $diretorio/$arquivoachar/pagina.html && #BAIXA VIDEO #[ -z "${1}" ] && { echo 'Error! Missing url or video_id!' ; exit 1 ; } DOWNLOAD=`wget -q -O - "${URL}/watch?v=${1/*=}" | grep -oE 'video_id=.*&t=[^\"&]*' | head -1` wget -q -O "$diretorio/$arquivoachar/video.flv" "${URL}/get_video?${DOWNLOAD}" && chmod +rx $diretorio/$arquivoachar -R && chown squid.squid $diretorio/$arquivoachar -R && echo "[[[ ACELERADOR DO YOUTUBE by Luiz Biazus ]]]" >> $diretorio/$arquivoachar/pagina.html && rm $diretorio/$arquivoachar/2 && echo "COPIADO $1 em $diretorio/$arquivoachar !!! O Script Executou com Sucesso!" >> /tmp/youdebug

H)

INSTALANDO O VIDEOCACHE METACAFE E VARIOS OUTROS

PARA

YOUTUBE,

UOL

VIDEOS,

[Referncia: http://cachevideos.com/installation]

Primeiro instale o Apache conforme o item 8, captulo A e depois siga os passos abaixo.
yum install squid python python-iniparse python-urlgrabber

Vamos fazer o download do VideoCache e instalar:


43

cd wget http://cachevideos.com/sites/default/files/pub/videocache/videocache-1.81.noarch.rpm rpm -ivh videocache-1.8-1.noarch.rpm --nodeps

O programa ir instalar os seguintes arquivos:


/etc/httpd/conf.d/videocache.conf /etc/videocache.conf /usr/sbin/update-vc /usr/share/man/man8/videocache.8.gz /usr/share/videocache /usr/share/videocache/Errors.py /usr/share/videocache/Errors.pyc /usr/share/videocache/Errors.pyo /usr/share/videocache/__init__.py /usr/share/videocache/__init__.pyc /usr/share/videocache/__init__.pyo /usr/share/videocache/config.py /usr/share/videocache/config.pyc /usr/share/videocache/config.pyo /usr/share/videocache/parser.py /usr/share/videocache/parser.pyc /usr/share/videocache/parser.pyo /usr/share/videocache/videocache.py /usr/share/videocache/videocache.pyc /usr/share/videocache/videocache.pyo /var/log/videocache /var/log/videocache/videocache.log /var/spool/videocache /var/spool/videocache/bliptv /var/spool/videocache/break /var/spool/videocache/dailymotion /var/spool/videocache/google /var/spool/videocache/metacafe /var/spool/videocache/redtube /var/spool/videocache/soapbox /var/spool/videocache/tmp /var/spool/videocache/tube8 /var/spool/videocache/tvuol /var/spool/videocache/vimeo /var/spool/videocache/wrzuta /var/spool/videocache/xtube /var/spool/videocache/youporn /var/spool/videocache/youtube

Agora iremos configurar o arquivo do VideoCache (apenas as variveis alteradas e seu contedo):
cache_host = 200.163.208.14 proxy = http://200.163.208.14:3128/ hit_threshold = 1 base_dir = /cache/YOUTUBE/ rpc_host = 200.163.208.14

Agora vamos editar o arquivo do squid para o redirecionamento das pginas no arquivo /etc/squid/squid.conf adicionando as seguintes linhas DEPOIS do registro das ACLs:
# --BEGIN-- videocache config for squid url_rewrite_program /usr/bin/python /usr/share/videocache/videocache.py url_rewrite_children 5 acl videocache_allow_url url_regex -i \.youtube\.com\/get_video\? acl videocache_allow_url url_regex -i \.googlevideo\.com\/videoplayback \.googlevideo\.com\/get_video\? acl videocache_allow_url url_regex -i \.google\.com\/videoplayback \.google\.com\/get_video\? acl videocache_allow_url url_regex -i \.google\.[a-z][a-z]\/videoplayback \.google\.[az][a-z]\/get_video\? acl videocache_allow_url url_regex -i proxy[a-z0-9\-][a-z0-9][a-z0-9][a-z09]?\.dailymotion\.com\/ acl videocache_allow_url url_regex -i vid\.akm\.dailymotion\.com\/ acl videocache_allow_url url_regex -i [a-z0-9][0-9a-z][0-9a-z]?[0-9a-z]?[0-9az]?\.xtube\.com\/(.*)flv 44

acl videocache_allow_url url_regex -i bitcast\.vimeo\.com\/vimeo\/videos\/ acl videocache_allow_url url_regex -i va\.wrzuta\.pl\/wa[0-9][0-9][0-9][0-9]? acl videocache_allow_url url_regex -i \.files\.youporn\.com\/(.*)\/flv\/ acl videocache_allow_url url_regex -i \.msn\.com\.edgesuite\.net\/(.*)\.flv acl videocache_allow_url url_regex -i media[a-z0-9]?[a-z0-9]?[a-z0-9]?\.tube8\.com\/ acl videocache_allow_url url_regex -i \.mais\.uol\.com\.br\/(.*)\.flv acl videocache_allow_url url_regex -i \.video[a-z0-9]?[a-z09]?\.blip\.tv\/(.*)\.(flv|avi|mov|mp3|m4v|mp4|wmv|rm|ram) acl videocache_allow_url url_regex -i video\.break\.com\/(.*)\.(flv|mp4) acl videocache_allow_dom dstdomain v.mccont.com dl.redtube.com .cdn.dailymotion.com acl videocache_deny_url url_regex -i http:\/\/[a-z][a-z]\.youtube\.com http:\/\/www\.youtube\.com url_rewrite_access deny videocache_deny_url url_rewrite_access allow videocache_allow_url url_rewrite_access allow videocache_allow_dom redirector_bypass on # --END-- videocache config for squid

Ainda deve-se alterar as permisses do localhost acessar a mquina no squid.conf. As minhas configuraes ficaram assim:
acl localhost src 127.0.0.1/32 200.163.208.14/32 acl to_localhost dst 127.0.0.0/8 200.163.208.14/32

Agora voc deve saber onde ir colocar seus vdeos. Crie a pasta e d as permisses:
mkdir /cache/YOUTUBE mv /var/spool/videocache/* /cache/YOUTUBE/ chmod a+rw -R /cache/YOUTUBE/ chown squid.squid -R /cache/YOUTUBE

Agora vamos configurar o diretrio do YOUTUBE para receber conexes WEB. Para isso edite o arquivo /etc/httpd/conf.d/videocache.conf mude seu contedo para se adequar a sua necessidade, o meu ficou assim:
Alias /videocache /cache/YOUTUBE <Directory "/cache/YOUTUBE"> Options +Indexes Order Allow,Deny Allow from all </Directory>

Reinicie o apache e reinicie o squid:


/etc/rc.d/init.d/httpd /etc/rc.d/init.d/httpd /etc/rc.d/init.d/squid /etc/rc.d/init.d/squid stop start stop start

Agora teste para ver se esse local visto pela internet e depois inicie o Squid para testar os downloads.

45

11) FIREWALL E QOS


A elaborao de um firewall que seja eficiente para o indispensvel. Assim sendo separei o firewall em vrios pequenos grupos. A) /ETC/FIREWALL/FIREWALL Vamos a criao do diretrio:
mkdir /etc/firewall cd /etc/firewall/

provedor

Agora vamos criar o arquivo /etc/firewall/firewall com o seguinte contedo:


#!/bin/bash #---# Variaveis de Sistema #---IPT="/usr/sbin/iptables" RT="/sbin/route" #---# Regras gerais de tratamento de pacotes #---$IPT -F $IPT -t nat -F $IPT -t nat -X $IPT -X $IPT -F INPUT $IPT -F FORWARD $IPT -F OUTPUT #---------# Aceita todas as conexoes do loopback #---------$IPT -A INPUT -i lo -j ACCEPT $IPT -A FORWARD -i lo -j ACCEPT #---------# Ping-of-Death, Syn-Flood, Port-Scanner # Permissao de ping para as interfaces locais #---------$IPT -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT $IPT -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT $IPT -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT $IPT -A INPUT -p icmp -m limit --limit 1/s -j ACCEPT #---------# Aceita conexoes estabelecidades #---------$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #---------# LOG e DROP de pacotes fragmentados #---------$IPT -A FORWARD -m state --state INVALID -j DROP $IPT -A INPUT -f -j LOG --log-prefix "Pacote INPUT fragmentado: " $IPT -A INPUT -f -j DROP $IPT -A FORWARD -f -j LOG --log-prefix "Pacote FORWARD fragmentado: " $IPT -A FORWARD -f -j DROP #---------# Declara IP dos Servidores #---------QOS="200.163.208.2" MAIL="200.163.208.6" CACHE="172.31.0.2" #CACHE="200.163.208.14" #---------# Declara redes utilizadas por este cache #---------V01="200.163.208.0/30" # rede roteador/qos 46

V02="200.163.208.4/30" V03="200.163.208.8/30" V04="200.163.208.12/30" V05="200.163.208.16/28" V06="200.163.208.32/27" V07="200.163.208.64/26" V08="200.140.222.128/25" V09="201.35.16.0/24" V10="200.101.166.0/24" I01="172.31.0.4/30" I02="172.31.0.8/30" HS1="192.168.254.0/24" PTP="172.16.0.0/24" ptp.mk.elj) APS="10.0.0.0/8" #--------# Redes com NAT #--------EMS_LOCAL="192.168.40.0/24"

# # # # # # # # # # # # #

rede rede rede rede rede rede rede rede rede rede rede rede rede

qos/mail CNett - Escritorio qos/cache RESERVADA RESERVADA CLIENTES IP/FIXO (subnets no ptp.mk.elj) RESERVADA PPPoE PPPoE BACKBONE cache > auth BACKBONE auth > ptp HOTSPOT PTP CNett (ELJ>EMA/ELJ>EMS/ELJ>CNETT) (subnets no

# rede APS (ELJ/EMA/EMS/CNETT) (subnets no ptp.mk.elj)

#---------# Declara rotas para redes distantes #---------$RT add -net $V03 gw $CACHE $RT add -net $V07 gw $CACHE $RT add -net $V09 gw $CACHE $RT add -net $V10 gw $CACHE $RT add -net $I01 gw $CACHE $RT add -net $I02 gw $CACHE $RT add -net $PTP gw $CACHE $RT add -net $HS1 gw $CACHE $RT add -net $APS gw $CACHE $RT add -net $EMS_LOCAL gw $CACHE #---------# DMZ #---------#/etc/firewall/dmz #---------# Regras para o funcionamento #---------$IPT -t tproxy -A PREROUTING 3128 $IPT -t tproxy -A PREROUTING 3128 $IPT -t tproxy -A PREROUTING 3128 $IPT -t tproxy -A PREROUTING port 3128 TCP do SQUID -s $V03 -d ! $V02 -p tcp --dport 80 -j TPROXY --on-port -s $V09 -d ! $V02 -p tcp --dport 80 -j TPROXY --on-port -s $V10 -d ! $V02 -p tcp --dport 80 -j TPROXY --on-port -s $EMS_LOCAL -d ! $V02 -p tcp --dport 80 -j TPROXY --on-

#--------# Mascara todas as redes nao roteaveis # que passam por este servidor #--------#$IPT -t nat -A POSTROUTING -s $NS2_DMZ -j MASQUERADE

I)

/ETC/FIREWALL/DMZ

Uma DMZ uma zona desmilitarizada dentro da rede. Ela s ser til caso voc queira acessar mquinas da sua rede interna atravs de um IP rotevel. Caso deseje usar um modelo do arquivo este (deve descomentar a linha que inicializa a DMZ no firewall):
#!/bin/bash IPT="/usr/sbin/iptables" DMZ_PRI="172.20.0.2" DMZ_PUB="200.252.138.2" #--# Regras para redirecionamento SSH #--SSH_PORT_PUB="2203" 47

SSH_PORT_PRI="2202" $IPT -t nat -A PREROUTING -d $DMZ_PUB -p tcp -m tcp --dport $SSH_PORT_PUB -j DNAT --todestination $DMZ_PRI:$SSH_PORT_PRI #--# Regras para direcionamento VIGO #--#VG_01="3306" # MySQL Server #VG_02="21" # FTP Server #VG_03="25" # SMTP Server #VG_04="80" # WEB Server #VG_05="110" # POP Server #VG_06="7412" # VIGO Socket #$IPT -t nat -A PREROUTING destination $DMZ_PRI:$VG_01 #$IPT -t nat -A PREROUTING destination $DMZ_PRI:$VG_02 #$IPT -t nat -A PREROUTING destination $DMZ_PRI:$VG_03 #$IPT -t nat -A PREROUTING destination $DMZ_PRI:$VG_04 #$IPT -t nat -A PREROUTING destination $DMZ_PRI:$VG_05 #$IPT -t nat -A PREROUTING destination $DMZ_PRI:$VG_06 -d $DMZ_PUB -p tcp -m tcp --dport $VG_01 -j DNAT --to-d $DMZ_PUB -p tcp -m tcp --dport $VG_02 -j DNAT --to-d $DMZ_PUB -p tcp -m tcp --dport $VG_03 -j DNAT --to-d $DMZ_PUB -p tcp -m tcp --dport $VG_04 -j DNAT --to-d $DMZ_PUB -p tcp -m tcp --dport $VG_05 -j DNAT --to-d $DMZ_PUB -p tcp -m tcp --dport $VG_06 -j DNAT --to-

#--# Regras para redirecionamento WINBOX #--WB_PORT="8291" WB_IP="172.20.0.2" $IPT -t nat -A PREROUTING -d $DMZ_PUB -p tcp -m tcp --dport $WB_PORT -j DNAT --todestination $WB_IP:$WB_PORT $IPT -t nat -A PREROUTING -d $DMZ_PUB -p udp -m udp --dport $WB_PORT -j DNAT --todestination $WB_IP:$WB_PORT #--# Regras para redirecionamento VNC #--#VNC_PORT="5900" #VNC_PORT_80="5800" #VNC_IP="10.1.10.2" #$IPT -t nat -A PREROUTING -d $DMZ_PUB -p tcp -m tcp --dport $VNC_PORT destination $VNC_IP:$VNC_PORT #$IPT -t nat -A PREROUTING -d $DMZ_PUB -p udp -m udp --dport $VNC_PORT destination $VNC_IP:$VNC_PORT #$IPT -t nat -A PREROUTING -d $DMZ_PUB -p tcp -m tcp --dport $VNC_PORT_80 destination $VNC_IP:$VNC_PORT_80 #$IPT -t nat -A PREROUTING -d $DMZ_PUB -p udp -m udp --dport $VNC_PORT_80 destination $VNC_IP:$VNC_PORT_80 -j DNAT --to-j DNAT --to-j DNAT --to-j DNAT --to-

B)

TERMINANDO O FIREWALL Terminado o servio dentro do firewall vamos dar permisso de execuo:

chmod +x /etc/firewall/* chmod -R go-rx /etc/firewall

Por fim deveremos editar o arquivo /etc/rc.d/rc.local para que o firewall inicialize junto com a mquina. C) ELBORANDO UM QOS Para simplificar o processo de um QoS eu separei o sistema em um arquivo completo com as regras e scripts e outros arquivos com portas e IPs. I) arquivos:
48

/ETC/FIREWALL/QOS/QOS

Vamos primeiramente criar o diretrio e depois faremos as alteraes nos

mkdir /etc/firewall/qos cd /etc/firewall/qos/

O arquivo principal o /etc/firewall/qos/qos que ter um contedo desta maneira (atente que deve-se ter o MARK e o CONNMARK compilados junto com o Kernel, bem como o Layer7):
#!/bin/sh #-----# Script de QoS Cyber Nett #-----# Nataniel Klug # suporte@cnett.com.br #-----TC="/sbin/tc" IPT="/usr/sbin/iptables" DIR="/etc/firewall/qos" UP="eth0" DL="eth1" # upload # clientes

#----# Limpando iptables # Aplicando save as marcas (final de cada INTERFACE) #----$IPT -t mangle -F $IPT -t mangle -X $IPT -t mangle -A POSTROUTING -p tcp -j CONNMARK --restore-mark $IPT -t mangle -A POSTROUTING -p tcp -m mark ! --mark 0 -j ACCEPT # marcando pacotes # referente ao P2P P2PMARK="20" $IPT -t mangle -A POSTROUTING $IPT -t mangle -A POSTROUTING $IPT -t mangle -A POSTROUTING $IPT -t mangle -A POSTROUTING $IPT -t mangle -A POSTROUTING $IPT -t mangle -A POSTROUTING # referente ao MSN="22" $IPT -t mangle # referente ao SSH="23" $IPT -t mangle msn -A POSTROUTING -m layer7 --l7proto msnmessenger -j MARK --set-mark $MSN ssh -A POSTROUTING -m layer7 --l7proto ssh -j MARK --set-mark $SSH

-m -m -m -m -m -m

layer7 layer7 layer7 layer7 layer7 layer7

--l7proto --l7proto --l7proto --l7proto --l7proto --l7proto

ares -j MARK --set-mark $P2PMARK bittorrent -j MARK --set-mark $P2PMARK edonkey -j MARK --set-mark $P2PMARK fasttrack -j MARK --set-mark $P2PMARK gnutella -j MARK --set-mark $P2PMARK imesh -j MARK --set-mark $P2PMARK

$IPT -t mangle -A POSTROUTING -j CONNMARK --save-mark #-----# Apagando regras #-----$TC qdisc del dev $TC qdisc del dev $TC qdisc del dev $TC qdisc del dev antigas de QoS $DL $DL $UP $UP root ingress root ingress 2> 2> 2> 2> /dev/null /dev/null /dev/null /dev/null > > > > /dev/null /dev/null /dev/null /dev/null

#-----# CRIANDRO REGRAS DE DOWNLOAD #-----#=========# # $DL # #=========# $TC qdisc add dev $DL root handle 1: htb default 40 # criandro classes CLASS="/sbin/tc class add dev $DL parent" # classe de comunicacao com a rede interna $CLASS 1: classid 1:1 htb rate 100Mbit $CLASS 1:1 classid 1:5 htb rate 100Mbit ceil 100Mbit # classe de redes externas $CLASS 1: classid 1:2 htb rate 992Kbit 49

$CLASS $CLASS $CLASS $CLASS

1:2 1:2 1:2 1:2

classid classid classid classid

1:10 1:20 1:30 1:40

htb htb htb htb

rate rate rate rate

16Kbit ceil 512Kbit prio 0 512Kbit ceil 960Kbit prio 0 32Kbit ceil 512Kbit prio 1 176Kbit ceil 256Kbit

# criandro a fair queue QDISC="/sbin/tc qdisc add dev $DL parent" $QDISC 1:10 handle 10: sfq perturb 10 $QDISC 1:20 handle 20: sfq perturb 10 $QDISC 1:30 handle 30: sfq perturb 10 # criandro filtros FILTER="/sbin/tc filter add dev $DL parent 1:0 protocol ip" # regras para servidores e redes internas for i in `cat $DIR/network | awk '{print $2}'` do $FILTER prio 1 u32 match ip src $i flowid 1:5 done # regras para a classe 1:10 # trafego interativo # PROTOCOLOS $FILTER prio 1 u32 match ip protocol 1 0xff flowid 1:10 # IPS for i in `cat $DIR/prio0.ips | awk '{print $2}'` do $FILTER prio 0 u32 match ip src $i flowid 1:10 done # PORTAS for i in `cat $DIR/prio0.ports | awk '{print $2}'` do $FILTER prio 1 u32 match ip sport $i 0xffff flowid 1:10 done # MARCACAO DE PACOTES $IPT -t mangle -A POSTROUTING -o $DL -m mark --mark $MSN -j CLASSIFY --set-class 1:10 $IPT -t mangle -A POSTROUTING -o $DL -m mark --mark $SSH -j CLASSIFY --set-class 1:10 # regras para a classe 1:20 # trafego de disponibilidade # IPS for i in `cat $DIR/prio1.ips | awk '{print $2}'` do $FILTER prio 0 u32 match ip src $i flowid 1:20 done # PORTAS for i in `cat $DIR/prio1.ports | awk '{print $2}'` do $FILTER prio 1 u32 match ip sport $i 0xffff flowid 1:20 done # regras para a classe 1:30 # trafego de disponibilidade # PORTAS for i in `cat $DIR/prio2.ports | awk '{print $2}'` do $FILTER prio 1 u32 match ip sport $i 0xffff flowid 1:30 done #=========# # $UP # #=========# $TC qdisc add dev $UP root handle 1: htb default 40 # criandro classes CLASS="/sbin/tc class add dev $UP parent" # classe de comunicacao com a rede interna $CLASS 1: classid 1:1 htb rate 100Mbit $CLASS 1:1 classid 1:5 htb rate 100Mbit ceil 100Mbit # classe de redes externas $CLASS 1: classid 1:2 htb rate 992Kbit $CLASS 1:2 classid 1:10 htb rate 16Kbit ceil 512Kbit prio 0 $CLASS 1:2 classid 1:20 htb rate 512Kbit ceil 960Kbit prio 0 50

$CLASS 1:2 classid 1:30 htb rate 32Kbit ceil 512Kbit prio 1 $CLASS 1:2 classid 1:40 htb rate 176Kbit ceil 256Kbit # criandro a fair queue QDISC="/sbin/tc qdisc add dev $UP parent" $QDISC 1:10 handle 10: sfq perturb 10 $QDISC 1:20 handle 20: sfq perturb 10 $QDISC 1:30 handle 30: sfq perturb 10 # criandro filtros FILTER="/sbin/tc filter add dev $UP parent 1:0 protocol ip" # regras para servidores e redes internas for i in `cat $DIR/network | awk '{print $2}'` do $FILTER prio 1 u32 match ip dst $i flowid 1:5 done # regras para a classe 1:10 # trafego interativo # PROTOCOLOS $FILTER prio 1 u32 match ip protocol 1 0xff flowid 1:10 # IPS for i in `cat $DIR/prio0.ips | awk '{print $2}'` do $FILTER prio 0 u32 match ip dst $i flowid 1:10 done # PORTAS for i in `cat $DIR/prio0.ports | awk '{print $2}'` do $FILTER prio 1 u32 match ip dport $i 0xffff flowid 1:10 done # MARCACAO DE PACOTES $IPT -t mangle -A POSTROUTING -o $UP -m mark --mark $MSN -j CLASSIFY --set-class 1:10 $IPT -t mangle -A POSTROUTING -o $UP -m mark --mark $SSH -j CLASSIFY --set-class 1:10 # regras para a classe 1:20 # trafego de disponibilidade # IPS for i in `cat $DIR/prio1.ips | awk '{print $2}'` do $FILTER prio 0 u32 match ip dst $i flowid 1:20 done # PORTAS for i in `cat $DIR/prio1.ports | awk '{print $2}'` do $FILTER prio 1 u32 match ip dport $i 0xffff flowid 1:20 done # regras para a classe 1:30 # trafego de disponibilidade # PORTAS for i in `cat $DIR/prio2.ports | awk '{print $2}'` do $FILTER prio 1 u32 match ip dport $i 0xffff flowid 1:30 done

Vamos agora criar as permisses e depois criar os arquivos:


chmod +x /etc/firewall/qos/*

Os arquivos a serem criados so:


touch /etc/firewall/qos/network Sintaxe interna DESCRIOESPAOIP/REDE. touch /etc/firewall/qos/prio0.ips touch /etc/firewall/qos/prio1.ips Sintaxe interna DESCRIOESPAOIP/REDE. touch /etc/firewall/qos/prio0.ports touch /etc/firewall/qos/prio1.ports touch /etc/firewall/qos/prio2.ports Sintaxe interna DESCRIOESPAOPORTA.

Aps feito isso vamos colocar mais algumas permisses:


51

chmod -R go-rwx /etc/firewall/qos

52