Defina um intervalo de rede na variável de ambiente no_proxy


52

Estou em uma rede usando um proxy. Eu tenho máquinas usando muitos scripts aqui e ali acessando-se através de HTTP.

  • A rede é 10.0.0.0/8.
  • Meu proxy é 10.1.1.1:81, então eu o configurei de acordo:

    export http_proxy=http://10.1.1.1:81/
  • Quero excluir meu próprio intervalo para ser acessado com o proxy. Eu tentei qualquer combinação disponível.

    export no_proxy='10.*'
    export no_proxy='10.*.*.*'
    export no_proxy='10.0.0.0/8'
    

Nenhum dos trabalhos acima!

Estou testando wgete ele sempre tenta consultar o proxy, seja qual for o endereço IP ao qual eu queira me conectar.

  • Como muitos scripts estão em todos os lugares em todos os sistemas, a --no-proxyopção não é realmente uma opção. Eu quero configurá-lo em todo o sistema.

11
É quase 2019 e não há como colocar o CIDR na no_proxyvariável de ambiente? Que diabos Linus Torvalds !!
7_R3X 12/11/19

4
@ 7_R3X é o GNU wget, então espero que você queira amaldiçoar Richard Stallman?
Jakub Bochenski

Respostas:


43

Você está olhando da maneira errada. A no_proxyvariável de ambiente lista os sufixos do domínio, não os prefixos. A partir da documentação :

no_proxy: Essa variável deve conter uma lista separada por vírgula de extensões de domínio que o proxy não deve ser usado.

Portanto, para IPs, você tem duas opções:

1) Adicione cada IP na íntegra:

printf -v no_proxy '%s,' 10.1.{1..255}.{1..255};
export no_proxy="${no_proxy%,}";

2) Rename wgetpara wget-originale escrever um script (chamado wget) que procura o IP para a determinado host da URL, e determina se ele deve usar o proxy ou não:

#!/bin/bash
ip='';
for arg; do
   # parse arg; if it's a URL, determine the IP address
done;
if [[ "$ip" =~ ^10\.1\. ]]; then
   wget-original --no-proxy "$@";
else
   wget-original "$@";
fi;

Muito obrigado, vou encerrar meu wget (e usar nomes de host em vez de endereços IP).
SamK 28/10

9
Ter 255 * 255 endereços em no_proxy arrisca problemas de desempenho?
Jtpereyda

@dafrazzman: isso poderia muito bem ser. Afinal, tem quase 800 kilobytes de tamanho, o que é um tanto extremo para uma variável de ambiente. Também depende do tamanho do seu ambiente. Para esse caso extremo, eu recomendaria a abordagem do wrapper.
precisa saber é o seguinte

4
Não adicione cada IP na íntegra - será muito longo e você não poderá executar nenhum comando no bash.
Ross

5
NUNCA FAZER ISSO, isso gerará algo muito longo para qualquer comando e, se você colocar isso em /etc/environmentarquivo, isso poderá danificar seu servidor.
Thomas Decaux

16

info wget diz:

 `no_proxy'
     This variable should contain a comma-separated list of domain
     extensions proxy should _not_ be used for.  For instance, if the
     value of `no_proxy' is `.mit.edu', proxy will not be used to
     retrieve documents from MIT.

Portanto, a variável deve conter uma lista de domínios , não intervalos de IP . Você precisará configurar aliases locais apropriados para suas máquinas locais nos /etc/hostsarquivos.

Além disso, lembre-se de que a configuração de uma variável de ambiente não garante que um proxy seja ou não usado. É apenas uma informação que pode ser usada por programas que a suportam.


Se o wget implementa isso da mesma maneira que o curl - e eu suspeito que sim -, não há diferença se for o endereço IP ou o nome de domínio, pois ambos são tratados como strings - consulte github.com/curl/curl/issues/1208
Piotr Dobrogost

12

Não é exatamente uma solução correta, mas pode resolver o problema para você. Se você presumir que acessar qualquer coisa de fora do proxy estará usando nomes DNS e não diretamente usando endereços IP, é possível configurá-lo como:

export no_proxy=0,1,2,3,4,5,6,7,8,9

Até onde eu sei, nenhum domínio superior termina com um número; portanto, se o fizer, deve ser um endereço IP.


7
Essa é uma solução muito inteligente :) Infelizmente, isso ignorará o proxy para qualquer IP, não apenas para IPs locais ... :( Não há como (em 2018) especificar intervalos de IP ou CIDR na variável "noproxy"?
Sorin Postelnicu 26/03

Para servidor de data center, esse é um truque muito inteligente. Tem efeito colateral, mas aceitável.
notas-jj

Isto não funcionou para mim .. teve de usar a solução @iconoclast
Erik

12

Aqui está uma abordagem um pouco mais simples (uma linha) com base na solução da janmoesen.

export no_proxy=`echo 10.1.1.{1..255} | sed 's/ /,/g'`

que foi aprimorado ainda mais com base na contribuição de Cory Ringdahl:

export no_proxy="`echo 10.1.1.{1..254},` 10.1.1.255"

sed engasga com todos os argumentos passados ​​a partir da expansão de 10.1.{1..255}.{1..255}, no código dele ou no meu. Portanto, se você realmente precisar expandir para endereços IP 256 * 256, poderá adaptar ainda mais a abordagem de Cory Ringdahl, mas se você precisar apenas de 256 ou mais, um desses deve funcionar perfeitamente para você.

Eu estou supondo que a versão em que 2 octetos são expandidos ficaria assim:

export no_proxy="`echo 10.1.{1..255}.{1..254},` 10.1.255.255"

mas o iTerm está me dando erros sobre as listas de argumentos serem muito longas, então não posso dizer com certeza se existe uma solução para fazer isso funcionar ...


11
Pode se locomover usando o sed fazendo"export no_proxy=`echo 10.1.1.{1..254},`10.1.1.255"
Cory Ringdahl

Bom ... Estou ajustando um pouco para tornar o espaçamento consistente após vírgulas, e vou adicioná-lo.
iconoclast
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.