Impostare un intervallo di rete nella variabile d'ambiente no_proxy


52

Sono in una rete usando un proxy. Ho macchine che usano molti script qua e là accedendo l'un l'altro su HTTP.

  • La rete è 10.0.0.0/8.
  • Il mio proxy è 10.1.1.1:81, quindi l'ho impostato di conseguenza:

    export http_proxy=http://10.1.1.1:81/
  • Voglio escludere il mio intervallo a cui accedere con il proxy. Ho provato qualsiasi combinazione disponibile.

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

Nessuno dei lavori sopra elencati!

Sto testando wgete cerca sempre di interrogare il proxy, qualunque sia l'indirizzo IP a cui voglio collegarmi.

  • Poiché molti script si trovano ovunque in tutti i sistemi, l' --no-proxyopzione in realtà non è un'opzione. Voglio impostarlo a livello di sistema.

1
È quasi il 2019 e non c'è modo di inserire il CIDR nella no_proxyvariabile d'ambiente? Che diavolo Linus Torvalds !!
7_R3X,

4
@ 7_R3X è GNU wget, quindi mi aspetto che tu voglia maledire Richard Stallman?
Jakub Bochenski,

Risposte:


43

Lo stai guardando nel modo sbagliato. La no_proxyvariabile di ambiente elenca i suffissi di dominio, non i prefissi. Dalla documentazione :

no_proxy: Questa variabile deve contenere un elenco separato da virgole di proxy per le estensioni di dominio per cui non è possibile utilizzare.

Quindi, per gli IP, hai due opzioni:

1) Aggiungi ogni IP per intero:

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

2) Rinomina wgetper wget-originale scrivere uno script wrapper (chiamata wget), che cerca il IP per il dato host di URL, e determina se si deve utilizzare il proxy o no:

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

Grazie mille, ho intenzione di concludere il mio wget (e usare i nomi host invece degli indirizzi IP).
SamK,

9
Avere 255 * 255 indirizzi in problemi di prestazione del rischio no_proxy?
jtpereyda,

@dafrazzman: potrebbe essere. Dopotutto, è grande quasi 800 kilobyte, il che è un po 'estremo per una variabile d'ambiente. Dipende anche dalla dimensione del tuo ambiente. Per questo caso estremo, consiglierei l'approccio wrapper.
Janmoesen,

4
Non aggiungere ogni IP per intero - sarà troppo lungo e non sarai in grado di eseguire alcun comando in bash.
Ross,

5
NON FARE MAI QUELLO, questo genererà qualcosa di troppo lungo per qualsiasi comando e, se lo metti nel /etc/environmentfile, ciò potrebbe danneggiare il tuo server.
Thomas Decaux,

16

info wget dice:

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

Quindi la variabile dovrebbe contenere un elenco di domini , non intervalli IP . Dovrai impostare alias locali adeguati per i tuoi computer locali in /etc/hostsfile.

A parte questo, tenere presente che l'impostazione di una variabile di ambiente non garantisce che un proxy verrà o non verrà utilizzato. È solo un'informazione che può essere utilizzata dai programmi che la supportano.


Se wget lo implementa allo stesso modo di curl - e sospetto che lo sia - allora non c'è differenza se si tratta di indirizzo IP o nome di dominio poiché entrambi sono trattati come stringhe - vedi github.com/curl/curl/issues/1208
Piotr Dobrogost,

12

Non è esattamente una soluzione corretta, ma potrebbe risolvere il problema per te. Se si presume che l'accesso a qualsiasi cosa dall'esterno del proxy utilizzerà nomi DNS e non direttamente indirizzi IP, è possibile impostarlo come:

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

Per quanto ne so, nessun dominio superiore termina con un numero, quindi, se lo fa, deve essere un indirizzo IP.


7
Questa è una soluzione molto intelligente :) Sfortunatamente, questo ignorerà il proxy per qualsiasi IP, non solo per gli IP locali ... :( Non c'è modo (nel 2018) di specificare intervalli IP o CIDR nella variabile "noproxy"?
Sorin Postelnicu,

Per il server del data center questo è un trucco molto intelligente. Ha effetti collaterali, ma accettabili.
notes-jj,

questo non ha funzionato da solo .. ho dovuto usare la soluzione @iconoclast
Erik il

12

Ecco un approccio leggermente più semplice (a una riga) basato sulla soluzione di janmoesen.

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

che è stato ulteriormente migliorato sulla base dell'input di Cory Ringdahl:

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

sed soffoca su tutti gli argomenti passati dall'espansione di 10.1.{1..255}.{1..255}, sia nel suo codice che nel mio. Quindi, se hai davvero bisogno di espandere a 256 * 256 indirizzi IP, potresti essere in grado di adattare ulteriormente l'approccio di Cory Ringdahl, ma se hai semplicemente bisogno di 256 o giù di lì, uno di questi dovrebbe funzionare perfettamente per te.

Immagino che la versione in cui sono espansi 2 ottetti sarebbe simile a questa:

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

ma iTerm mi sta dando errori riguardo a liste di argomenti troppo lunghe, quindi non posso dire con certezza se esiste una soluzione per farlo funzionare ...


1
Puoi andare in giro usando sed facendo"export no_proxy=`echo 10.1.1.{1..254},`10.1.1.255"
Cory Ringdahl il

Bello ... Lo sto modificando un po 'per rendere coerente la spaziatura dopo le virgole e lo aggiungerò.
iconoclasta il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.