web-dev-qa-db-fra.com

Définissez une plage réseau dans la variable d'environnement no_proxy

Je suis dans un réseau utilisant un proxy. J'ai des machines qui utilisent de nombreux scripts ici et là qui se connectent via HTTP.

  • Le réseau est 10.0.0.0/8.
  • Mon proxy est 10.1.1.1:81, je l'ai donc configuré en conséquence:

    export http_proxy=http://10.1.1.1:81/
    
  • Je souhaite exclure ma propre plage accessible avec le proxy. J'ai essayé n'importe quelle combinaison disponible.

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

Aucun des travaux ci-dessus!

Je teste avec wget et il essaie toujours d'interroger le proxy, quelle que soit l'adresse IP à laquelle je veux me connecter.

  • Comme de nombreux scripts se trouvent partout dans tous les systèmes, le --no-proxy option n'est en fait pas une option. Je veux le définir à l'échelle du système.
61
SamK

Vous le regardez dans le mauvais sens. Le no_proxy La variable d'environnement répertorie les suffixes de domaine, pas les préfixes. De la documentation :

no_proxy: Cette variable doit contenir une liste séparée par des virgules d'extensions de domaine. Le proxy ne doit pas être utilisé pour.

Ainsi, pour les adresses IP, vous avez deux options:

1) Ajoutez chaque IP en entier:

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

2) Renommez wget en wget-original et écrivez un script wrapper (appelé wget) qui recherche l'IP de l'hôte de l'URL donnée et détermine s'il doit utiliser le proxy ou non:

#!/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;
45
janmoesen

info wget dit:

 `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.

La variable doit donc contenir une liste de domaines, et non plages IP. Vous devrez configurer des alias locaux appropriés pour vos machines locales dans /etc/hosts des dossiers).

En dehors de cela, gardez à l'esprit que la définition d'une variable d'environnement ne garantit qu'un proxy sera ou ne sera pas utilisé. C'est juste une information qui peut être utilisée par les programmes qui la prennent en charge.

19
rozcietrzewiacz

Voici une approche légèrement plus simple (une ligne) basée sur la solution de janmoesen.

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

qui a été encore amélioré sur la base de la contribution de Cory Ringdahl:

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

sed étouffe tous les arguments transmis par l'expansion de 10.1.{1..255}.{1..255}, soit dans son code, soit dans le mien. Donc, si vous avez vraiment besoin d'étendre à 256 * 256 adresses IP, vous pourrez peut-être adapter davantage l'approche de Cory Ringdahl, mais si vous avez simplement besoin de 256 ou plus, l'une ou l'autre devrait fonctionner parfaitement pour vous.

Je suppose que la version où 2 octets sont étendus ressemblerait à ceci:

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

mais iTerm me donne des erreurs sur les listes d'arguments trop longues, donc je ne peux pas dire avec certitude s'il existe une solution pour que cela fonctionne ...

13
iconoclast

Ce n'est pas exactement une bonne solution, mais cela pourrait résoudre le problème pour vous. Si vous supposez que l'accès à quoi que ce soit de l'extérieur du proxy utilisera des noms DNS et non directement des adresses IP, vous pouvez le définir comme:

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

Pour autant que je sache, aucun domaine supérieur ne se termine par un nombre, donc s'il le fait, il doit s'agir d'une adresse IP.

12
Lars Berntzon