说实在话,这个场景非常怪异,客户在 linux 下要动态根据 url 选择代理:
看图,中间的是前端代理,地址是 192.168.1.1:8080,然后客户设置使用这个代理
1export http_proxy=http://192.168.1.1:8080
2export https_proxy=http://192.168.1.1:8080
然后对应后端有三个代理,两个 http 代理,一个 socks 代理
1http 192.168.2.1:3128
2socks 192.168.2.2:1080
3http 192.168.2.3:3128
我们要根据客户的请求 URL 来决定具体要使用后端的哪个代理
这个如果在浏览器上设置非常容易,设置 PAC 即可。但是偏偏客户端不是浏览器,而是一个程序,那么麻烦就来了。怎么设置呢?
步骤很简单:
一、安装 pacproxy
网址:https://github.com/williambailey/pacproxy
1wget https://github.com/williambailey/pacproxy/releases/download/v.2.0.4/pacproxy_2.0.4_linux_amd64.tar.gz
2tar zxvf pacproxy_2.0.4_linux_amd64.tar.gz
拷出来 pacproxy 备用
二、生成配置文件
最主要的就是 PAC 文件的生成
我们给个例子:
1cat << EOF >> pac
2function FindProxyForURL(url, host)
3{
4 if (host == "www.baidu.com") {
5 return "PROXY 192.168.2.1:3128";
6 }
7 else if (host == "www.sina.com.cn") {
8 return "SOCKS 192.168.2.2:1080";
9 }
10 else if (host == "www.sohu.com") {
11 return "SOCKS 192.168.2.3:1080";
12 }
13 else {
14 return "DIRECT";
15 }
16}
17EOF
其实 PAC 文件的内容就是一段 javascript,用来返回代理的地址
运行并测试:
1pacproxy -c pac -l 0.0.0.0:8080 -v
2
3
4export http_proxy=http://192.168.1.1:8080
5export https_proxy=http://192.168.1.1:8080
6curl -I www.baidu.com
这样就在 Linux 搭建了一个动态的 PAC 代理
PAC文件的参考资料: