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環境変数に入れる方法はありませんか?なんてライナス・トーバルズ!!
7_R3X

4
@ 7_R3XそれはGNU wgetですので、リチャード・ストールマンを呪いたいと思っていますか?
ヤクブボチェンスキ

回答:


43

あなたはそれを間違った方法で見ています。no_proxy環境変数は、ドメインサフィックスではなく、接頭辞を示しています。ドキュメントから:

no_proxy:この変数には、プロキシを使用しないドメイン拡張子のコンマ区切りリストを含める必要があります。

したがって、IPには2つのオプションがあります。

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キロバイトの大きさであり、環境変数としてはいくぶん極端です。また、環境の大きさにも依存します。この極端な場合には、ラッパーアプローチをお勧めします。
ジャンモエセン

4
各IPを完全に追加しないでください-長すぎるため、bashでコマンドを実行できません。
ロス

5
絶対にしないでください。これにより、コマンドに対して長すぎるものが生成され/etc/environment、これをファイルに入れると、サーバーが破損する可能性があります。
トーマスデカー

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ファイル内のローカルマシンに適切なローカルエイリアスを設定する必要があります。

これとは別に、環境変数を設定しても、プロキシが使用されるかどうかは保証されません。これは、それをサポートするプログラムによって使用される可能性のある単なる情報です。


場合はwgetの実装、これは同じようカールがない-と私はそれがない疑いがある-参照-の両方を文字列として扱われて、それがIPアドレスまたはドメイン名であるならば、違いはありませんgithub.com/curl/curl/issues/1208を
ピョートルドブロゴスト

12

正確な解決策ではありませんが、問題を解決できる可能性があります。プロキシの外部から何かにアクセスするときに、直接IPアドレスを使用するのではなく、DNS名を使用すると想定する場合は、次のように設定できます。

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

私の知る限り、最上位のドメインは数字で終わっていないため、数字で終わる場合はIPアドレスである必要があります。


7
それは非常にスマートなソリューションです:)残念ながら、これはローカルIPだけでなく、すべてのIPのプロキシをバイパスします... :(「2018年に」「noproxy」変数にIP範囲またはCIDRを指定する方法はありませんか?
ソリンポステルニクス

データセンターサーバーの場合、これは非常に巧妙なトリックです。副作用がありますが、許容できます。
notes-jj

これは自分ではうまくいきませんでした.. @iconoclastソリューションを使用する必要がありました
Erik

12

janmoesenのソリューションに基づいた、少し単純な(1行の)アプローチを示します。

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.