Establecer un rango de red en la variable de entorno no_proxy

52

Estoy en una red usando un proxy. Tengo máquinas que utilizan muchos scripts aquí y allá accediendo entre sí a través de HTTP.

  • La red es 10.0.0.0/8.
  • Mi proxy es 10.1.1.1:81, así que lo configuré en consecuencia:

    export http_proxy=http://10.1.1.1:81/
  • Quiero excluir mi propio rango para acceder con el proxy. Intenté cualquier combinación disponible.

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

Ninguno de los anteriores funciona!

Estoy probando wgety siempre intenta consultar el proxy, sea cual sea la dirección IP a la que me quiero conectar.

  • Dado que muchos scripts se encuentran en todas partes en todos los sistemas, la --no-proxyopción no es realmente una opción. Quiero configurarlo en todo el sistema.
SamK
fuente
1
¿Es casi 2019 y no hay forma de poner CIDR en no_proxyvariable de entorno? ¡Qué demonios Linus Torvalds!
7_R3X
44
@ 7_R3X es GNU wget, así que espero que quisieras maldecir a Richard Stallman.
Jakub Bochenski

Respuestas:

43

Lo estás mirando de la manera incorrecta. La no_proxyvariable de entorno enumera los sufijos de dominio, no los prefijos. De la documentación :

no_proxy: Esta variable debe contener una lista separada por comas de extensiones de dominio que no se debe usar.

Entonces, para IP, tiene dos opciones:

1) Agregue cada IP en su totalidad:

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

2) Cambiar el nombre wgetde wget-originaly escribir un guión envoltorio (llamada wget) que busca la IP para el host de URL dado, y determina si se debe utilizar el 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;
janmoesen
fuente
Muchas gracias, voy a ajustar mi wget (y usaré nombres de host en lugar de direcciones IP).
SamK
99
¿Tener 255 * 255 direcciones en problemas de rendimiento de riesgo no_proxy?
jtpereyda
@dafrazzman: eso bien podría ser. Después de todo, tiene casi 800 kilobytes de tamaño, lo cual es algo extremo para una variable de entorno. También depende de qué tan grande puede ser su entorno. Para este caso extremo, recomendaría el enfoque de envoltura.
Janmoesen
44
No agregue cada IP por completo; será demasiado largo y no podrá ejecutar ningún comando en bash.
Ross
55
NUNCA HAGAS ESO, esto generará algo demasiado largo para cualquier comando y, si lo pones en un /etc/environmentarchivo, podría dañar tu servidor.
Thomas Decaux el
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.

Por lo tanto, la variable debe contener una lista de dominios , no rangos de IP . Deberá configurar alias locales adecuados para sus máquinas locales en /etc/hostsarchivo (s).

Aparte de esto, tenga en cuenta que establecer una variable de entorno no garantiza que se utilizará o no un proxy. Es solo una información que pueden usar los programas que la admiten.

rozcietrzewiacz
fuente
Si wget implementa esto de la misma manera que curl , y sospecho que lo hace, entonces no hay diferencia si se trata de una dirección IP o un nombre de dominio, ya que ambos se tratan como cadenas (consulte github.com/curl/curl/issues/1208
Piotr Dobrogost
12

No es exactamente una solución correcta, pero podría resolver el problema por usted. Si asume que el acceso a cualquier cosa desde el exterior del proxy utilizará nombres DNS y no directamente direcciones IP, puede configurarlo como:

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

Hasta donde sé, ningún dominio superior termina con un número, por lo que si lo hace, debe ser una dirección IP.

Lars Berntzon
fuente
77
Eso es una solución muy inteligente :) Por desgracia, este pasará por alto el proxy para cualquier IP, no sólo para las direcciones IP locales ... :( ¿No hay manera (en 2018) para especificar rangos de IP o CIDR en la variable "noproxy"?
Sorin Postelnicu
Para el servidor del centro de datos, este es un truco muy inteligente. Tiene efecto secundario, pero aceptable.
notes-jj
esto no funcionó para mí ... tuve que usar la solución @iconoclast
Erik
12

Aquí hay un enfoque un poco más simple (una línea) basado en la solución de janmoesen.

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

que se ha mejorado aún más según la aportación de Cory Ringdahl:

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

sed se ahoga en todos los argumentos pasados ​​de la expansión de 10.1.{1..255}.{1..255}, ya sea en su código o en el mío. Entonces, si realmente necesita expandirse a 256 * 256 direcciones IP, es posible que pueda adaptar aún más el enfoque de Cory Ringdahl, pero si simplemente necesita 256 o más, cualquiera de estos debería funcionar perfectamente para usted.

Supongo que la versión donde se expanden 2 octetos se vería así:

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

pero iTerm me está dando errores acerca de que las listas de argumentos son demasiado largas, por lo que no puedo decir con certeza si hay una solución para que esto funcione ...

iconoclasta
fuente
1
Puede moverse usando sed haciendo"export no_proxy=`echo 10.1.1.{1..254},`10.1.1.255"
Cory Ringdahl
Bien ... Lo estoy modificando un poco para que el espacio sea consistente después de las comas, y lo agregaré.
iconoclasta