:. Rapidinha com o Squid, Iptables, Sarg, SaMBa e Apache

 Por Tiago Cruz
 
 03/08/2004




:. Aviso importante

Olá gente! Tive um contato com alguns servidores e achei legal deixar anotado os passos que fiz para configurar uma máquina semi-morta compartilhando o acesso a internet junto com um firewall protegendo-a.

Já adianto para os chatos de plantão que este documento é feito por mim e para mim! Outra: Se quiser um manual avançado sobre tudo isso procure outro artigo/ tutorial na NET. No final do texto tem alguns links interessantes, pode ir direto para lá.

Meu objetivo aqui é somente reunir umas dicas que achei legal, sem escrever especificamente sobre determinado assunto.

:. Introdução

Bom, o que rola é que tive que compartilhar um adslmodem para 10 estações, controlar o acesso a NET e deixar a mesma protegida sem gastar U$ 600,00 que é o valor de um firewall/ router em hardware da blackbox (isso é somente um exemplo). Na verdade eu queria mesmo é me divertir com o que tinha em mãos =)

:. O "Hardware"

Como disse anteriormente, a "máquina" semi-morta estava encostada aqui, porque ela congela geral a cada 5 minutos no windows 98 ou no 95. Troquei tudo, menos a placa-mãe, uma famiguerada PC-Chips M812 LMR... com o KDE/Fluxbox não foi diferente, congelava direto e reto!

Depois de umas duas horas de tentativas (congelava direto), consegui instalar o Kurumin 1.4 no HD e arrancar o modo gráfico dela... hehehehe... agora parece que estabilizou, em modo texto. Deixei ele calculando o valor de 'pi' com 10000 casas decimais, o processador ficou ocupado por muuiito tempo e retornou o valor correto (quero dizer, deve estar correto) sem congelar, que é o que importa. Para quem ficou curioso:

$ echo "scale=10000; 4*a(1)" | bc -l

Bom, acompanhado à mobo zoada, tenho um Duron 950 MHz, um disco rígido de 1.9 GB e 128 MB de RAM DIM PC-100 MHz. Som e modem on-board desabilitado, rede SiS900 ok.

:. Configuração

Depois do parto para instalar, começa-se a configuração (a parte mais legal)! Como a máquina estava em um ambiente de teste, sob um proxy, coloquei as variáveis dela em /etc/environment... mas não funcionou (pow, da última vez tinha funcionado... :-/ ). Ok, sem stress, coloquei em /etc/profile e ficou tudo certo:

export ftp_proxy="http://192.168.0.1:80"
export http_proxy="http://192.168.0.1:80"

Agora sim, com apt "em mãos" eu pude detonar tudo:

# apt-get update
# apt-get remove xdm kdm kopete gaim [...]

Removi uma porrada de 'tranqueira' que não será usado em um servidor sério como este :) Depois dei um '# apt-get update' e deixei o bixo atualizadinho... mas o X parou de subir... até tentei uns kxconfig e mkxf86config mas depois desisti e acabei arrancando tudo que começava com kde ('dpkg -l kde*') e o pacote 'sudo' também (odeio ele, heheh).

Está ficando interessante! Estava tudo ok para iniciar os testes, mas faltava uma placa de rede! Depois de arrancar uma 3Com509B PCI de um micro aqui, espetar, rodar o hwsetup e descobrir que após o boot eu perco o módulo da placa, adicionar a mesma (o módulo chama-se 3c59x) em /etc/modules para que carregue durante o boot, pude continuar com os servidores em si.

Antes de mais nada, tirei a máquina de seu local de testes e levei-a junto de um teclado velho a seu lugar definitivo, em outro prédio.

:. Configurando o adslmodem e rede interna

Boiada. Pensei que era pior. Com o comando netcardconfig configurei a eth0 (sis900) como local (192.168.0.1 / 255.255.255.0) e a eth1 (3com) com os dados passados pelo 'tiuzinho' que instalou o speed: IP, gateway, DNS's... e pronto, a net já funcionou! Ainda bem que o IP é fixo, heheheh...

Só uma coisa que tive que fazer é retirar as variáveis de proxy do /etc/profile... senão o apt não iria funcionar mesmo :-/

:. Compartilhando a NET para os outros micros da rede

Essa parte é fácil, e já está bem manjada:

modprobe iptable_nat
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward

Nas estações, basta configurar um IP tipo 192.168.0.2 / 255.255.255.0, o gateway deve ser a maquina com linux (192.168.0.1) e o DNS o do seu provedor (o do Terra, por exemplo: 200.204.0.10)

Na verdade, andei testando, e parece que nem precisa do DNS... mas se der algum problema, basta coloca-lo...

Se quiser fazer sempre isso, em todos os boots, adicione essas linhas no seu /etc/init.d/bootmisc.sh (Debian/ Kurumin) ou em /etc/rc.d/rc.local (Mandrake / Red Hat)

Eu poderia ter parado por aqui... mas como disse, não teria graça... quero brincar com o squid e com o sarg, ainda! E mexer mais com o iptables também!

:. Squid: Controle de acesso a NET

Instalei o dito-cujo

apt-get install squid

Mas "deu um erro"... removi e instalei de novo... o erro continuava. Apaguei ele de /var/cache/apt/archives, removi com um dpkg --purge e instalei de novo... deu erro... arrrgghhhh!

Resolvi ler o erro que estava dando (quem nunca fez isso atire o primeiro mouse :) ah... ele ta falando que eu não defini um tal de 'visible_hostname'

# vi /etc/squid.conf
/visible_hostname [enter]

Achei o danado... tem uma descrição mas não mostra um exemplo de uso :-/

Tentei:

visible_hostname="kurumin.proxy"
visible_hostname=kurumin.proxy
visible_hostname "kurumin.proxy"
visible_hostname kurumin.proxy

Até achar um que não reclamasse mais nos logs... que por sinal era o último (maldita lei de murphy...)

Para testar o benedito, adicionei essas linhas na parte das ACL's:

acl rede_interna src 192.168.0.0
http_access allow rede_interna
http_access deny all

Inicia-se o cara:

/etc/init.d/squid start

E testa em uma estação, tomando o cuidado para configurar a mesma para usar a internet via proxy, no IP do servidor linux e a porta 3128 (padrão)

Funcionou? Legal, agora temos um cache de navegação, que deixa a coisa mais rápida e logs de acesso para controlar o povo... muito bom!

Mas se o engraçadinho tirar a opção de navegar com o proxy, ele navega sem ficar logado nada... isso não pode acontecer:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to 3128

Agora sim... ta ficando legal!

Dá para fazer mais uma porrada de coisas legais com o squid, mas de momento, só farei mais uns ajustes no arquivo de configuração dele, nada muito complexo ficando assim:

http_port 3128
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin ?
no_cache deny QUERY
cache_mem 64 MB
cache_access_log /var/log/squid/access.log

acl all src 192.168.0.0/255.255.255.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl SSL_ports port 443 563
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 563 # https, snews
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl Safe_ports port 901 # SWAT
acl purge method PURGE
acl CONNECT method CONNECT
acl rede_interna src 192.168.0.0

http_access allow rede_interna
http_access deny all

icp_access allow all
cache_mgr tiagocruz @ forumgdh . net
visible_hostname kurumin.proxy
logfile_rotate 10

Bom, note que eu mudei a minha 'acl all src' restringindo somente a minha rede interna. Dica de um colega e colaborador do LinuxRapido, o usuário Challado:

"E uma coisa importante de lembrar pra você, é mudar a configuração da variável all, que está na seguinte ACL:

acl all src 0.0.0.0

para:

acl all src {Endereço ip da sua rede interna}

Porque se não (principalmente se no servidor onde você rodará esse squid você tiver um IP válido você poderá estar criando mais um servidor para ajudar os spammers a espalhar o spam pela net."

Note também que estou dedicando 64 MB para o squid, já que tenho 128 MB e não vou usar modo gráfico...

Outra coisa que você deve estar estranhando é que meu arquivo está bem resumido, sem os comentários... hehehhe... a mágica está aqui (digite no diretório do mesmo):

# cp squid.conf squid.conf.back
# grep -v ^# squid.conf.back|grep -v ^$ > squid.conf

Agora que está tudo legal, vamos ver nos logs o que a galera está fazendo:

# tail -f /var/log/squid/

"Nossa que zona!" Você pensou? Eu também... vamos para a próxima parte deste artigo:

:. Sarg: Embelezando os logs de acesso

O Sarg é mais um software livre, mas feito por um brazuca! O Pedro Orso está de parabéns!!! Com o sarg, temos relatórios em html com estatísticas, coisa de primeira linha que eu não tenho nem nos proxys comerciais que uso, como o Winproxy.

apt-get install sarg
vi /etc/squid/sarg.conf

Nem precisa mudar muita coisa... é rapidim:

language Portuguese
title "Relatório de uso da internet"
date_format e

E "ja era" tá ótimo! Por padrão (pelo menos no debian) ele irá jogar o relatório em /var/www/squid-reports/.

Digitando sarg, ele irá processar tudo, bonitinho e você irá se espantar com o resultado, caso nunca tenha visto antes... simplesmente fantástico! Esse cara [também] merece uma skol... isso se você tiver um navegador gráfico para visualiza-lo, no meu caso tive que compartilhar a saída do mesmo via SaMBa para poder ver alguma coisa :-p

:. SaMBa: Compartilhando o relatório para as máquinas windows

Como já escrevi bastante sobre o samba, serei mais direto:

# apt-get install samba
# vi /etc/samba/smb.conf
[global]
        workgroup = INTERNET
        netbios name = GATEWAY
        server string = %h server (Samba %v)
        interfaces = eth0, 192.168.0.0/255.255.255.0
        security = SHARE
        obey pam restrictions = Yes
        passdb backend = smbpasswd, guest
        passwd program = /usr/bin/passwd %u
        passwd chat = *EntersnewsUNIXspassword:* %n

               *RetypesnewsUNIXspassword:* %n
.
        syslog = 0
        log file = /var/log/samba/log.%m
        max log size = 1000
        dns proxy = No
        panic action = /usr/share/samba/panic-action %d
        invalid users = root

[squid]
        comment = Relatorios do SQUID
        path = /var/www/squid-reports
        guest ok = Yes

# /etc/init.d/samba start

Bom, como o servidor está direito na Internet, em poucos minutos já apareceu nos logs um monte de prováveis máquinas windows infectadas procurando um compartilhamento 'c' no meu servidor... por isso, restringi o acesso somente à interface 'eth0' (local).

Agora... tenho que bolar um modo de mostrar esse relatório para meu chefe, que está em outro prédio, sem acesso a essa rede...

:. Apache: Servidor web quebrando um galhão

Foi fácil demais... :-p

# apt-get install apache
# vi /etc/apache/httpd.conf

Nem precisa mudar muita coisa... só uma alteraçãozinha para não mostrar a versão do mesmo, para dificultar um pouco o povo que gosta de invadir os servidores por ae: :-)

Se sua porta 80 estiver bloqueada (speed home) terá que usar outra...

Port 80
ServerSignature Off
ServerTokens Prod

Iniciando...

# /etc/init.d/apache start

Agora sim! De qualquer lugar, digitando http://ip.do.server eu chego nos tão esperados relatórios de acesso a internet! :) :) :)

Como um ótimo complemento, vou deixar aqui a dica de outro usuário do site, o Guilherme Straioto:

" Use o apache com autenticação de usuário, para apenas o pessoal da TI poder ver os relatórios como aqui na empresa... abaixo como fiz, senão você sabe vira festa:

No httpd.conf, edite as tag DocumentRoot e Directory :

DocumentRoot "/var/www/squid-reports/"

e logo abaixo:


AuthName "Area restrita, para Sarg"
AuthType Basic
AuthUserFile /etc/.htpasswd
require valid-user
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all


# AuthUserFile: é onde esta o arquivo de senha e usuário
# require valid-user: aqui pedirá a tela de autenticação qdo solicitado

Agora só criar os usuários com permissão ao acesso:

# htpasswd -c /etc/.htpasswd ti

Pronto! Apenas o usuario ti após autenticado pelo apache terá acesso aos relatórios"

:. Iptables: Aumentando a segurança

Bom, não sou nenhum especialista em firewall, mas seguindo uns exemplos do Morimoto (abração pra você, velho!) e que achei na NET cheguei a isso:

#! /bin/bash
# Firewall Simples / Compartilhamento
# Carlos Morimoto 05/2003
# Tiago Cruz - 02/2004

# Carrega os módulos
modprobe ip_tables
modprobe iptable_nat

#Limpa tudo
iptables -F
iptables -t nat -F

# Para rede local receber e-mail
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

# Para nao fugirem do proxy
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to 3128

# Encaminhamento de IP
echo 1 > /proc/sys/net/ipv4/ip_forward

# Abre algumas portas (ssh e http)
iptables -A INPUT -p tcp --destination-port 22 -j ACCEPT
iptables -A INPUT -p tcp --destination-port 80 -j ACCEPT

# Abre para a rede local
iptables -A INPUT -p tcp --syn -s 192.168.0.0/255.255.255.0 -j ACCEPT

# Proteções diversas contra portscanners, ping of death, ataques DoS, etc.
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -p tcp -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD --protocol tcp --tcp-flags ALL SYN,ACK -j DROP
iptables -A FORWARD -m unclean -j DROP

# Fecha o resto
iptables -A INPUT -p tcp --syn -j DROP

# Se você quiser que o PC também não responda a pings, adicione a linha:
# echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all

Basta colocar ele nos scripts de inicialização como dito anteriormente, se desejar isso.

:. Crontab: Automatizando o processo

Vamos agendar algumas coisas legais no crontab:

[email protected]:/home/tiago# crontab -l
00 12 * * 1-1 apt-get update && apt-get upgrade -y

00 17 * * 1-5 /usr/sbin/squid -k rotate > /dev/null
00 16 * * 1-5 /usr/bin/sarg

A primeira linha deixa seu servidor sempre atualizado, todas as segundas-feiras ao 12:00.

A segunda linha "roda" os logs do squid (definidos em 'logfile_rotate 10' lá em cima, o que significa que será criado logs de 0 a 9 para não acabar com seu espaço no HD e travar tudo :)

Veja essa dica do meu colega, usuário Jqueiroz sobre os logs:

"Defina quantos arquivos antigos manter: logfile_rotate n

Coloque no crontab o comando abaixo pra rodar o log 1 ou 2 vezes /dia. Aqui (300 máquinas), rodando 2x/dia o access.log fica +- 30MB.

/usr/bin/squid -k rotate > /dev/null

Nota: fazendo 2x/dia, escolha bem a hora em que faz, senão você fica com 1 enorme e outro quase vazio. Eu faço às 3h00 e às 15h00."

A última linha, atualiza seus logs do sarg, as 16:00 de segunda a sexta.

:. Agradecimentos

Bom gente, gostaria de deixar registrado aqui meus agradecimentos a todos que me ajudaram ou que dedicam seu tempo livre documentando e/ou ajudando outras pessoas ao redor do mundo apoiando o software livre.

Em especial, ao povo citado durante o documento que tiveram bastante paciência em me ajudar, diretamente ou indiretamente (respondendo a outros usuários, por exemplo), passando dicas, dando sugestões e etc.

Valeu mesmo!

:. Para saber mais

Para quem quiser saber mais sobre o assunto:

Configurando um Squid 'Ninja'

NAT apenas apenas para determinadas portas e bloqueando Softwares Messaging

Configurando o Iptables e Fazendo Regras Básicas

Conectiva: Perguntas e Respostas sobre o SQUID

Configurando o Firewall no Kurumin

Como compartilhar a conexão usando uma única placa de rede

Como criar um firewall simples e compartilhar a conexão usando o IPtables

Usando o Kurumin para compartilhar a conexão e outras coisas

Implemente e Configure o seu Linux com IPTABLES 1.3

Oráculo da internet (use-o também para chegar ao site oficial do servidor desejado)




Copyright 2003 Carlos E. Morimoto, http://www.guiadohardware.net - Todos os direitos reservados