在 no_proxy 环境变量中设置网络范围

在 no_proxy 环境变量中设置网络范围

我在使用代理的网络中。我的机器到处使用大量脚本,通过 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

你看问题的方式是错误的。环境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),用于查找给定 URL 主机的 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;

答案2

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

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

答案3

不完全是正确的解决方案,但它可能会为您解决问题。如果您假设从代理外部访问任何内容将使用 DNS 名称而不是直接使用 IP 地址,则可以将其设置为:

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

据我所知,没有顶级域名以数字结尾,所以如果有的话,它一定是一个IP地址。

答案4

no_proxy似乎与至少两个字符的主机的尾部部分相匹配,因此no_proxy包含 ipv4 的 100 个尾部部分的设置将跳过任何 ipv4 url

printf -v no_proxy '%s,' {10..99}
export no_proxy=".0,.1,.2,.3,.4,.5,.6,.7,.8,.9,$no_proxy"
curl -v http://any-ip/

相关内容