Skip to main content

208.3 Implementando um Servidor Proxy (Squid)


Introdução


Um servidor proxy (ou "proxy server"), é um servidor que atua como intermediário entre os dispositivos de um ou mais clientes e um servidor(es) de destino na Internet. Quando um cliente faz uma solicitação a um servidor, essa solicitação vai passar pelo proxy e ele vai processar a solicitação, então o próprio servidor proxy vai até o servidor de destino e faz a consulta, quando ele tiver a resposta, ele retorna ela para o cliente que originou a solicitação.


Os proxy servers podem ter várias finalidades, como:
  • Melhorar o desempenho da rede, armazenando em cache conteúdo comum para reduzir a quantidade de tráfego de rede;

  • Controlar o acesso à Internet em um ambiente empresarial, bloqueando o acesso a determinados sites ou limitando a largura de banda usada por determinados tipos de tráfego;

  • Melhorar a segurança da rede, filtrando o tráfego e protegendo contra ataques de hackers;

  • Permitir que usuários de diferentes regiões acessem conteúdo restrito geograficamente.

Existem vários tipos de proxy servers, incluindo proxy HTTP, proxy SOCKS, proxy reverso, proxy transparente e proxy anônimo, cada um com suas próprias características e usos específicos.


Para este tópico vamos usar o Squid. O Squid é um servidor proxy de código aberto muito popular que foi desenvolvido originalmente para sistemas operacionais Unix, mas agora é executado em várias plataformas, incluindo Windows.


Seu principal foco é melhorar o desempenho da rede, controlar o acesso à Internet e melhorar a segurança da rede como um todo.

Algumas das principais características do Squid incluem:

  • Cache de conteúdo web

    O Squid pode armazenar em cache conteúdo web comum para reduzir a quantidade de tráfego de rede e melhorar o desempenho.

  • Controle de acesso

    O Squid pode ser configurado para permitir ou negar o acesso a determinados sites ou tipos de tráfego de rede.

  • Autenticação de usuários

    O Squid pode ser integrado com vários sistemas de autenticação, como Active Directory, LDAP e RADIUS, para controlar o acesso baseado em usuários autenticados.

  • Filtragem de conteúdo

    O Squid pode ser configurado para filtrar conteúdo web, como malware, spam e conteúdo inadequado.

  • Balanceamento de carga

    O Squid pode ser usado para distribuir o tráfego da web em vários servidores para melhorar o desempenho.

O Squid também atua como Proxy transparente evitando que usuários "espertinhos" possam burlar o controle de acesso.



Instalação e Configuração do Squid


Vamos começar instalando o Squid:

$ sudo apt install squid -y

# Vamos renomear o arquivo de configuração para criarmos um do zero:
$ sudo mv /etc/squid/squid.conf /etc/squid/squid.conf.orig

# Crie um arquivo novo:
$ sudo vim /etc/squid/squid.conf




###### Adicione a configuração abaixo dentro do arquivo recém criado ######

# Define em qual porta o Squid vai atuar (mantive a padrão):
http_port 3128

# Define o nome do servidor
visible_hostname proxyserver

# Esta linha cria uma ACL, uma política de acesso com nome "todosrc" contendo qualquer IP (all = todos os IPs).
acl todosrc src all

# Aqui criamos uma ACL de nome "localhost" contendo localhost:
acl localhost src 127.0.0.1/255.255.255.255

# Aqui criamos uma ACL de nome 'manager' que permite que as solicitações de
# gerenciamento do Squid sejam aceitas apenas de fontes que são identificadas
# como "cache_object" no protocolo.
acl manager proto cache_object

# Cria a ACL contendo as portas que são utilizadas no protocolo HTTPS.
acl SSL_ports port 443 563

# Cria a ACL contendo as portas de diversos protocolos conhecidos na Internet.
acl Safe_ports port 21 80 443 563 70 210 280 488 59 777 901 1025-65535

# Aqui criamos uma ACL de nome 'purge' que permite que as solicitações
# do método HTTP PURGE sejam aceitas.
acl purge method PURGE

# Aqui criamos uma ACL de nome 'CONNECT' que permite solicitações CONNECT
# do método HTTP.
acl CONNECT method CONNECT

# Libera a ACL manager e localhost:
http_access allow manager localhost

# Bloqueia a ACL manager:
http_access deny manager

# Libera a ACL purge e localhost:
http_access allow purge localhost

# Bloqueia a ACL purge:
http_access deny purge

# Esta linha se torna bastante interessante pelo uso da "!",
# pois ela bloqueia qualquer conexão que não contenha o conteúdo da ACL Safe_Ports:
http_access deny !Safe_ports

# Bloqueia qualquer conexão que não esteja no conteúdo da ACL SSL_ports:
http_access deny CONNECT !SSL_ports

# Cria a ACL redelocal contendo a faixa de endereço da rede:
acl redelocal src 192.168.121.0/24

# Libera a ACL localhost:
http_access allow localhost

# Libera a ACL redelocal:
http_access allow redelocal

# Bloqueia a ACL all:
http_access deny todosrc

Agora reinicie o serviço do Squid:

$ sudo systemctl restart squid

# ou:
$ sudo squid -k reconfigure


Cache


O proxy de cache é um tipo de servidor proxy que armazena em cache as páginas da web e outros recursos da Internet para acelerar o acesso a esses recursos e reduzir a carga no servidor de origem.


Quando um usuário solicita um recurso da web, o proxy de cache verifica se ele já tem uma cópia desse recurso em cache. Se ele tiver, o recurso é entregue imediatamente ao usuário a partir do cache, em vez de ter que ser buscado novamente no servidor de origem. Isso pode levar a uma redução significativa no tempo de carregamento da página e na largura de banda usada.


Além disso, o proxy de cache também pode ajudar a melhorar a segurança, pois pode atuar como um firewall e filtrar o tráfego da Internet para bloquear conteúdo malicioso. Ele também pode ser configurado para restringir o acesso a determinados recursos da web, fornecendo um controle mais granular sobre o acesso à Internet em uma rede corporativa.


Vamos habilitar essa opção no nosso Servidor Proxy:

# Edite o arquivo de configuração:
$ sudo vim /etc/squid/squid.conf

# Adicione a opção abaixo:
cache_dir ufs /var/spool/squid 100 16 256

## cache_dir = Comando usado para definir um diretório de cache para o Squid;
## ufs = Tipo de sistema de arquivos para o armazenamento do cache (UFS UFS significa Unix File System);
## /var/spool/squid = Diretório que vamos salvar os dados sobre cache;
## 100 = Quantidade máxima em MB (Mega Byte) que será armazenado;
## 16 = É o número máximo de subdiretórios que serão criados no diretório de cache;
## 256 = É o número máximo de objetos que podem ser armazenados em cada subdiretório;

Agora reinicie o serviço do Squid:

$ sudo systemctl restart squid

# ou:
$ sudo squid -k reconfigure

Caso você tenha usado o segundo comando para reler as configurações, execute sudo squid -z para recriar a estrutura de diretórios do Cache.


Veja como ficou a estrutura de diretório:

$ ls /var/spool/squid
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F swap.state

$ ls /var/spool/squid/00
00 0A 14 1E 28 32 3C 46 50 5A 64 6E 78 82 8C 96 A0 AA B4 BE C8 D2 DC E6 F0 FA
01 0B 15 1F 29 33 3D 47 51 5B 65 6F 79 83 8D 97 A1 AB B5 BF C9 D3 DD E7 F1 FB
02 0C 16 20 2A 34 3E 48 52 5C 66 70 7A 84 8E 98 A2 AC B6 C0 CA D4 DE E8 F2 FC
03 0D 17 21 2B 35 3F 49 53 5D 67 71 7B 85 8F 99 A3 AD B7 C1 CB D5 DF E9 F3 FD
04 0E 18 22 2C 36 40 4A 54 5E 68 72 7C 86 90 9A A4 AE B8 C2 CC D6 E0 EA F4 FE
05 0F 19 23 2D 37 41 4B 55 5F 69 73 7D 87 91 9B A5 AF B9 C3 CD D7 E1 EB F5 FF
06 10 1A 24 2E 38 42 4C 56 60 6A 74 7E 88 92 9C A6 B0 BA C4 CE D8 E2 EC F6
07 11 1B 25 2F 39 43 4D 57 61 6B 75 7F 89 93 9D A7 B1 BB C5 CF D9 E3 ED F7
08 12 1C 26 30 3A 44 4E 58 62 6C 76 80 8A 94 9E A8 B2 BC C6 D0 DA E4 EE F8
09 13 1D 27 31 3B 45 4F 59 63 6D 77 81 8B 95 9F A9 B3 BD C7 D1 DB E5 EF F9

Temos no total 16 diretórios seguindo um formato Hexadecimal.
Dentro de cada um dos 16 diretórios temos 256 subdiretórios, que é onde os dados sobre o Cache vão ser armazenados.


O formato hexadecimal usado possui uma ordem:

O primeiro dígito começa com 0 e vai até F;
O segundo começa com 0 e vai até F;

Veja um exemplo:

Primeira parte:
00 10 20 30 40
01 11 21 31 41
02 12 22 32 42
03 13 23 33 43
04 14 24 34 44
05 15 25 35 45
06 16 26 36 46
07 17 27 37 47
08 18 28 38 48
09 19 29 39 49
0A 1A 2A 3A 4A
0B 1B 2B 3B 4B
0C 1C 2C 3C 4C
0D 1D 2D 3D 4D
0E 1E 2E 3E 4E
0F 1F 2F 3F 4F


Segunda parte:

50 60 70 80 90
51 61 71 81 91
52 62 72 82 92
53 63 73 83 93
54 64 74 84 94
55 65 75 85 95
56 66 76 86 96
57 67 77 87 97
58 68 78 88 98
59 69 79 89 99
5A 6A 7A 8A 9A
5B 6B 7B 8B 9B
5C 6C 7C 8C 9C
5D 6D 7D 8D 9D
5E 6E 7E 8E 9E
5F 6F 7F 8F 9F


Terceira parte:

A0 B0 C0 D0 E0 F0
A1 B1 C1 D1 E1 F1
A2 B2 C2 D2 E2 F2
A3 B3 C3 D3 E3 F3
A4 B4 C4 D4 E4 F4
A5 B5 C5 D5 E5 F5
A6 B6 C6 D6 E6 F6
A7 B7 C7 D7 E7 F7
A8 B8 C8 D8 E8 F8
A9 B9 C9 D9 E9 F9
AA BA CA DA EA FA
AB BB CB DB EB FB
AC BC CC DC EC FC
AD BD CD DD ED FD
AE BE CE DE EE FE
AF BF CF DF EF FF


ACL - Access Control List


Uma ACL (Access Control List), é um recurso que permite controlar e restringir o acesso de usuários/grupos, no caso do Squid restringi o acesso à Internet com base em determinados critérios.


As ACLs são usadas para definir regras que o Squid deve seguir ao decidir permitir ou negar o acesso a um determinado recurso ou site. Elas podem ser baseadas em endereços IP, nomes de domínio, palavras-chave em URLs, horários de acesso e outras características.


Existem alguns tipos de ACLs no Squid:

# Tratar origem:
src IP/REDE

# Tratar destino:
dst IP/REDE

# Trata domínio de origem (O . no começo do domínio é qualquer coisa antes dele):
srcdomain .google.com .debian.org www.debian.org

# Trata domínio de destino:
dstdomain www.debian.org .google.

# Tratar porta:
port 80

# Tratar por protocolo:
proto HTTP HTTPS FTP

# Da para definir pelo Navegador usado:
browser

# Definir dias da semana e horario.
# S = Sunday | M = Monday | T = Tuesday | W = Wednesday
# H = Thursday | F = Friday | S = Saturday
# De Segunda até Sexta das 09h até as 18h:
time MTWH 09:00-18:00

# Usar Regex (procura dentro da string).
# Bloquear qualquer coisa que tenha 'uol' no nome:
url_regex uol

# Mesma coisa acima, mas sempre olha depois da barra logo após o domínio (uol.com.br/esporte), vai olhar só o '/esporte':
url_path uol

Além de definir a ACL nós temos que aplicar ela, fazemos isso através do http_access, vejamos alguns exemplos:

# Aqui criamos uma ACL de nome "localhost" contendo localhost:
acl localhost src 127.0.0.1/255.255.255.255

# Permite a ACL 'localhost':
http_access allow localhost

# Cria a ACL contendo a porta que é utilizada no protocolo HTTPS.
acl SSL_ports port 443

# Bloqueia qualquer conexão que não esteja no conteúdo da ACL SSL_ports (por causa do '!' tudo que não faz parte da ACL):
http_access deny CONNECT !SSL_ports

# Cria a ACL 'redelocal' contendo a faixa de endereço da rede:
acl redelocal src 192.168.121.0/24

# Libera a ACL redelocal:
http_access allow redelocal

# Cria a ACL com nome "todosrc" contendo qualquer IP (all = todos os IPs).
acl todosrc src all

# Bloqueia a ACL 'todosrc', ou seja, bloqueia tudo que não foi liberado anteriormente:
http_access deny todosrc

Dica Extra

O CONNECT é um método HTTP usado para estabelecer uma conexão TCP segura com um servidor remoto através de um proxy. Quando um cliente faz uma solicitação CONNECT, ele pede ao proxy para estabelecer uma conexão com o servidor remoto na porta especificada na solicitação.


Veja mais detalhes do CONNECT
A regra "http_access deny CONNECT !SSL_ports" especifica que todas as solicitações CONNECT que não utilizam portas SSL devem ser negadas, ou seja, o Squid não permitirá que o cliente estabeleça uma conexão com o servidor remoto através do proxy.
Isso é útil para garantir que todas as conexões estabelecidas através do proxy sejam seguras e criptografadas, reduzindo o risco de interceptação ou acesso não autorizado aos dados transmitidos.


Controle de Acesso


Vamos ver como fazer controle de acesso no squid, para isso comece acessando o arquivo de configuração.

$ sudo vim /etc/squid/squid.conf

### Crie as ACLs no começo do arquivo:
acl allow_hosts src 192.168.1.0/24
acl allow_domain dstdomain .debian.org .ubuntu.com
acl deny_domain dstdomain .centos.org .ubuntu.com .kenel.org

# O '-i' é para ser case sensitive:
acl deny_words url_regex -i futebol esporte novela
## Podemos fazer por arquivo:
#acl deny_words url_regex -i "/etc/squid/blacklist_words"


# Libere a ACL 'allow_hosts' para acessar 'allow_domain':
http_access allow allow_hosts allow_domain

# Bloqueia a ACL 'allow_hosts' para acessar 'deny_domain':
http_access deny allow_hosts deny_domain

# Bloqueia 'deny_words' para todo mundo:
http_access deny deny_words

Reinicie o serviço do Squid:

$ sudo systemctl restart squid


Autenticação


Vamos configurar o Squid para que ele faça a autenticação do usuário, para que somente quem estiver autenticado possa usar o Proxy. É possível definir regras específicas por usuário ou simplesmente liberar "tudo" para quem estiver autenticado. Com Squid é possível configurar alguns tipos de autenticação:


  • basic
    Autenticação básica, que solicita um nome de usuário e senha em texto claro.

  • digest
    Usa um hash criptográfico para armazenar as senhas dos usuários.

  • external
    É uma autenticação externa, permite ao Squid delegar a autenticação a um outro programa.

  • negotiate
    Usa autenticação do Kerberos, ele é um sistema de autenticação baseado em tokens para autenticar usuários.


Essas opções são definidas com o parâmetro auth_param, que vamos usar mais adiante. Porém, ainda é possível usar a opção ldap_auth para usar uma autenticação via LDAP, mas nesse caso, requer a instalação do módulo auth_ldap.


Primeiro vamos definir os parâmetros usado na autenticação:

# Acesse o arquivo de configuração do Squid:
$ sudo vim /etc/squid/squid.conf

Adicione a parte abaixo no começo do arquivo

# Definindo a mensagem de exibição:
auth_param basic realm Por favor identifique-se!
# Definindo como a autenticação vai ser feita:
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/password

# Agora vamos definir uma ACL para usar essa autenticação:
acl autenticacao proxy_auth REQUIRED

Adicione a parte abaixo após a liberação/bloqueio de palavras proibidas

http_access allow autenticacao

Agora crie o arquivo de senhas:

# O '-c' é usado para criar o arquivo, em novas adições não deve ser usado ele, se não o arquivo será apagado e recriado.
htpasswd -c /etc/squid/password fulano
New password:
Re-type new password:
Adding password for user fulano

Agora reinicie o serviço do Squid ou faça ele reler as configurações para ativar:

$ sudo squid -k reconfigure

Só vai liberar sem autenticação para as palavras permitidas.



Fontes importantes


https://access.redhat.com/documentation/pt-br/red_hat_enterprise_linux/7/html/networking_guide/setting-up-squid-as-a-caching-proxy-with-ldap-authentication

No Ubuntu a localização do arquivo é /usr/lib/squid/basic_ldap_auth.