Configuração de proxy no terminal Linux e em CI: guia passo a passo para HTTP_PROXY, HTTPS_PROXY, NO_PROXY
Sumário do artigo
- Introdução: o que você vai conseguir e para quem é este guia
- Preparação inicial: endereço, porta, login e url correta do proxy
- Conceitos básicos: variáveis de ambiente, maiúsculas/minúsculas e formato do no_proxy
- Passo 1: ativar o proxy na sessão atual e testar com curl
- Passo 2: tornar a configuração permanente
- Passo 3: configurar gerenciadores de pacotes e utilitários individualmente
- Passo 4: configurar docker e kubernetes
- Passo 5: configurar proxy em ci — github actions e gitlab runner
- Verificação do resultado: garantir que o tráfego realmente passa pelo proxy
- Erros típicos e suas soluções
- Recursos adicionais e configurações avançadas
- Faq: perguntas frequentes sobre configuração de proxy
- Conclusão: o que você aprendeu e para onde ir a seguir
Imagine: você abre o terminal, digita um comando de instalação de pacote e, como resposta, silêncio ou um erro de conexão. Muitas vezes, o motivo é que o acesso à rede passa apenas por um servidor proxy, e o sistema não sabe disso. Este guia vai te ensinar a configurar proxy em todos os lugares necessários no Linux e em CI.
Introdução: o que você vai conseguir e para quem é este guia
Ao final deste guia, você será capaz de configurar proxy no terminal Linux e em sistemas de integração contínua com confiança. Você entenderá como funcionam as variáveis de ambiente, como montar corretamente a URL do proxy e como fazer todos os principais instrumentos de desenvolvimento funcionarem através do proxy.
O que exatamente você vai conseguir:
- Uma configuração funcional de proxy na sessão atual do terminal.
- Uma configuração permanente que sobrevive a reinicializações.
- A configuração correta para apt, dnf, git, npm, pip, curl, wget, Docker.
- Pipelines de CI funcionando no GitHub Actions e GitLab Runner.
- Entender como verificar se o tráfego realmente está passando pelo proxy.
- Habilidades para armazenar a senha do proxy de forma segura.
Para quem é este guia: para administradores de sistemas iniciantes, desenvolvedores e engenheiros DevOps que trabalham em ambientes com proxy corporativo. Também há elementos para avançados: detalhes do systemd, ProxyCommand para SSH e mascaramento de segredos em CI.
O que você precisa saber de antemão: você deve saber abrir o terminal, digitar comandos e entender o que é um arquivo e uma pasta. Todo o resto é explicado ao longo do texto em linguagem simples.
Quanto tempo vai levar: a configuração básica leva cerca de 15 minutos. A conclusão completa do guia com configuração de todas as ferramentas e CI — aproximadamente 60-90 minutos. Não tenha pressa, é melhor fazer com calma.
Dica: mantenha este guia aberto em uma janela separada e execute os comandos um a um. Assim você não perderá nenhum passo importante.
Preparação inicial: endereço, porta, login e URL correta do proxy
Antes de configurar qualquer coisa, é preciso reunir os dados do seu servidor proxy. Sem eles, não é possível prosseguir.
Onde obter os dados do proxy
Geralmente, o proxy é fornecido por uma das seguintes partes:
- Administrador de sistemas da empresa — se você trabalha em uma rede corporativa. Peça a ele o endereço, a porta e os dados de autenticação.
- Serviço de aluguel de proxy — no painel de controle geralmente há um bloco com as configurações de acesso.
- Seu próprio servidor — se você montou o proxy por conta própria, você já sabe os dados.
Você precisa de quatro elementos: endereço (host), porta (port), login (username) e senha (password). Às vezes login e senha não são necessários — nesse caso, o proxy é sem autenticação.
Como montar a URL do proxy
O proxy é definido como uma única string — a URL. O formato geral é:
esquema://login:senha@endereco:porta
Vamos usar um exemplo. Suponha que o endereço do proxy seja proxy.exemplo.com, a porta 3128, o login ivan e a senha secret123. Então a URL ficaria assim:
http://ivan:secret123@proxy.exemplo.com:3128
Se não for necessária autenticação, a URL é mais simples:
http://proxy.exemplo.com:3128
Sobre o esquema: na maioria das vezes, o esquema http é usado mesmo para acessar sites HTTPS. Isso é normal — o esquema aqui indica o protocolo de comunicação com o próprio proxy, não com o site de destino. Às vezes existem proxies com esquema https ou socks5.
Por que caracteres especiais na senha devem ser codificados
Esta é uma das causas mais frequentes de erros misteriosos. Se a senha contiver caracteres especiais como @, :, /, #, ?, eles quebram a interpretação da URL. Por exemplo, o caractere @ separa os dados de autenticação do endereço. Se ele aparecer na senha, o sistema se confunde e não entende onde termina a senha e começa o endereço.
A solução é o percent-encoding (codificação percentual). Cada caractere problemático é substituído pelo sinal de porcentagem e seu código em hexadecimal.
Principais substituições:
- Caractere @ vira %40
- Caractere : vira %3A
- Caractere / vira %2F
- Caractere # vira %23
- Caractere ? vira %3F
- Caractere espaço vira %20
- Caractere % vira %25
Exemplo: se a senha é p@ss:word, na URL ela deve aparecer como p%40ss%3Aword. Então a URL completa será:
http://ivan:p%40ss%3Aword@proxy.exemplo.com:3128
Dica: para codificar a senha rapidamente, use o comando python3 -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1], safe=''))" 'sua_senha'. Ele retornará a string pronta para inserir na URL.
⚠️ Atenção: nunca digite a senha real diretamente na linha de comando em um computador compartilhado — ela vai parar no histórico. Falaremos sobre entrada segura separadamente no final do guia.
✅ Verificação: você deve ter em mãos uma ou mais URLs de proxy montadas, com todos os caracteres especiais na senha codificados. Anote-as em um local seguro, de preferência em um gerenciador de senhas.
Conceitos básicos: variáveis de ambiente, maiúsculas/minúsculas e formato do NO_PROXY
Para que a configuração não seja mágica, vamos entender três conceitos fundamentais. Isso leva cinco minutos, mas economiza horas de depuração.
O que são variáveis de ambiente
Variável de ambiente é um valor nomeado que o sistema operacional mantém na memória e passa para os programas em execução. Pense nisso como um bilhete que o sistema mostra para cada novo programa: aqui está o endereço do proxy, use-o.
Muitos utilitários de rede no Linux, ao serem iniciados, leem variáveis específicas e, se as encontrarem, direcionam automaticamente o tráfego pelo proxy. As mais importantes são:
- HTTP_PROXY — proxy para requisições HTTP não criptografadas.
- HTTPS_PROXY — proxy para requisições HTTPS criptografadas.
- NO_PROXY — lista de endereços que devem ser acessados diretamente, ignorando o proxy.
- FTP_PROXY — proxy para o protocolo FTP, atualmente raro.
- ALL_PROXY — proxy para todos os protocolos de uma vez, frequentemente usado para socks.
Diferença entre http_proxy e HTTP_PROXY quanto a maiúsculas/minúsculas
Este é um ponto sutil, mas importante. O Linux diferencia maiúsculas de minúsculas, então http_proxy e HTTP_PROXY são formalmente duas variáveis diferentes. Programas diferentes leem variantes diferentes.
Historicamente, ficou assim:
- O utilitário curl lê tanto a versão minúscula quanto a maiúscula, mas a versão minúscula http_proxy tem uma peculiaridade de segurança — a versão maiúscula HTTP_PROXY é ignorada pelo curl em ambientes CGI para evitar ataques.
- O utilitário wget tradicionalmente prefere nomes minúsculos.
- Muitos programas em diferentes linguagens leem as versões maiúsculas.
Conclusão prática: para não ter que adivinhar, defina ambas as versões — a minúscula e a maiúscula. Essa é a estratégia mais confiável, e é a que usaremos.
Formato do NO_PROXY e por que ele não entende CIDR
A variável NO_PROXY contém uma lista de endereços separados por vírgula que devem ser acessados diretamente. Isso é crítico para recursos internos: bancos de dados, serviços locais, metadados da nuvem.
Exemplo de valor correto:
localhost,127.0.0.1,.exemplo.com,.internal,169.254.169.254
Observe o ponto antes de exemplo.com. O ponto significa que todos os subdomínios se enquadram na regra: api.exemplo.com, git.exemplo.com e assim por diante.
⚠️ Atenção: o NO_PROXY, em geral, não entende notação CIDR nem máscaras de sub-rede. Uma entrada como 10.0.0.0/8 não funcionará na maioria das ferramentas. Algumas versões modernas de bibliotecas podem suportar, mas não se pode confiar. Liste endereços específicos e sufixos de domínio explicitamente.
Além disso, o NO_PROXY normalmente não suporta asteriscos como curinga universal. Não escreva *.exemplo.com — use o ponto no início: .exemplo.com.
Dica: sempre adicione ao NO_PROXY o endereço localhost e 127.0.0.1. Caso contrário, requisições locais passarão pelo proxy e provavelmente quebrarão.
✅ Verificação: você entende para que servem HTTP_PROXY, HTTPS_PROXY e NO_PROXY, sabe sobre a diferença de maiúsculas/minúsculas e lembra que o NO_PROXY não gosta de CIDR. Agora podemos partir para a prática.
Passo 1: ativar o proxy na sessão atual e testar com curl
Objetivo da etapa: aprender a ativar rapidamente o proxy no terminal aberto e verificar se ele funciona. Essas configurações duram apenas até o fechamento da janela do terminal — ideal para teste.
Definir variáveis com export
O comando export cria uma variável de ambiente na sessão atual. Execute os seguintes comandos, substituindo pela sua URL de proxy.
- Abra o terminal.
- Digite o comando para HTTP: export http_proxy="http://ivan:secret123@proxy.exemplo.com:3128"
- Digite o comando para HTTPS: export https_proxy="http://ivan:secret123@proxy.exemplo.com:3128"
- Duplique em maiúsculas: export HTTP_PROXY="$http_proxy"
- E novamente: export HTTPS_PROXY="$https_proxy"
- Defina as exceções: export no_proxy="localhost,127.0.0.1,.exemplo.com"
- Duplique: export NO_PROXY="$no_proxy"
A construção "$http_proxy" insere o valor já definido da variável minúscula, para não precisar digitar a URL novamente.
Dica: observe que toda a URL está entre aspas duplas. Isso protege contra interpretação incorreta de caracteres especiais pelo seu shell bash.
Testar com curl
Agora vamos verificar se as variáveis estão sendo lidas. O utilitário curl é ótimo para isso.
- Verifique se a variável está definida: echo $http_proxy — você deve ver a sua URL.
- Faça uma requisição com saída detalhada: curl -v http://example.com
- Na saída, procure a linha que menciona Connected to proxy.exemplo.com — isso significa que o curl passou pelo proxy.
Se a autenticação estiver correta e o proxy acessível, você receberá uma página HTML como resposta. Se vir erro 407, o problema está no login ou senha — volte para a seção sobre codificação de senha.
Dica: a flag -v (verbose) mostra detalhes da conexão. Essa é sua principal ferramenta para depuração de proxy. Sem ela, você não verá para onde a requisição está indo.
Para desativar o proxy na sessão atual, use o comando unset: unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY no_proxy NO_PROXY. Todas as variáveis desaparecerão.
✅ Verificação: o comando curl -v http://example.com mostra conexão através do seu servidor proxy e retorna o conteúdo da página. Se sim, o primeiro passo foi concluído com sucesso.
Passo 2: tornar a configuração permanente
Objetivo da etapa: fazer com que o proxy seja ativado automaticamente sempre que você fizer login no sistema e sobreviva a reinicializações. Aqui existem vários níveis; escolha o mais adequado.
Opção A: apenas para seu usuário, via ~/.bashrc
O arquivo ~/.bashrc é executado toda vez que você abre um terminal interativo como seu usuário. Esta é a opção mais segura — você não mexe nos outros usuários do sistema.
- Abra o arquivo com um editor: nano ~/.bashrc
- Role até o final do arquivo.
- Adicione as mesmas linhas de export do Passo 1.
- Salve o arquivo: pressione Ctrl+O, depois Enter, depois Ctrl+X para sair.
- Aplique as alterações sem reinicializar: source ~/.bashrc
Dica: antes de editar, faça uma cópia de segurança com o comando cp ~/.bashrc ~/.bashrc.backup. Se algo der errado, você pode restaurar facilmente o original.
Opção B: para todo o sistema, via /etc/environment
O arquivo /etc/environment define variáveis para todos os usuários e funciona mesmo fora do bash. O formato aqui é especial: sem a palavra export, apenas NOME=valor.
- Abra o arquivo com privilégios de administrador: sudo nano /etc/environment
- Adicione linhas sem export, por exemplo: http_proxy="http://ivan:secret123@proxy.exemplo.com:3128"
- Adicione de forma similar https_proxy, HTTP_PROXY, HTTPS_PROXY, no_proxy, NO_PROXY.
- Salve e saia.
- Para aplicar, faça logout e login novamente, ou reinicie.
Opção C: via /etc/profile.d
Uma forma mais flexível em nível de sistema é criar um script separado na pasta /etc/profile.d. Todos os arquivos .sh ali são executados no login.
- Crie um arquivo: sudo nano /etc/profile.d/proxy.sh
- Dentro, use os comandos export normais, como no Passo 1.
- Salve o arquivo.
- Torne-o executável: sudo chmod +x /etc/profile.d/proxy.sh
Esta opção é mais conveniente que /etc/environment porque suporta sintaxe completa do shell.
Opção D: para serviços do sistema, via systemd drop-in
Atenção, este é um detalhe importante. Serviços em segundo plano gerenciados pelo systemd não leem seu ~/.bashrc e muitas vezes ignoram /etc/environment. Para eles, é necessária uma abordagem separada — o arquivo drop-in.
Suponha que você precise que um serviço específico, por exemplo some-service, funcione através do proxy.
- Crie o diretório e o arquivo drop-in com o comando: sudo systemctl edit some-service
- Um editor será aberto. Insira o bloco de configurações.
- Na seção [Service], adicione linhas como Environment="HTTP_PROXY=http://ivan:secret123@proxy.exemplo.com:3128"
- Adicione linhas Environment semelhantes para HTTPS_PROXY e NO_PROXY.
- Salve o arquivo.
- Recarregue a configuração: sudo systemctl daemon-reload
- Reinicie o serviço: sudo systemctl restart some-service
A diretiva Environment define a variável especificamente para aquele serviço. Esta é a única maneira correta para serviços do systemd.
⚠️ Atenção: em RHEL, CentOS, Fedora e AlmaLinux, os caminhos e ferramentas são os mesmos — o systemd funciona de forma idêntica. As diferenças aparecerão mais adiante, na seção sobre gerenciadores de pacotes.
✅ Verificação: abra um novo terminal (não aquele onde você fez export manualmente) e execute echo $http_proxy. Se você vir sua URL, a configuração permanente está funcionando.
Passo 3: configurar gerenciadores de pacotes e utilitários individualmente
Objetivo da etapa: muitas ferramentas não leem as variáveis de ambiente ou possuem seus próprios arquivos de configuração. Vamos configurar cada uma separadamente para que nada falhe.
apt no Ubuntu e Debian
O gerenciador de pacotes apt geralmente é executado via sudo e pode não enxergar suas variáveis. É mais seguro definir o proxy em seu próprio arquivo de configuração.
- Crie um arquivo: sudo nano /etc/apt/apt.conf.d/95proxies
- Adicione a linha: Acquire::http::Proxy "http://ivan:secret123@proxy.exemplo.com:3128";
- Adicione a linha para HTTPS: Acquire::https::Proxy "http://ivan:secret123@proxy.exemplo.com:3128";
- Salve o arquivo.
- Teste: sudo apt update
Observe o ponto e vírgula no final de cada linha — é um elemento obrigatório na sintaxe do apt.
dnf e yum no RHEL, Fedora, AlmaLinux
Em sistemas da família RHEL, usamos dnf e yum no lugar do apt. O proxy é definido no arquivo de configuração principal.
- Abra o arquivo: sudo nano /etc/dnf/dnf.conf (em sistemas antigos, /etc/yum.conf)
- Na seção [main], adicione a linha: proxy=http://proxy.exemplo.com:3128
- Se precisar de autenticação, adicione separadamente: proxy_username=ivan e proxy_password=secret123
- Salve o arquivo.
- Teste: sudo dnf makecache
No dnf, login e senha são mais convenientes como diretivas separadas, em vez de dentro da URL.
npm via .npmrc
- Defina o proxy com o comando: npm config set proxy "http://ivan:secret123@proxy.exemplo.com:3128"
- Defina para HTTPS: npm config set https-proxy "http://ivan:secret123@proxy.exemplo.com:3128"
- As configurações serão salvas automaticamente no arquivo ~/.npmrc.
- Verifique: npm config get proxy
pip via pip.conf
- Crie o diretório: mkdir -p ~/.config/pip
- Abra o arquivo: nano ~/.config/pip/pip.conf
- Adicione a seção [global] e a linha proxy = http://ivan:secret123@proxy.exemplo.com:3128
- Salve o arquivo.
- Teste instalando qualquer pacote: pip install requests
Alternativamente, você pode especificar o proxy diretamente no comando: pip install requests --proxy http://proxy.exemplo.com:3128
git via http.proxy
- Defina globalmente: git config --global http.proxy "http://ivan:secret123@proxy.exemplo.com:3128"
- Se necessário, separadamente para HTTPS: git config --global https.proxy "http://ivan:secret123@proxy.exemplo.com:3128"
- Verifique: git config --global --get http.proxy
Para remover a configuração: git config --global --unset http.proxy
git via SSH com ProxyCommand
Se você clona repositórios por SSH (endereço do tipo git@github.com), a configuração http.proxy não adianta — SSH é outro protocolo. Aqui é necessário o ProxyCommand.
- Abra o arquivo: nano ~/.ssh/config
- Adicione um bloco para o host desejado: linha Host github.com, depois, com indentação, a linha ProxyCommand nc -X connect -x proxy.exemplo.com:3128 %h %p
- Salve o arquivo.
- Instale o utilitário netcat, se não estiver presente: sudo apt install netcat-openbsd no Ubuntu, sudo dnf install nmap-ncat no RHEL.
Aqui, %h e %p são substituídos automaticamente pelo host e porta de destino. A flag -X connect indica ao netcat para usar um proxy HTTP.
curl via .curlrc
- Abra o arquivo: nano ~/.curlrc
- Adicione a linha: proxy = "http://ivan:secret123@proxy.exemplo.com:3128"
- Salve o arquivo.
Agora, o curl usará o proxy sempre, mesmo sem as variáveis de ambiente.
wget via .wgetrc
- Abra o arquivo: nano ~/.wgetrc
- Adicione as linhas: http_proxy = http://proxy.exemplo.com:3128 e https_proxy = http://proxy.exemplo.com:3128
- Adicione use_proxy = on
- Salve o arquivo.
composer para PHP
O composer lê a variável de ambiente HTTP_PROXY, portanto, muitas vezes uma configuração separada não é necessária. Se quiser definir explicitamente, use a variável no momento da execução: HTTP_PROXY=http://proxy.exemplo.com:3128 composer install
Go e GOPROXY: um aviso importante
⚠️ Atenção: a variável GOPROXY NÃO é um servidor proxy no sentido que estamos tratando. Não se pode confundir. GOPROXY aponta para um espelho de módulos Go — um serviço de onde as bibliotecas são baixadas. É um endereço de repositório, não um proxy de rede.
Para que o Go acesse a internet através do seu proxy normal, use as variáveis HTTP_PROXY e HTTPS_PROXY padrão. E deixe GOPROXY com o valor padrão, a menos que haja uma tarefa específica de alterar o espelho de módulos.
Dica: lembre-se da regra: se o nome da variável contém a palavra PROXY, isso não significa necessariamente que ela se refere ao seu proxy de rede. GOPROXY, npm registry e similares são sobre fontes de pacotes.
✅ Verificação: execute uma operação de teste com cada ferramenta configurada: sudo apt update, npm install, git ls-remote, etc. Todas devem conseguir acessar a rede com sucesso.
Passo 4: configurar Docker e Kubernetes
Objetivo da etapa: Docker é um caso especial. Ele possui três locais diferentes para configuração de proxy, e confundi-los é um erro típico. Vamos examinar cada um.
Local 1: o daemon Docker via systemd drop-in
Essa configuração é necessária para que o próprio Docker possa baixar imagens do registro. O daemon Docker é gerenciado pelo systemd, portanto usaremos o mecanismo drop-in já conhecido.
- Crie o diretório: sudo mkdir -p /etc/systemd/system/docker.service.d
- Crie o arquivo: sudo nano /etc/systemd/system/docker.service.d/proxy.conf
- Adicione a seção [Service].
- Adicione a linha Environment="HTTP_PROXY=http://proxy.exemplo.com:3128"
- Adicione linhas semelhantes para HTTPS_PROXY e NO_PROXY.
- Recarregue a configuração: sudo systemctl daemon-reload
- Reinicie o Docker: sudo systemctl restart docker
Para verificar, use: sudo systemctl show --property=Environment docker
Local 2: construção de imagem via build-arg
Ao construir uma imagem, os comandos dentro do Dockerfile (por exemplo, apt install) são executados em um ambiente isolado que não vê o proxy do host. É necessário passar o proxy explicitamente.
- No Dockerfile, adicione as instruções ARG http_proxy e ARG https_proxy antes dos comandos RUN.
- Construa a imagem passando os argumentos: docker build --build-arg http_proxy=http://proxy.exemplo.com:3128 --build-arg https_proxy=http://proxy.exemplo.com:3128 -t myimage .
⚠️ Atenção: não escreva a senha do proxy diretamente no Dockerfile com a instrução ENV. Ela permanecerá nas camadas da imagem, e qualquer pessoa que obtiver a imagem verá a senha. Use apenas build-arg, ou melhor, um proxy sem senha para a construção.
Local 3: contêineres em execução via ~/.docker/config.json
Para que os contêineres em execução recebam automaticamente as variáveis de proxy, configure o arquivo de configuração do cliente Docker.
- Abra o arquivo: nano ~/.docker/config.json
- Adicione o bloco proxies com a seção default.
- Dentro, especifique httpProxy, httpsProxy e noProxy com seus valores.
- Salve o arquivo.
Agora, sempre que você executar docker run, as variáveis serão automaticamente injetadas no contêiner.
Variáveis no manifesto do Kubernetes
No Kubernetes, o proxy é definido através de variáveis de ambiente na especificação do contêiner. Na seção env do manifesto do Pod ou Deployment, adicione itens com name HTTP_PROXY, HTTPS_PROXY, NO_PROXY e os respectivos value.
Dica: valores secretos no Kubernetes devem ser armazenados em objetos Secret e conectados via valueFrom, sem escrever a senha diretamente no manifesto. Assim, a senha não vai parar no sistema de controle de versão.
✅ Verificação: execute docker pull hello-world — a imagem deve ser baixada. Depois, docker run --rm alpine env | grep -i proxy — você verá as variáveis injetadas dentro do contêiner.
Passo 5: configurar proxy em CI — GitHub Actions e GitLab Runner
Objetivo da etapa: fazer com que os pipelines de CI funcionem através do proxy, armazenando o acesso de forma segura e sem expor a senha nos logs.
Armazenar o acesso em segredos
A regra principal em CI: nunca escreva a senha do proxy diretamente no arquivo YAML do pipeline. O arquivo fica no repositório e a senha será vista por todos. Use o mecanismo de segredos.
No GitHub Actions, os segredos são adicionados nas configurações do repositório, seção Settings, depois Secrets and variables, depois Actions. Crie um segredo com o nome PROXY_URL e cole a URL completa do proxy.
No GitLab, os segredos são chamados de CI/CD variables. Eles são adicionados em Settings, depois CI/CD, depois Variables. Certifique-se de marcar as opções Masked e Protected para valores sensíveis.
Configurar GitHub Actions
- No arquivo do pipeline .github/workflows, adicione um bloco env no nível do job.
- Defina HTTP_PROXY com o valor do segredo usando a sintaxe de chaves duplas com secrets.PROXY_URL.
- Defina HTTPS_PROXY e NO_PROXY de forma similar.
- Essas variáveis estarão disponíveis para todas as etapas do job.
Configurar GitLab Runner
No GitLab, existem dois níveis. Você pode definir variáveis no próprio arquivo .gitlab-ci.yml através do bloco variables, ou no nível do runner no arquivo de configuração config.toml, na seção environment.
- Para o projeto: adicione no .gitlab-ci.yml um bloco variables com referências a variáveis protegidas.
- Para todos os projetos do runner: abra o config.toml do runner e, na seção [[runners]], adicione o parâmetro environment com a lista de variáveis desejadas.
Mascarar a senha nos logs
Mesmo com segredos, a senha pode acidentalmente aparecer nos logs se algum comando a exibir. O GitHub Actions mascara automaticamente os valores dos segredos com asteriscos. No GitLab, isso é feito pela opção Masked — mas ela só funciona se o valor atender a certos requisitos (sem alguns caracteres especiais e com comprimento suficiente).
⚠️ Atenção: evite comandos com a flag -v ou echo que imprimam a URL completa do proxy nos logs. Mesmo com mascaramento, é melhor não arriscar. Para depuração, imprima apenas o endereço e a porta, sem login e senha.
Dica: armazene a URL do proxy sem a senha embutida, e mantenha login e senha como segredos separados. Assim, fica mais fácil mascarar e rotacionar.
✅ Verificação: execute o pipeline manualmente. A etapa que faz uma requisição de rede (por exemplo, instalação de dependências) deve ser concluída com sucesso. A senha não deve aparecer nos logs.
Verificação do resultado: garantir que o tráfego realmente passa pelo proxy
Não basta configurar — é preciso comprovar que o tráfego está realmente passando pelo proxy e não indo diretamente. Aqui está uma lista de verificação.
Lista de verificação: o que deve funcionar
- O comando echo $http_proxy em um novo terminal mostra sua URL.
- curl -v http://example.com mostra a linha Connected to proxy.
- sudo apt update atualiza as listas de pacotes com sucesso.
- git ls-remote para um repositório remoto funciona.
- docker pull baixa uma imagem.
- O pipeline de CI termina em verde.
Como testar de forma confiável
A maneira mais honesta é saber qual endereço IP externo o servidor de destino vê. Faça uma requisição a um serviço que mostre seu IP. Se estiver usando proxy, você verá o IP do servidor proxy, não o seu próprio.
- Faça uma requisição sem proxy: env -u http_proxy -u https_proxy curl -s http://ifconfig.me — você verá seu IP real.
- Faça com proxy: curl -s http://ifconfig.me — você verá o IP do proxy.
- Se os dois endereços forem diferentes, o proxy está funcionando.
Outra forma é verificar os logs do próprio servidor proxy, se você tiver acesso a eles. Suas requisições devem aparecer lá.
Dica: o comando env -u remove temporariamente a variável apenas para um comando, sem afetar a sessão. É útil para comparar o comportamento com e sem proxy.
✅ Verificação: o IP com proxy é diferente do IP direto. Essa é a prova definitiva de que o tráfego está passando pelo proxy.
Erros típicos e suas soluções
Vamos analisar problemas comuns. Formato simples: problema, causa, solução.
Problema 1: sudo não herda as variáveis
Causa: o sudo, por padrão, limpa o ambiente por questões de segurança. Seus export não chegam ao comando executado com sudo.
Solução: use a flag -E para preservar o ambiente: sudo -E apt update. Ou configure a preservação permanente através do arquivo sudoers. Execute sudo visudo e adicione a linha Defaults env_keep += "http_proxy https_proxy HTTP_PROXY HTTPS_PROXY no_proxy NO_PROXY". Depois disso, o sudo sempre permitirá essas variáveis.
Problema 2: erros de certificado
Causa: alguns proxies corporativos interceptam HTTPS e substituem os certificados pelo seu próprio certificado raiz. O sistema não o conhece e reclama de conexão não confiável.
Solução: obtenha o certificado raiz do proxy com o administrador. No Ubuntu e Debian, copie-o para /usr/local/share/ca-certificates com extensão .crt e execute sudo update-ca-certificates. No RHEL, coloque em /etc/pki/ca-trust/source/anchors e execute sudo update-ca-trust. Depois disso, todas as ferramentas passarão a confiar no proxy.
Problema 3: curl funciona, apt não funciona
Causa: curl lê as variáveis de ambiente, mas o apt com sudo não as vê e não tem seu próprio arquivo de configuração de proxy.
Solução: configure o proxy em /etc/apt/apt.conf.d, conforme descrito no Passo 3. Essa é uma configuração separada das variáveis de ambiente e é exatamente a que o apt precisa.
Problema 4: senha com caracteres especiais
Causa: caracteres @, :, / na senha não codificada quebram a interpretação da URL.
Solução: aplique a codificação percentual da seção de Preparação. Substitua @ por %40, : por %3A e assim por diante.
Problema 5: erro 407 Proxy Authentication Required
Causa: login ou senha incorretos, ou o proxy exige autenticação e você não a forneceu.
Solução: verifique novamente o login e a senha. Certifique-se de que os dados de autenticação estão na URL. Verifique a codificação de caracteres especiais.
Problema 6: recursos internos inacessíveis
Causa: requisições para endereços locais e internos estão passando pelo proxy, que não os conhece.
Solução: adicione esses endereços ao NO_PROXY. Não se esqueça de localhost, 127.0.0.1 e domínios internos com ponto no início.
Problema 7: o daemon Docker não vê o proxy
Causa: você configurou as variáveis no bashrc, mas o daemon Docker é gerenciado pelo systemd e não as lê.
Solução: use o systemd drop-in do Passo 4, não se esqueça de daemon-reload e restart docker.
Problema 8: as configurações não foram aplicadas
Causa: você editou o bashrc, mas não reiniciou o terminal.
Solução: execute source ~/.bashrc ou abra uma nova janela de terminal.
Recursos adicionais e configurações avançadas
Quando a configuração básica estiver funcionando, você pode melhorar a conveniência e a flexibilidade.
Funções de ativar/desativar proxy
É útil criar no ~/.bashrc duas funções: proxy_on para ativar e proxy_off para desativar. Dentro de proxy_on, coloque os comandos export; dentro de proxy_off, os comandos unset. Assim, a alternância se torna um único comando.
Proxies diferentes para tarefas diferentes
Você pode definir um proxy apenas para um comando, sem alterar todo o ambiente. Exemplo: https_proxy=http://outro:3128 curl https://example.com. A variável vale apenas para esse comando.
Proxy SOCKS
Se você tem um proxy do tipo SOCKS5, use o esquema socks5 na URL e a variável ALL_PROXY. Para curl, existe a flag --socks5. Lembre-se de que nem todos os utilitários funcionam com SOCKS.
Dica: para ferramentas que simplesmente não suportam proxy, existem wrappers como proxychains. Mas use-os com consciência, pois eles alteram o comportamento das chamadas de rede do programa.
Tabela resumo de configurações
Mantenha este resumo à mão. Formato: ferramenta — arquivo de configuração — variável ou diretiva.
- Sessão shell — temporário na memória — export http_proxy e HTTP_PROXY.
- Usuário — ~/.bashrc — export das variáveis.
- Sistema todo — /etc/environment — http_proxy sem export.
- Sistema todo — /etc/profile.d/proxy.sh — export das variáveis.
- Serviço systemd — drop-in via systemctl edit — diretiva Environment.
- apt (Ubuntu, Debian) — /etc/apt/apt.conf.d/95proxies — Acquire::http::Proxy.
- dnf, yum (RHEL) — /etc/dnf/dnf.conf — proxy, proxy_username, proxy_password.
- npm — ~/.npmrc — proxy e https-proxy.
- pip — ~/.config/pip/pip.conf — proxy na seção global.
- git por HTTPS — config global do git — http.proxy.
- git por SSH — ~/.ssh/config — ProxyCommand.
- curl — ~/.curlrc — proxy.
- wget — ~/.wgetrc — http_proxy, https_proxy, use_proxy.
- composer — ambiente — HTTP_PROXY.
- Daemon Docker — /etc/systemd/system/docker.service.d/proxy.conf — Environment.
- Construção Docker — comando build — build-arg http_proxy.
- Contêineres Docker — ~/.docker/config.json — bloco proxies.
- Kubernetes — manifesto Pod — env com HTTP_PROXY.
- GitHub Actions — arquivo workflow — bloco env com secrets.
- GitLab — .gitlab-ci.yml ou config.toml — variables ou environment.
FAQ: perguntas frequentes sobre configuração de proxy
Preciso definir as variáveis tanto em minúsculas quanto em maiúsculas?
Sim, essa é a estratégia mais confiável. Programas diferentes leem maiúsculas ou minúsculas, portanto definir ambas elimina surpresas.
Por que o curl vê o proxy, mas o apt não?
Porque o apt com sudo não herda as variáveis de ambiente e tem seu próprio arquivo de configuração. Configure o apt separadamente através do arquivo em /etc/apt/apt.conf.d.
Como desativar temporariamente o proxy para um único comando?
Use env -u http_proxy -u https_proxy antes do comando. Isso remove as variáveis apenas para aquela execução.
Posso especificar uma sub-rede no NO_PROXY?
Em geral, não. O NO_PROXY não interpreta notação CIDR de forma confiável. Liste endereços específicos e sufixos de domínio com ponto no início.
GOPROXY é meu servidor proxy?
Não. GOPROXY aponta para um espelho de módulos Go, não para um proxy de rede. Para proxy de rede no Go, use HTTP_PROXY e HTTPS_PROXY.
Como armazenar a senha do proxy de forma segura?
Em CI, use segredos. Localmente, utilize o arquivo .netrc com permissões 600 ou um gerenciador de senhas. Evite que a senha apareça no histórico de comandos.
Por que o git via SSH não passa pelo http.proxy?
Porque SSH é um protocolo separado. Configure o ProxyCommand no arquivo ~/.ssh/config para o host desejado.
O que fazer em caso de erros de certificado através do proxy?
Instale o certificado raiz do proxy no repositório do sistema e atualize a confiança com o comando update-ca-certificates no Debian ou update-ca-trust no RHEL.
As configurações no bashrc não funcionam em uma nova sessão, por quê?
Possivelmente você editou o arquivo errado, não salvou as alterações ou não abriu um novo terminal. Verifique com echo e source.
Como verificar se o tráfego realmente está passando pelo proxy?
Compare o IP externo com e sem proxy usando o curl para um serviço de determinação de IP. Endereços diferentes confirmam o funcionamento do proxy.
Conclusão: o que você aprendeu e para onde ir a seguir
Parabéns, você percorreu um longo caminho. Vamos resumir o que você agora sabe fazer.
Você aprendeu a montar uma URL de proxy correta e a codificar caracteres especiais na senha. Entendeu as variáveis HTTP_PROXY, HTTPS_PROXY e NO_PROXY, incluindo as sutilezas de maiúsculas/minúsculas e formato das exceções. Você sabe ativar o proxy em uma sessão e tornar a configuração permanente de várias formas, incluindo systemd drop-in para serviços.
Você configurou proxy para todas as ferramentas principais: apt e dnf, npm e pip, git por HTTPS e SSH, curl e wget, composer, e também entendeu a importante diferença do GOPROXY. Você dominou os três locais de configuração do Docker e as variáveis no Kubernetes. Por fim, configurou proxy no GitHub Actions e GitLab com armazenamento seguro de segredos e mascaramento de senha.
O que fazer a seguir: consolide o conhecimento com a prática. Configure o proxy em uma máquina de teste do zero, seguindo o guia. Crie funções de alternância para conveniência. Estude os logs do seu servidor proxy para ver o tráfego com seus próprios olhos.
Para onde evoluir: o próximo passo é automatizar a configuração com ferramentas de gerenciamento de configuração como Ansible, para implantar o proxy em dezenas de máquinas com um único comando. Também é útil aprofundar o estudo sobre certificados e diferentes tipos de proxy.
Dica: salve a tabela resumo deste guia como uma cola. Ela economizará muito tempo quando você precisar se lembrar rapidamente de onde configurar o proxy para uma ferramenta específica.
Você se saiu muito bem. Agora, o proxy no terminal Linux e em CI não é mais mistério para você. Boas configurações e conexões estáveis.