no_proxy 환경 변수에서 네트워크 범위 설정


52

프록시를 사용하는 네트워크에 있습니다. 여기에 많은 스크립트를 사용하는 컴퓨터가 있으며 HTTP를 통해 서로 액세스합니다.

  • 네트워크는 10.0.0.0/8입니다.
  • 내 프록시는 10.1.1.1:81이므로 적절하게 설정했습니다.

    export http_proxy=http://10.1.1.1:81/
  • 프록시로 액세스 할 자신의 범위를 제외하고 싶습니다. 가능한 조합을 시도했습니다.

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

위의 작업 중 어느 것도!

테스트 wget중이며 연결하려는 IP 주소에 관계없이 항상 프록시를 쿼리하려고합니다.

  • 많은 스크립트가 모든 시스템에 어디에나 있기 때문에 --no-proxy옵션은 실제로 옵션이 아닙니다. 시스템을 넓게 설정하고 싶습니다.

1
거의 2019 년이며 CIDR을 no_proxy환경 변수 에 넣을 방법이 없습니까? Linus Torvalds는 무엇입니까 !!
7_R3X

4
@ 7_R3X GNU wget이므로 Richard Stallman을 저주하고 싶습니까?
Jakub Bochenski

답변:


43

당신은 그것을 잘못보고 있습니다. no_proxy환경 변수는 도메인 접미사가 아닌 접두사를 나열합니다. 에서 문서 :

no_proxy:이 변수에는 쉼표로 구분 된 도메인 확장 목록 프록시가 포함되어 있지 않아야합니다.

따라서 IP의 경우 두 가지 옵션이 있습니다.

1) 각 IP를 완전히 추가하십시오.

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

2) 지정된 URL 호스트의 IP를 조회하고 프록시를 사용해야하는지 여부를 결정 하는 랩퍼 스크립트 ( )의 이름 wget을 바꾸고 wget-original작성하십시오 wget.

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

고맙습니다. wget을 래핑하고 IP 주소 대신 호스트 이름을 사용합니다.
SamK

9
no_proxy 위험 성능 문제에 255 * 255 주소가 있습니까?
jtpereyda

@ dafrazzman : 그럴 수 있습니다. 결국 800 킬로바이트에 달하는 환경 변수는 다소 극단적입니다. 또한 환경의 규모에 따라 다릅니다. 이 극단적 인 경우 래퍼 방식을 권장합니다.
janmoesen 2012 년

4
각 IP를 완전히 추가하지 마십시오. 너무 길어서 bash에서 어떤 명령도 실행할 수 없습니다.
Ross

5
절대로 그렇게하지 마십시오. 명령에 비해 시간이 너무 오래 걸리므로 /etc/environment파일에 넣으면 서버가 손상 될 수 있습니다.
Thomas Decaux

15

info wget 말한다 :

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

따라서 변수에는 IP 범위가 아닌 도메인 목록이 포함되어야합니다 . 파일 에서 로컬 컴퓨터에 적합한 로컬 별칭을 설정해야합니다 ./etc/hosts

이 외에도 환경 변수를 설정 한다고해서 프록시 사용 여부가 보장 되는 것은 아닙니다 . 정보 를 지원하는 프로그램에서 사용할 있는 정보 일뿐 입니다.


만약 wgetcurl 과 같은 방식으로 그것을 구현 한다면 – 그것이 의심되는 경우 – 둘 다 문자열로 취급되는 IP 주소 또는 도메인 이름이라면 차이가 없습니다 – github.com/curl/curl/issues/1208
Piotr Dobrogost

12

정확한 해결책은 아니지만 문제를 해결할 수 있습니다. 프록시 외부에서 액세스하는 것이 DNS 이름을 사용하고 IP 주소를 직접 사용하지 않는다고 가정하는 경우 다음과 같이 설정할 수 있습니다.

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

내가 아는 한, 최상위 도메인은 숫자로 끝나지 않으므로 IP 주소 여야합니다.


7
즉 아주 똑똑한 솔루션 : 불행하게도,이 (2018)뿐만 아니라 지역 IP에 대해 ... 방법은 :( 없다 어떤 IP의 프록시를 우회 것 "NOPROXY"변수에 IP 범위 또는 CIDR을 지정할 수있어?
Sorin Postelnicu

데이터 센터 서버의 경우 이것은 매우 영리한 트릭입니다. 부작용이 있지만 수용 가능합니다.
notes-jj

이것은 나 자신을 위해 작동하지 않았다 .. @iconoclast 솔루션을 사용해야했다
에릭

12

janmoesen의 솔루션을 기반으로하는 약간 더 간단한 (한 줄) 접근 방식이 있습니다.

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

이는 Cory Ringdahl의 입력을 기반으로 추가 개선되었습니다.

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

sed 10.1.{1..255}.{1..255}는 그의 코드 나 광산 에서의 확장으로 전달 된 모든 주장에 질식했다 . 따라서 실제로 256 * 256 IP 주소로 확장 해야하는 경우 Cory Ringdahl의 접근 방식을 추가로 조정할 수 있지만 256 정도만 필요한 경우 두 가지 중 하나가 완벽하게 작동합니다.

2 옥텟이 확장 된 버전은 다음과 같습니다.

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

그러나 iTerm은 인수 목록이 너무 길다는 오류를 표시 하므로이 작업을 수행 할 솔루션이 있는지 확실하게 말할 수 없습니다 ...


1
sed를 사용하여 돌아 다닐 수 있습니다"export no_proxy=`echo 10.1.1.{1..254},`10.1.1.255"
Cory Ringdahl

니스 ... 쉼표 뒤에 공백이 일관되게하기 위해 약간 조정하고 추가하겠습니다.
iconoclast
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.