Debian Etch Roteador Básico + DHCPD + Squid Proxy Transparente

Índice de conteúdo

Instalando um Roteador Básico com Debian Etch + DHCPD + Proxy Transparente com Squid. (imcompleto ainda…)

Introdução

Você já precisou de uma máquina para ser um firewall bem simples, somente como servidor DHCP e um proxy,
para gerenciar sua rede e facilitar sua vida??? Já?? E não fez por que??
Bem, se você já pensou e não fez, vou mostrar como fazer!
Abaixo, vou descrever como instalar um servidor que será seu roteador de borda, o cara que vai receber seu link
para o mundo externo e gerenciar sua rede. Para isso, teremos a ajuda de um servidor DHCP que, além de dar endereços IPs dinâmicos, também irá passar IPs fixos.
Detalhes sobre DHCP na Wikipédia.
Também usaremos um servidor proxy, que ajudará o administrador a ter um melhor rendimento de sua rede,
já que o proxy guardará uma cópia em seu cache das páginas mais acessadas.
Além disso, com o servidor proxy o administrador poderá criar ACLs para controlar quais sites os usuários de sua rede podem acessar.

Ingredientes da receita

  • 1 – Máquina com Sistema Operacional GNU/Linux Debian Etch instalado;
  • 2 – Placas de rede;
  • 1 – Servidor DHCP;
  • 1 – Servidor Proxy;

Para prepararmos o bolo usaremos o GNU/Linux Debian Etch (meu sistema operacional preferido!), que nos fornece
todos os recursos necessários.
Não irei abordar nesse texto a instalação do sistema operacional, vou partir do ponto onde você já tem um
Debian Etch instalado e funcionando.
Essa maquina também deverá ter 2 placas de Rede, eth0 e eth1.
A placa eth0 será sua rede interna e eth1 a externa.

A rede interna será configurada da seguint forma:

~# grep eth0 -A5 /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.0.1
network 192.168.0.0
netmask 255.255.255.0

Como essa interface somente serve para gerenciar da rede interna, ela não possui gateway, ela é o gateway 🙂
A interface externa já deverá ter sua configuração feita e funcionando antes de voce prosseguir.

Bem, vamos ao que interessa!!!

Instalação e configuração do DHCP Server

Em seu shell favorito vamos instalar o DHCPD:

~# apt-get update;apt-get install dhcp3-server

Será emitido um aviso sobre a autoridade do servidor em sua rede, de OK e vamos continuar.

Após a instalação, digite em seu shell:

~# dpkg-reconfigure dhcp3-server

Será solicitado qual a placa de rede onde o servidor DHCP ficará “escutando” por requisições,
coloque então sua placa de rede INTERNA, eth0 e na tela seguinte, (autoridade de novo) de OK.

Abra o arquivo /etc/dhcp3/dhcpd.conf com seu editor de textos favorito e criar uma configuração
de DHCP padrão:

~# vim /etc/dhcp3/dhcpd.conf

O arquivo deverá ficar mais ou menos assim:

#
# Sample configuration file for ISC dhcpd for Debian
#
# $Id: dhcpd.conf,v 1.1.1.1 2002/05/21 00:07:44 peloy Exp $
#

# The ddns-updates-style parameter controls whether or not the server will
# attempt to do a DNS update when a lease is confirmed. We default to the
# behavior of the version 2 packages ('none', since DHCP v2 didn't
# have support for DDNS.)
ddns-update-style none;

# option definitions common to all supported networks...
#option domain-name "example.org";
option domain-name-servers 192.168.0.1;

#default-lease-time 3600;
#max-lease-time 7200;

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;

# Use this to send dhcp log messages to a different log file (you also
# have to hack syslog.conf to complete the redirection).
log-facility local7;

# No service will be given on this subnet, but declaring it helps the
# DHCP server to understand the network topology.

#subnet 10.152.187.0 netmask 255.255.255.0 {
#}

# This is a very basic subnet declaration.

#subnet 10.254.239.0 netmask 255.255.255.224 {
#  range 10.254.239.10 10.254.239.20;
#  option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org;
#}

# This declaration allows BOOTP clients to get dynamic addresses,
# which we don't really recommend.

#subnet 10.254.239.32 netmask 255.255.255.224 {
#  range dynamic-bootp 10.254.239.40 10.254.239.60;
#  option broadcast-address 10.254.239.31;
#  option routers rtr-239-32-1.example.org;
#}

# A slightly different configuration for an internal subnet.
#subnet 10.5.5.0 netmask 255.255.255.224 {
#  range 10.5.5.26 10.5.5.30;
#  option domain-name-servers ns1.internal.example.org;
#  option domain-name "internal.example.org";
#  option routers 10.5.5.1;
#  option broadcast-address 10.5.5.31;
#  default-lease-time 600;
#  max-lease-time 7200;
#}

# Hosts which require special configuration options can be listed in
# host statements.   If no address is specified, the address will be
# allocated dynamically (if possible), but the host-specific information
# will still come from the host declaration.

#host passacaglia {
#  hardware ethernet 0:0:c0:5d:bd:95;
#  filename "vmunix.passacaglia";
#  server-name "toccata.fugue.com";
#}

# Fixed IP addresses can also be specified for hosts.   These addresses
# should not also be listed as being available for dynamic assignment.
# Hosts for which fixed IP addresses have been specified can boot using
# BOOTP or DHCP.   Hosts for which no fixed address is specified can only
# be booted with DHCP, unless there is an address range on the subnet
# to which a BOOTP client is connected which has the dynamic-bootp flag
# set.
#host fantasia {
#  hardware ethernet 08:00:07:26:c0:a5;
#  fixed-address fantasia.fugue.com;
#}

# You can declare a class of clients and then do address allocation
# based on that.   The example below shows a case where all clients
# in a certain class get addresses on the 10.17.224/24 subnet, and all
# other clients get addresses on the 10.0.29/24 subnet.

#class "foo" {
#  match if substring (option vendor-class-identifier, 0, 4) = "SUNW";
#}

#shared-network 224-29 {
#  subnet 10.17.224.0 netmask 255.255.255.0 {
#    option routers rtr-224.example.org;
#  }
#  subnet 10.0.29.0 netmask 255.255.255.0 {
#    option routers rtr-29.example.org;
#  }
#  pool {
#    allow members of "foo";
#    range 10.17.224.10 10.17.224.250;
#  }
#  pool {
#    deny members of "foo";
#    range 10.0.29.10 10.0.29.230;
#  }
#}

subnet 192.168.0.0 netmask 255.255.255.0 {
  range 192.168.0.10 192.168.0.20;
  option domain-name-servers 192.168.0.1;
  option routers 192.168.0.1;
  default-lease-time 3600;
  max-lease-time 7200;
}

O que interessa, são as linhas que não estão comentadas (óbvio!!!), que vou explicar agora o que fazem:

~# ddns-update-style none;

Desativa o suporte a DNS dinâmico.

~# option domain-name-servers 192.168.0.1;

Informa que o IP do servidor DNS padrão. Caso voce tenha mais de uma sub-rede configurada no DHCP, esse servidor
será o padrão, mas, voce poderá configurar outro ou o mesmo, dentro da definição da sub-rede.

~# authoritative;

Informa que esse é o servidor DHCP com autoridade sobre a rede.
Sempre mantenho 1 servidor DHCP na rede, mas, caso voce tenha mais de 1 é bom saber qual é o principal.

~# log-facility local7;

Informa a configuração do Syslog.

subnet 192.168.0.0 netmask 255.255.255.0 {
  range 192.168.0.10 192.168.0.20;
  option domain-name-servers 192.168.0.1;
  option routers 192.168.0.1;
  default-lease-time 3600;
  max-lease-time 7200;
}

Essa é a parte que realmente interessa, o bloco que define a configuração de uma subrede para o DHCP.
Vamos analizar essa linha

  • subnet 192.168.0.0 netmask 255.255.255.0 {

Define a subrede 192.168.0.0 (network) com a mascara 255.255.255.0, que é rede que usei no meu caso.

  • range 192.168.0.10 192.168.0.20;

Esse é o range de IPs que o servidor DHCP derá para as maquinas da rede, nesse caso do IP 10 ao 20.
Você pode ter mais de um range dentro da mesma rede, por exemplo:

range 192.168.0.10 192.168.0.20;
range 192.168.0.30 192.168.0.40;
  • option domain-name-servers 192.168.0.1;

Servidor DNS que será passado no DHCP para os clientes. Caso você não informe essa linha, será usado o servidor
que definimos no início do arquivo.

  • option routers 192.168.0.1;

Endereço do gateway que será passado para os clientes DHCP.

  • default-lease-time 3600;
  • max-lease-time 7200;

Definições sobre o tempo em segundos que a informação do DHCP será válida e o tempo máximo dessa informação.
Após esse tempo, o cliente DHCP irá fazer uma nova requisição ao servidor para receber novas informações.

Ok, temos o servidor DHCP instalado e configurado. Vamos reiniciar o serviço:

~# /etc/init.d/dhcp3-server restart

Caso não ocorram erros, estamos com o DHCP completo. Se tiver erros, veja-os no syslog em /var/log/syslog

Instalação e configuração do proxy Squid

Ok, também não vou falar muito do programa em si, mas sim do conceito.
Usaremos o squid como um cache proxy transparente, deixando a rede mais segura e rápida.

Primeiramente, vamos instalar o squid em nosso Debian Etch.
Usaremos a versão 2.6 do squid, pois ainda não testei o 3… sorry

~# apt-get update;apt-get install squid

Após a instalação caso ocorra um erro na configuração ou hajam perguntas de ok e ignore-as, pois vamos configurar na mão.

Como o arquivo de configuração do squid é bem grande, não vou coloca-lo aqui, somente vamos aos pontos que interessam.
Abra o arquivo /etc/squid/squid.conf:

~# vim /etc/squid/squid.conf

Procure pela linha que inicia com http_port 3128 e vamos altera-la da seguinte forma:

http_port 192.168.0.1:3128 transparent

Essa linha define o proxy rodando sobre o IP 192.168.0.1 que é o IP da sua placa eth0,
na porta 3128 que é o padrão do proxy, e como um proxy transparente.

Em seguida, procure pela linha # cache_mem 8 MB.
Essa linha define qual o tamanho de memoria o squid usará para cachear os objetos na memória.
Altere-a da seguinte forma:

cache_mem 32 MB

32Mb é um bom valor, mas, se voce não tiver essa memória livre no sistema, use menos, 16Mb também é legal.

Vamos agora para a linha # maximum_object_size 4096 KB, que serve para definir qual o tamanho máximo dos arquivos
que o squid irá armazenar no disco. Arquivos maiores não serão cacheados.

maximum_object_size 20480 KB

Se voce tiver HD sobrando, aumente esse espaço, eu estou colocando 20Mb, mas 100Mb também é um valor bom.

Agora, vamos para uma linha muito importante, procure por # cache_dir ufs /var/spool/squid 100 16 256

cache_dir ufs /var/spool/squid 2000 16 256

Essa linha quer dizer o seguinte:

  • ufs: Sistema de arquivos que o squid usará para fazer seu cache, UFS é o padrão, mantenha ele.
  • /var/spool/squid: Diretório onde o squid irá manter seu cache, muito importante ter espaço nessa partição.
  • 2000: O padrão vem com 100, que é a definição em Mb de qual será o espaço do cache do squid. Se voce terá essa maquina

somente para isso, pode usar por exemplo 20000, que seriam 20 Gb de cache.

  • 16 256: Esses números definem a quantidade de diretórios e sub-diretórios que o squid usará para armazenar o cache, mantenha o padrão.

Essas são as configurações padrão do squid, mas, ainda temos que liberar acesso a nossa rede, procure a linha:

http_access allow localhost

Ela fica um pouco abaixo do comentário:

# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS

Abaixo dessa linha, acrescente as seguintes linhas:

acl rede_interna src 192.168.0.0/24
http_access allow rede_interna

Com isso, estamos criando uma uma acl rede_interna e liberando acesso a toda
rede 192.168.0.0 para acessar a internet livremente.

Para terminar, procure pela seguinte linha:

TAG: visible_hostname

Caso sua maquina possua um hostname válido, voce não terá problemas, mas, caso seu hostname não esteja
bem configurado, altere essa linha deixando o nome que voce define para essa maquina na rede.
Como está linha está dentro de um bloco de explicação do que ela faz, coloque logo após o bloco o valor.
O meu ficou como “meu_proxy”, então:

visible_hostname meu_proxy


Por enquanto acabamos com as configurações, então, vamos reiniciar o squid:

~# /etc/init.d/squid restart

Após reiniciarmos o squid, caso não ocorra nenhum erro, temos um proxy funcionando.
Mas, ele ainda não está sendo usado pela rede, pois, somente o trafego que passar pela
porta 3128, será “proxyada”. Então, precisamos fazer com que o trafego de porta 80 (HTTP),
passe pelo proxy. NEXT!!!

Fazendo o proxy transparente

Para que um proxy funcione, é necessário que sejam adicionadas configurações no navegador do
usuário, normalmente nas configurações de rede, onde voce especifica o endereço IP do servidor
proxy, a porta do proxy (3128) e para quais protocolos ele será usado (FTP, HTTP, SSL, GOPHER,etc..).

Essa é uma forma de se usar, mas, requer uma configuração manual por parte do administrador da rede,
em cada uma das maquinas da rede.. Muitas vezes, uma maquina é usada por mais de um usuário, onde cada um
possui configurações próprias para seu perfil, fazendo com que o administrador, tenha que configurar também
o proxy, no navegador de cada um dos perfis da máquina.

Em um proxy transparente, quando um acesso é requisitado para sair pela porta 80, o servidor roteador/firewall,
redireciona a requisição para a porta 3128, passando o trafego pelo proxy que devolverá para o cliente de forma
transparente 🙂

Para que ele funcione, são necessárias algumas configurações feitas no iptables, o firewall do kernel 2.4/2.6 do Linux.
Essas configurações servem para fazer com que a rede interna da maquina, ao sair pela porta 80, redirecione o trafego
para a porta 3128, e na volta, os pacotes da porta 3128 voltem para porta 80.

Como as configurações do iptables são perdidas a cada reinicialização da maquina, criaremos um script que será executado
na inicialização do sistema.
Para não deixar espalhado um programa pela maquina, vamos criar um diretório onde esse script ficará:

~# mkdir /etc/firewall

Agora sim, vamos ao script:

~# vim /etc/firewall/firewall

O script ficará assim:

#!/bin/bash

# Inicio do Firewall

# Limpa as tabelas do firewall
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X

# Carrega modulos do iptables
modprobe ip_nat_ftp
modprobe ip_conntrack_ftp
modprobe ip_conntrack_pptp
modprobe ip_nat_pptp

# Libera a rede com nat, fazendo kernel compartilhar a conexão
echo "1" > /proc/sys/net/ipv4/ip_forward

# Libera a passagem de pacotes para a faixa de IPs internos
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT

# Libera o NAT para os IPs internos, nas 2 placas de rede
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

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

De permissão de execução para o script:

~# chmod +x /etc/firewall/firewall

Adicione o firewall na inicialização do sistema:

~# ln -s /etc/firewall/firewall /etc/init.d/
~# update-rc.d firewall defaults

Execute o script:

~# /etc/firewall/firewall

Pronto, agora voce tem a divisão da rede e o proxy transparente.

….. continua

Comentários

Esta publicação atualmente tem 11respostas

  • Olá Adenilson!!

    Obrigado pelo comentário.
    Bem, se o proxy não está transparente, é porque você não deve ter redirecionado através do iptables (Firewall) o trafego com destino a porta 80 para a porta 3128, assim:

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

    Execute essa linha e veja se o trafego é desviado para o Squid automaticamente.

    [] s

    Tiago

  • ola otimo poste.

    mas no meu nao funciono como trasnparente nao. ele só funciona se eu for no navegador e direcionar o ip e a porta do servidor.
    eu nao configurei o servidor dns é por causa disso?

  • Daniel, vlw aee!!! 🙂

    Qualquer coisa pode mandar sim!

    Preciso é tomar vergonha na cara, e ter tempo…, para colocar mais coisas aqui..

    []’s

  • Kara! Mto boa sua postagem! Me ajudou pa caramba!! Continue assim! Espero poder contar com sua ajuda, caso precise novamente! Vlw!!

  • Pedro, muito obrigado!!

    Bem, quanto ao script do iptables, não existe, pelo menos não no Debian.
    Já vi até em algumas documentações do Debian falando que existe, mas em todas as minhas maquinas (umas 20+-), não vejo.

    E não, o nome não é standard!!

    []’s

  • Olá Tiago,

    Parabéns. Está muito prático e explicito.

    Diz-me só uma coisa, não existe já um script de conf do iptables? (em /etc/init.d)
    Onde se possa fazer as configs que sugeres?

    Ou já é o nome standard: /etc/init.d/firewall

    É só para evitar que dps no futuro qd se esteja a fazer outras confs ao iptables (lendo outro tutorial por exemplo), não vamos criar outro arquivo (ex: /etc/init.d/iptables) e dps ganha o último a ser executado 😛
    /etc/rc3.d/S20iptables
    /etc/rc3.d/S40firewall
    (ganhava o firewall 🙂 )

    Obrigado pela tua dedicação.
    Continua o bom trabalho 😉

    Cumps,
    Pedro

  • Tia-go.net, parabéns e obrigado. Simples, direto, objetivo.

  • Olá Samid!

    Antes de mais nada, obrigado!
    Sim, acho que agora que o site tem comentários, e você inaugurou eles, tenho um incentivo para continuar 🙂

    Logo mais, irei concluir, até porque, já está quase lá!

    []’s

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Barra lateral