在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,所以我希望您想诅咒Richard Stallman?
Jakub Bochenski

Answers:


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)重命名wgetwget-original写一个包装脚本(所谓wget)是查找IP指定网址的主机,并确定它是否应该使用代理服务器或不:

#!/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 2011年

9
no_proxy中是否有255 * 255个地址会导致性能问题?
jtpereyda

@dafrazzman:很有可能。毕竟,它的大小将近800 KB,对于环境变量而言,这有些极端。它还取决于您的环境可以有多大。对于这种极端情况,我建议使用包装方法。
janmoesen

4
不要完全添加每个IP,因为它太长了,您将无法在bash中执行任何命令。
罗斯

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文件中为本地计算机设置适当的本地别名。

除此之外,请记住,设置环境变量并不能保证将使用或不使用代理。这仅仅是一个信息可以通过支持它的程序中使用。


如果wget的实现方式与curl的实现方式相同(我怀疑是这样),则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
这是一个非常聪明的解决方案:)不幸的是,这将绕过任何IP的代理,而不仅仅是本地IP ...:((在2018年,没有办法在“ noproxy”变量中指定IP范围或CIDR吗?
Sorin Postelnicu

对于数据中心服务器,这是一个非常聪明的技巧。有副作用,但可以接受。
notes-jj

这对我自己不起作用..必须使用@iconoclast解决方案
Erik

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"

s扼杀了扩展中通过的所有参数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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.