em How Tos, Linux

Proxy transparante Squid + Iptables ( tutorial completo )

A junção do proxy Squid com o Iptables é algo realmente incrível para os Sysadmin que precisam uma solução poderosa e de baixo custo para controle de acesso a internet. Imagine a seguinte situação, você possui uma empresa que é dividida por departamentos e alguns departamentos precisam de acesso a internet com mais ou menos recursos que os outros. Exemplo sua área de produção precisa ter acesso simplesmente a documentos técnicos que é disponibilizado online e do outro lado você têm a diretoria que deve ter acesso full.

Para esta função teremos o proxy transparente que é o Iptables redirecionamento as solicitações da porta 80 para o Squid e o sistema de proxy fará o controle de acesso necessário.

Hardware necessário
Há aquela questão que todo sysadmin fala que Linux roda em qualquer hardware até mesmo em máquinas como o milenar Pentium 200 MMX. A verdade é que de fato customizado ele roda mas para funções de firewall com proxy transparente a cenário muda um pouco. Quanto mais regras você adicionar, e maior o tráfego de dados que passarão através das NICs isto implicará em maior poder de processamento e storage.

Sendo assim utilizaremos uma máquina não tão parruda mas que aguenta o tranco de 60 máquinas com acesso controlado e filtros específicos por departamento. Então o hardware que utilizaremos será:

PC Desktop c/ Processador Intel ATOM
2 GB RAM
HD 250 GB
02 NICs 10/100/1000 MBps

Sistema Operacional
O SO que iremos utilizar é o Ubuntu Server 12.0. Por que não mais o Debian ? Bom na verdade ainda temos rodando servidores e firewalls Debian mas o Ubuntu chegou em um grau de maturidade que podemos confiar. O Debian é uma distro fantástica que deu origem ao Ubuntu Knoppix entre outras distros mas focaremos no Ubuntu neste tutorial.

Instalando os pacotes necessários
Como estaremos utilizando o Ubuntu Linux poderemos centralizar a instalação dos pacotes no Apt-Get. Estarei levando em consideração que você tenha alguma experiência de shell para utilização dos comandos que falaremos a partir de agora OK ?

Pacotes necessários:
Squid3
Squid3-common
Sarg
Iptables

Abra o termina e entre com os comandos a seguir

apt-get install squid3 squid3-common

Entre no diretório /etc/squid3/

Vamos fazer um backup do arquivo de configuração do Squid

cp /etc/squid3/squid.conf /etc/squid3/squid.conf.default

Para a configuração do Squid utilizaremos como base o arquivo squid.conf que pode ser baixado com o comando abaixo

wget http://jaccon.com.br/downloads/squid/squid.conf.zip

Neste arquivo de configuração estaremos considerando que sua rede trabalha no range 192.168.0.0/24 e teremos algumas regras específicas para o departamento que estaremos chamando de produção

Descompacte o arquivo dentro da /etc/squid3/squid.conf

unzip squid.conf.zip

Edite o arquivo com o aplicativo de sua preferência em nosso caso estaremos utilizando o poderoso Vi:

vi /etc/squid3/squid.conf

Fizemos uma pequena alteração neste arquivo no qual mudaremos a porta padrão do Squid 3148 para 8888. Caso queira manter a porta padrão fica por seu critério. O Squid para funcionar corretamente precisa de poucas linhas. As customizações poderão ser adicionadas na sequência:

http_port 8888 transparent
visible_hostname firewall.bluesystems
error_directory /usr/local/blue.firewall/proxy/errors/
cache_mem 64 MB
maximum_object_size_in_memory 7192 KB
maximum_object_size 700 MB
minimum_object_size 10 KB
cache_dir ufs /var/spool/squid3 1024 16 256
refresh_pattern ^ftp: 10 20% 570
refresh_pattern ^gopher: 10 20% 570
refresh_pattern . 10 20% 570
cache_access_log /var/log/squid3/access.log
cache_mgr [email protected]
dns_nameservers 208.67.220.220
dns_nameservers 8.8.8.8
# acls
acl all src 0.0.0.0/0.0.0.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 21 80 443 563 70 210 280 488 59 777 901 1025-65535
acl purge method PURGE
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow all

Explicando as principais linhas do arquivo
http_port 8888 transparent
Porta TCP no qual o Squid irá rodar o daemon. A flag transparent diz que o Squid trabalhará em modo Proxy transparente.

acl all src 0.0.0.0/0.0.0.0
Estamos dizendo que todo o tráfego que passar pela interface local poderá ser cacheada pelo Squid.

Criando uma regra de controle de sites bloqueados por IP
Eu acho mais organizado criar uma pasta chamada acls dentro do diretório de configuração do Squid para deixar todos os arquivos de acls. Sendo assim caso queira seguir meu exemplo entre com o comando abaixo

mkdir -p /etc/squid3/acls

Vamos criar o arquivo /etc/squid3/acls/full_allow_ipaddress.acl onde adicionaremos os ips que poderão ter acesso full aos sites que passarão pelo squid. O arquivo é simples basta adicionar os IPs um abaixo do outro e você pode usar ainda o comando echo para apendar os ips sem a necessidade de abrir com seu editor padrão:

echo “192.168.0.1” >> /etc/squid3/acls/full_allow_ipaddress.acl
echo “192.168.0.2” >> /etc/squid3/acls/full_allow_ipaddress.acl
echo “192.168.0.3” >> /etc/squid3/acls/full_allow_ipaddress.acl

Agora adicionaremos uma ACL que levará os domínios dos sites que gostaríamos de bloquear. Para isto adicione em seu squid.conf as linhas abaixo:

# deny access
acl blockeddomain dstdomain “/etc/squid3/acls/blocked.domains.acl”
http_access deny blocked domain

No arquivo /etc/squid3/acls/blocked.domains.acl deve conter todos os domínios dos sites que gostaría de bloquear para os usuários. Só os usuário da acl full_allow_ipaddress não passarão por esta regra.

echo “.facebook.com” >> /etc/squid3/acls/blocked.domains.acl
echo “orkut.com” >> /etc/squid3/acls/blocked.domains.acl
echo “twitter.com” >> /etc/squid3/acls/blocked.domains.acl

Bloqueando o download de arquivos através do mimetype
Uma prática simples que pode ser adicionada é o controle de downloads de arquivos como .exe , .com, .bat etc..

Para isto adicone as seguintes linhas de comando no seu squid.conf

# filter files
acl blockfiles urlpath_regex “/etc/squid3/blocked.files.acl”
# Deny all blocked extension
#deny_info ERR_BLOCKED_FILES blockfiles
http_access deny blockfiles

Dentro do arquivo utilize expressões regulares para especificar os mimetypes dos arquivos como no exemplo abaixo:

\.[Aa][Vv][Ii]$
\.[Mm][Pp][Gg]$
\.[Mm][Pp][Ee][Gg]$
\.[Mm][Pp]3$
\.[Pp][Ii][Ff]$
\.[Bb][Aa][Tt]$
\.[Ee][Xx][Ee]$
\.[Mm][Ss][Tt]$
\.[Tt][Oo][Rr][Rr][Ee][Nn][Tt]$
\.[Rr][Aa][Rr]$

Traduzindo: MPG, MPEG, MP3, PIF, BAT, EXE, MST, TORRENT, RAR

Criando regras de controle por departamento
Digamos que o departamento de produção terá acesso apena a um determinado site e todos os demais serão bloqueados. Para isto adicione a acl abaixo em seu arquivo squid.conf

# CTM ACLS
acl acl_ctm_ips src “/etc/squid3/acls/producao_ips.acl”
acl acl_ctm_allow_urls url_regex “/etc/squid3/acls/producao_allow_urls.acl”
http_access deny acl_ctm_ips !acl_ctm_allow_urls

Dentro do arquivo producao_ips.acl vamos adicionar os endereços IP das máquinas que fazem parte da produção. Siga o exemplo do ítem anterior. No arquivo producao_allow_urls.acl você deve adicionar os domínios dos sites que os usuáios da produção poderão ter acesso.

Proxy transparente
Agora que temos parte de nossas regras no Squid podemos fazer o Prerouting da porta 80 para 8888 pelo Iptables. Entre com os seguintes comandos abaixo.

iptables -A PREROUTING -t nat -i eth1 -p tcp –dport 80 -j REDIRECT –to-port 8888
iptables -A INPUT -p tcp –dport 8888 -i eth0 -j DROP
iptables -A FORWARD -p tcp –dport 8888 -i eth0 -j DROP

A primeira linha diz para que todo o tráfego da porta 80 seja enviada para 8888 ( Squid ). Na segunda linha estamos informando que todo o tráfego que for destinada a interface eth0 ( internet ) na porta 8888 seja dropada. A terceira linha é um complemento que diz que todo o tráfego que entrar ou sair da interface eth0 que destinada a porta 8888 seja dropada.

Agora que temos todas as regras adicionadas execute

service squid3 stop
service squid3 start

Para testar se está funcionando entre com o comando

tail -f /var/log/squid3/access.log

Utilize a internet normalmente e veja as saídas dos acessos pelo arquivo de log. Esperamos que tenham gostado.

Para dúvida entre em contato conosco através do e-mail jaccon at gmail.com