Ustaw zakres sieci w zmiennej środowiskowej no_proxy


52

Jestem w sieci za pomocą proxy. Mam maszyny używające tu i ówdzie wielu skryptów, uzyskujących dostęp do siebie przez HTTP.

  • Sieć to 10.0.0.0/8.
  • Mój serwer proxy to 10.1.1.1:81, więc skonfigurowałem go odpowiednio:

    export http_proxy=http://10.1.1.1:81/
  • Chcę wykluczyć mój własny zakres, do którego można uzyskać dostęp za pośrednictwem serwera proxy. Próbowałem dowolnej dostępnej kombinacji.

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

Żadna z powyższych nie działa!

Testuję wgeti zawsze próbuje wysłać zapytanie do serwera proxy, bez względu na adres IP, z którym chcę się połączyć.

  • Ponieważ wiele skryptów znajduje się wszędzie we wszystkich systemach, --no-proxyopcja tak naprawdę nie jest opcją. Chcę ustawić go na cały system.

1
Jest prawie 2019 i nie ma sposobu, aby umieścić CIDR w no_proxyzmiennej środowiskowej? Co do cholery Linus Torvalds !!
7_R3X,

4
@ 7_R3X to wget GNU, więc spodziewam się, że chciałeś przekląć Richarda Stallmana?
Jakub Bochenski

Odpowiedzi:


43

Patrzysz na to niewłaściwie. no_proxyZmienna zawiera listę przyrostków domen, a nie prefiksów. Z dokumentacji :

no_proxy: Ta zmienna powinna zawierać rozdzieloną przecinkami listę rozszerzeń domen, do których nie należy używać proxy .

W przypadku adresów IP masz dwie opcje:

1) Dodaj każdy adres IP w całości:

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

2) Zmiana nazwy wgetna wget-originali napisać skrypt otoki (zwany wget), który wyszukuje IP dla hosta Podany URL, a określa, czy powinna ona korzystać z serwera proxy, czy nie:

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

Dziękuję bardzo, mam zamiar owinąć mój wget (i używać nazw hostów zamiast adresów IP).
SamK,

9
Czy posiadanie 255 * 255 adresów w problemach z wydajnością no_proxy?
jtpereyda

@dafrazzman: tak może być. W końcu ma prawie 800 kilobajtów, co jest nieco ekstremalne dla zmiennej środowiskowej. To zależy również od tego, jak duże może być twoje środowisko. W tym ekstremalnym przypadku poleciłbym podejście otoki.
janmoesen

4
Nie dodawaj każdego adresu IP w całości - będzie on zbyt długi i nie będziesz mógł wykonywać żadnych poleceń w bash.
Ross

5
NIGDY NIE Rób tego, spowoduje to wygenerowanie czegoś za długiego dla dowolnego polecenia, a jeśli umieścisz to w /etc/environmentpliku, może to spowodować uszkodzenie serwera.
Thomas Decaux,

15

info wget mówi:

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

Zatem zmienna powinna zawierać listę domen , a nie zakresy adresów IP . Musisz ustawić odpowiednie lokalne aliasy dla swoich lokalnych komputerów w /etc/hostsplikach.

Oprócz tego należy pamiętać, że ustawienie zmiennej środowiskowej nie gwarantuje, że serwer proxy będzie używany lub nie będzie używany. To tylko informacja, z której mogą korzystać programy, które ją obsługują.


Jeśli wget implementuje to w taki sam sposób jak curl - i podejrzewam, że tak - nie ma różnicy, czy to adres IP czy nazwa domeny, ponieważ oba są traktowane jako ciągi - patrz github.com/curl/curl/issues/1208
Piotr Dobrogost,

12

Nie do końca poprawne rozwiązanie, ale może rozwiązać problem. Jeśli zakładasz, że dostęp do czegokolwiek z zewnątrz serwera proxy będzie korzystał z nazw DNS, a nie bezpośrednio z adresów IP, możesz to ustawić w następujący sposób:

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

O ile mi wiadomo, żadna najwyższa domena nie kończy się na numerze, więc jeśli tak, musi to być adres IP.


7
To bardzo sprytne rozwiązanie :) Niestety, obejdzie to proxy dla dowolnego adresu IP, nie tylko dla lokalnych adresów IP ... :( Czy nie ma możliwości (w 2018 r.), Aby określić zakresy adresów IP lub CIDR w zmiennej „noproxy”?
Sorin Postelnicu

Dla serwera centrum danych jest to bardzo sprytna sztuczka. Ma efekt uboczny, ale akceptowalny.
notes-jj

to nie działało dla mnie .. musiałem użyć rozwiązania @iconoclast
Erik

12

Oto nieco prostsze (jednowierszowe) podejście oparte na rozwiązaniu janmoesen.

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

który został dodatkowo ulepszony w oparciu o wkład Cory Ringdahla:

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

sed udławił się wszystkimi argumentami przekazanymi z rozszerzenia 10.1.{1..255}.{1..255}, zarówno w jego kodzie, jak i moim. Więc jeśli naprawdę potrzebujesz rozszerzyć do 256 * 256 adresów IP, możesz być w stanie dodatkowo dostosować podejście Cory Ringdahla, ale jeśli potrzebujesz tylko 256, każde z nich powinno działać idealnie dla Ciebie.

Zgaduję, że wersja z rozszerzonymi 2 oktetami wyglądałaby mniej więcej tak:

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

ale iTerm podaje mi błędy dotyczące zbyt długich list argumentów, więc nie jestem pewien, czy istnieje rozwiązanie, które sprawi, że to zadziała ...


1
Można się poruszać za pomocą sed, wykonując"export no_proxy=`echo 10.1.1.{1..254},`10.1.1.255"
Cory Ringdahl

Fajnie ... Poprawiam to trochę, aby odstępy były spójne po przecinkach, i dodam to.
iconoclast
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.