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

52

Je suis dans un réseau utilisant un proxy. J'ai des machines qui utilisent beaucoup de scripts ici et là et 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 veux exclure ma propre plage à laquelle accéder 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'

Aucune de ces solutions ne fonctionne!

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

  • Étant donné que de nombreux scripts se trouvent partout dans tous les systèmes, l' --no-proxyoption n'est en réalité pas une option. Je veux le mettre à l'échelle du système.
SamK
la source
1
C'est presque 2019 et aucun moyen de mettre CIDR dans no_proxyla variable d'environnement? Que diable Linus Torvalds !!
7_R3X
4
@ 7_R3X c'est GNU wget alors je suppose que vous vouliez maudire Richard Stallman?
Jakub Bochenski le

Réponses:

43

Vous regardez la mauvaise façon. La no_proxyvariable d'environnement répertorie les suffixes de domaine, pas les préfixes. De la documentation :

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

Donc, pour les IP, vous avez deux options:

1) Ajoutez chaque adresse IP au complet:

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

2) Renommer wgetpour wget-originalet écrire un script d'emballage (appelé wget) qui recherche l'adresse IP de l'hôte URL donnée, et détermine si elle 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;
Janmoesen
la source
Merci beaucoup, je vais envelopper mon wget (et utiliser des noms d'hôte au lieu d'adresses IP).
SamK
9
Est-ce qu'avoir 255 * 255 adresses dans les problèmes de performance no_proxy risque?
jtpereyda
@ dafrazzman: cela pourrait bien être. Après tout, il fait presque 800 kilo-octets, ce qui est un peu extrême pour une variable d’environnement. Cela dépend également de la taille de votre environnement. Pour ce cas extrême, je recommanderais l'approche wrapper.
janmoesen
4
N'ajoutez pas chaque adresse IP au complet - elle sera trop longue et vous ne pourrez exécuter aucune commande dans bash.
Ross
5
NE FAITES JAMAIS CELA, cela générera quelque chose de trop long pour une commande et, si vous le mettez dans un /etc/environmentfichier, cela pourrait endommager votre serveur.
Thomas Decaux
16

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 , pas de plages IP . Vous aurez besoin de configurer des alias locaux appropriés pour vos machines locales dans un ou plusieurs /etc/hostsfichiers.

Indépendamment de cela, n'oubliez pas que définir une variable d'environnement ne garantit pas qu'un proxy sera utilisé ou non. Il s’agit simplement d’une information pouvant être utilisée par les programmes qui la prennent en charge.

rozcietrzewiacz
la source
Si wget implémente cela de la même manière que curl - et je suppose que c'est le cas - il n'y a aucune différence s'il s'agit d'une adresse IP ou d'un nom de domaine, car les deux sont traités comme des chaînes - voir github.com/curl/curl/issues/1208
Piotr Dobrogost
12

Ce n’est pas une solution correcte, mais cela pourrait résoudre le problème pour vous. Si vous supposez que tout accès depuis l'extérieur du proxy utilisera des noms DNS et non directement des adresses IP, vous pouvez le définir comme suit:

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 numéro. Si c'est le cas, il doit s'agir d'une adresse IP.

Lars Berntzon
la source
7
C'est une solution très intelligente :) Malheureusement, cela contournera le proxy pour toutes les adresses IP, pas seulement pour les adresses IP locales ... :( N'y a-t-il aucun moyen (en 2018) de spécifier des plages IP ou CIDR dans la variable "noproxy"?
Sorin Postelnicu
Pour le serveur de centre de données, il s'agit d'une astuce très intelligente. A des effets secondaires, mais acceptable.
notes-jj
cela ne fonctionnait pas pour moi-même .. je devais utiliser la solution @iconoclast
Erik
12

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 encore été 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 passés de l'extension de 10.1.{1..255}.{1..255}, que ce soit dans son code ou 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 de ces adresses devrait fonctionner parfaitement pour vous.

J'imagine que la version où 2 octets sont développés ressemblerait à ceci:

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

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

iconoclaste
la source
1
Peut se déplacer en utilisant sed en faisant"export no_proxy=`echo 10.1.1.{1..254},`10.1.1.255"
Cory Ringdahl
Bien ... Je le modifie un peu pour que l'espacement soit cohérent après les virgules, et je vais l'ajouter.
iconoclaste le