ct

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

    Artigos

    Esse artigo traz algumas dicas e passos necessários para configurar uma máquina compartilhando o acesso a internet junto com um firewall protegendo-a.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:
    root@kurumin:/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)

    » Gostou do texto? Veja nossos livros impressos

    ... ou use a busca para localizar outros artigos relacionados:

cb
Livros de Carlos E. Morimoto HOME