Legen Sie einen Netzwerkbereich in der Umgebungsvariablen no_proxy fest

52

Ich bin in einem Netzwerk mit einem Proxy. Ich habe Maschinen, die hier und da viele Skripte verwenden, die über HTTP aufeinander zugreifen.

  • Das Netzwerk ist 10.0.0.0/8.
  • Mein Proxy ist 10.1.1.1:81, also habe ich es entsprechend eingerichtet:

    export http_proxy=http://10.1.1.1:81/
  • Ich möchte meinen eigenen Bereich ausschließen, um mit dem Proxy darauf zugreifen zu können. Ich habe versucht, eine beliebige Kombination zur Verfügung.

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

Keine der oben genannten Arbeiten!

Ich teste mit wgetund es wird immer versucht, den Proxy abzufragen, egal mit welcher IP-Adresse ich mich verbinden möchte.

  • Da viele Skripte überall in allen Systemen liegen, ist die --no-proxyOption eigentlich keine Option. Ich möchte es systemweit einstellen.
SamK
quelle
1
Es ist fast 2019 und keine Möglichkeit, CIDR in no_proxyUmgebungsvariable zu setzen ? Was zum Teufel Linus Torvalds !!
7_R3X
4
@ 7_R3X es ist GNU wget also ich nehme an du wolltest Richard Stallman verfluchen?
Jakub Bochenski

Antworten:

43

Sie sehen es falsch. Die no_proxyUmgebungsvariable listet die Domänensuffixe und nicht die Präfixe auf. Aus der Dokumentation :

no_proxy: Diese Variable sollte eine durch Kommas getrennte Liste von Domain-Endungen enthalten, für die der Proxy nicht verwendet werden sollte.

Für IPs haben Sie also zwei Möglichkeiten:

1) Fügen Sie jede IP vollständig hinzu:

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

2) Umbenennen wgetin wget-originalund Schreiben eines Wrapper-Skripts (aufgerufen wget), das die IP-Adresse des angegebenen URL-Hosts ermittelt und festlegt, ob der Proxy verwendet werden soll oder nicht:

#!/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
quelle
Vielen Dank, ich werde mein wget einpacken (und Hostnamen anstelle von IP-Adressen verwenden).
SamK
9
Treten bei Problemen mit der Risikoleistung von no_proxy 255 * 255 Adressen auf?
Jtpereyda
@dafrazzman: das könnte gut sein. Immerhin ist es fast 800 Kilobyte groß, was für eine Umgebungsvariable etwas extrem ist. Es hängt auch davon ab, wie groß Ihre Umgebung sein kann. Für diesen Extremfall würde ich den Wrapper-Ansatz empfehlen.
Januar
4
Fügen Sie nicht jede IP vollständig hinzu - es wird zu lange dauern und Sie können in bash keine Befehle ausführen.
Ross
5
TUN SIE DAS NIEMALS. Dadurch wird für jeden Befehl etwas zu langes generiert. Wenn Sie dies in eine /etc/environmentDatei einfügen, kann dies Ihren Server beschädigen.
Thomas Decaux
15

info wget sagt:

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

Die Variable sollte daher eine Liste von Domänen enthalten , keine IP-Bereiche . Sie müssen geeignete lokale Aliase für Ihre lokalen Computer in den /etc/hostsDateien einrichten .

Bedenken Sie außerdem, dass das Festlegen einer Umgebungsvariablen nicht garantiert, dass ein Proxy verwendet wird oder nicht. Es ist nur eine Information , die möglicherweise von Programmen verwendet werden , die es unterstützen.

rozcietrzewiacz
quelle
Wenn wget dies genauso implementiert wie curl - und ich vermute, dass dies der Fall ist - dann ist es egal, ob es sich um eine IP-Adresse oder einen Domainnamen handelt, da beide als Zeichenfolgen behandelt werden - siehe github.com/curl/curl/issues/1208
Piotr Dobrogost
12

Nicht genau die richtige Lösung, aber sie könnte das Problem für Sie lösen. Wenn Sie davon ausgehen, dass für den Zugriff von außerhalb des Proxys DNS-Namen und nicht direkt IP-Adressen verwendet werden, können Sie Folgendes festlegen:

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

Soweit ich weiß, endet keine Top-Domain mit einer Nummer. Wenn dies der Fall ist, muss es sich um eine IP-Adresse handeln.

Lars Berntzon
quelle
7
Das ist eine sehr clevere Lösung :) Leider umgeht dies den Proxy für jede IP, nicht nur für lokale IPs ... :( Gibt es (in 2018) keine Möglichkeit, IP-Bereiche oder CIDR in der Variablen "noproxy" anzugeben?
Sorin Postelnicu
Für Data Center Server ist dies ein sehr cleverer Trick. Hat Nebenwirkung, ist aber akzeptabel.
Notizen-jj
Dies funktionierte nicht für mich selbst .. musste @iconoclast Lösung verwenden
Erik
12

Hier ist ein etwas einfacherer (einzeiliger) Ansatz, der auf der Lösung von janmoesen basiert.

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

was auf der Grundlage von Cory Ringdahls Input weiter verbessert wurde:

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

sed verschluckt sich an allen Argumenten, die sich aus der Erweiterung von ergeben haben 10.1.{1..255}.{1..255}, entweder in seinem Code oder in meinem. Wenn Sie also wirklich auf 256 * 256 IP-Adressen erweitern müssen, können Sie möglicherweise den Ansatz von Cory Ringdahl weiter anpassen. Wenn Sie jedoch nur 256 oder so benötigen, sollte einer der beiden für Sie perfekt funktionieren.

Ich vermute, die Version, in der 2 Oktette erweitert sind, würde ungefähr so ​​aussehen:

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

Aber iTerm gibt mir Fehler wegen zu langer Argumentlisten, daher kann ich nicht sicher sagen, ob es eine Lösung gibt, mit der das funktioniert ...

Bilderstürmer
quelle
1
Kann mit sed "export no_proxy=`echo 10.1.1.{1..254},`10.1.1.255"
umgehen,
Schön ... Ich optimiere es ein wenig, um den Abstand nach dem Komma zu vereinheitlichen, und ich füge ihn hinzu.
Iconoclast