说实在话,这个场景非常怪异,客户在 linux 下要动态根据 url 选择代理:

image-20211116132624536

看图,中间的是前端代理,地址是 192.168.1.1:8080,然后客户设置使用这个代理

export http_proxy=http://192.168.1.1:8080
export https_proxy=http://192.168.1.1:8080

然后对应后端有三个代理,两个 http 代理,一个 socks 代理

http  192.168.2.1:3128
socks 192.168.2.2:1080
http  192.168.2.3:3128

我们要根据客户的请求 URL 来决定具体要使用后端的哪个代理

这个如果在浏览器上设置非常容易,设置 PAC 即可。但是偏偏客户端不是浏览器,而是一个程序,那么麻烦就来了。怎么设置呢?

步骤很简单:

一、安装 pacproxy

网址:https://github.com/williambailey/pacproxy

wget https://github.com/williambailey/pacproxy/releases/download/v.2.0.4/pacproxy_2.0.4_linux_amd64.tar.gz
tar zxvf pacproxy_2.0.4_linux_amd64.tar.gz

拷出来 pacproxy 备用

二、生成配置文件

最主要的就是 PAC 文件的生成

我们给个例子:

cat << EOF >> pac
function FindProxyForURL(url, host)
{
    if (host == "www.baidu.com") {
        return "PROXY 192.168.2.1:3128";
    }
    else if (host == "www.sina.com.cn") {
        return "SOCKS 192.168.2.2:1080";
    }
    else if (host == "www.sohu.com") {
        return "SOCKS 192.168.2.3:1080";
    }    
    else {
        return "DIRECT";
    }
}
EOF

其实 PAC 文件的内容就是一段 javascript,用来返回代理的地址

运行并测试:

pacproxy -c pac -l 0.0.0.0:8080 -v


export http_proxy=http://192.168.1.1:8080
export https_proxy=http://192.168.1.1:8080
curl -I www.baidu.com

这样就在 Linux 搭建了一个动态的 PAC 代理

PAC文件的参考资料: