Esse é um caso de uso definitivo para um proxy . Um proxy normal, não um proxy reverso (também conhecido como balanceadores de carga).
O mais conhecido e gratuito e de código aberto é o squid . Felizmente, é um dos poucos bons softwares de código aberto que podem ser facilmente instalados com um único apt-get install squid3
e configurados com um único arquivo /etc/squid3/squid.conf
.
Analisaremos as boas práticas e as lições sobre as quais você deve saber.
O arquivo de configuração oficial foi modificado (as 5000 linhas comentadas inúteis foram removidas).
# WELCOME TO SQUID 3.4.8
# ----------------------------
#
# This is the documentation for the Squid configuration file.
# This documentation can also be found online at:
# http://www.squid-cache.org/Doc/config/
#
# You may wish to look at the Squid home page and wiki for the
# FAQ and other documentation:
# http://www.squid-cache.org/
# http://wiki.squid-cache.org/SquidFaq
# http://wiki.squid-cache.org/ConfigExamples
#
###########################################################
# ACL
###########################################################
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 1025-65535 # unregistered ports
acl CONNECT method CONNECT
#####################################################
# Recommended minimum Access Permission configuration
#####################################################
# Deny requests to certain unsafe ports
http_access deny !Safe_ports
# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports
# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager
#####################################################
# ACL
#####################################################
# access is limited to our subnets
acl mycompany_net src 10.0.0.0/8
# access is limited to whitelisted domains
# ".example.com" includes all subdomains of example.com
acl repo_domain dstdomain .keyserver.ubuntu.com
acl repo_domain dstdomain .debian.org
acl repo_domain dstdomain .python.org
# clients come from a known subnet AND go to a known domain
http_access allow repo_domain mycompany_net
# And finally deny all other access to this proxy
http_access deny all
#####################################################
# Other
#####################################################
# default proxy port is 3128
http_port 0.0.0.0:3128
# don't forward internal private IP addresses
forwarded_for off
# disable ALL caching
# bandwidth is cheap. debugging cache related bugs is expensive.
cache deny all
# logs
# Note: not sure if squid configures logrotate or not
access_log daemon:/var/log/squid3/access.log squid
access_log syslog:squid.INFO squid
# leave coredumps in the first cache dir
coredump_dir /var/spool/squid3
# force immediaty expiry of items in the cache.
# caching is disabled. This setting is set as an additional precaution.
refresh_pattern . 0 0% 0
Configuração do cliente - Variáveis de ambiente
Configure estas duas variáveis de ambiente em todos os sistemas.
http_proxy=squid.internal.mycompany.com:3128
https_proxy=squid.internal.mycompany.com:3128
A maioria das bibliotecas cliente http (libcurl, httpclient, ...) são auto-configuráveis usando as variáveis de ambiente. A maioria dos aplicativos está usando uma das bibliotecas comuns e, portanto, suporta o proxy pronto para uso (sem o deviente necessariamente sabendo disso).
Observe que a sintaxe é estrita:
- O nome da variável
http_proxy
DEVE ser minúsculo na maioria dos Linux.
- O valor da variável NÃO DEVE começar com
http(s)://
(o protocolo de proxy NÃO é http (s)).
Configuração do cliente - específica
Alguns aplicativos estão ignorando as variáveis de ambiente e / ou são executados como serviço antes que as variáveis possam ser definidas (por exemplo, debian apt
).
Esses aplicativos exigirão configuração especial (por exemplo, /etc/apt.conf
).
Proxying HTTPS - Conecte
O proxy HTTPS é totalmente suportado pelo design. Ele usa um método especial "CONNECT" que estabelece algum tipo de túnel entre o navegador e o proxy.
Não sei muito sobre isso, mas nunca tive problemas com isso em anos. Apenas funciona.
Caso especial de HTTPS - proxy transparente
Uma nota no proxy transparente. (isto é, o proxy está oculto e intercepta os pedidos de clientes, como o man-in-the-middle).
Proxies transparentes estão quebrando o HTTPS. O cliente não sabe que existe um proxy e não tem motivos para usar o método Connect especial.
O cliente tenta uma conexão HTTPS direta ... que é interceptada. A interceptação é detectada e erros são lançados em todo o lugar. (O HTTPS serve para detectar ataques man-in-he-middle).
Domínio e lista de permissões do CDN
A lista de permissões de domínios e subdomínios é totalmente suportada pelo squid. No entanto, está fadado a falhar de tempos em tempos de maneira inesperada.
Os sites modernos podem ter todo o tipo de redirecionamentos de domínio e CDN. Isso quebrará o ACL quando as pessoas não se esforçarem para colocar tudo em um único domínio.
Às vezes, haverá um instalador ou um pacote que deseja chamar o proprietário ou recuperar dependências externas antes de executá-lo. Vai falhar a cada momento e não há nada que você possa fazer sobre isso.
Cache
O arquivo de configuração fornecido está desativando toda a forma de armazenamento em cache. É melhor prevenir do que remediar.
Pessoalmente, estou executando as coisas na nuvem no momento, todas as instâncias têm conectividade de pelo menos 100 Mbps e o provedor executa seus próprios repositórios para coisas populares (por exemplo, Debian) que são descobertas automaticamente. Isso faz da largura de banda uma mercadoria que eu não poderia me importar menos.
Eu prefiro desativar totalmente o cache do que experimentar um único bug de cache que derreterá meu cérebro na solução de problemas. Todas as pessoas na internet NÃO PODEM obter seus cabeçalhos de cache corretamente.
Nem todos os ambientes têm os mesmos requisitos. Você pode ir além e configurar o armazenamento em cache.
NUNCA NUNCA requer autenticação no proxy
Existe uma opção para exigir autenticação de senha de clientes, normalmente com suas contas LDAP. Ele quebrará todos os navegadores e todas as ferramentas de linha de comando no universo.
Se você quiser fazer autenticação no proxy, não faça isso.
Se o gerenciamento quiser autenticação, explique que não é possível.
Se você é um desenvolvedor e acabou de entrar em uma empresa que está bloqueando a Internet direta E forçando a autenticação por proxy, CORRA PARA FORA QUANDO PODE.
Conclusão
Nós passamos pela configuração comum, erros comuns e coisas que devemos saber sobre proxy.
Lição aprendida:
- Existe um bom software de código aberto para proxy (squid)
- É simples e fácil de configurar (um único arquivo curto)
- Todas as medidas de segurança (opcionais) têm tradeoffs
- A maioria das opções avançadas vai quebrar as coisas e voltar para assombrá-lo
- Os proxies transparentes estão quebrando o HTTPS
- Autenticação de proxy é mal
Como de costume na programação e no design do sistema, é essencial gerenciar os requisitos e as expectativas.
Eu recomendaria manter o básico ao configurar um proxy. De um modo geral, um proxy simples, sem qualquer filtragem em particular, funcionará bem e não causará nenhum problema. Só tenho que lembrar de (auto) configurar os clientes.