pac文件提取服务器,[工具使用] privoxy 实现 PAC 请求过滤
在 ubuntu 下使用 ss 下是不能夠使用 PAC 文件進(jìn)行過(guò)濾的。所有的網(wǎng)絡(luò)請(qǐng)求都會(huì)通過(guò) ss 轉(zhuǎn)向服務(wù)器,導(dǎo)致有些不必要的網(wǎng)站訪(fǎng)問(wèn)速度過(guò)慢。
對(duì)于這個(gè)問(wèn)題官方也不想解決,自行查看 github.com 的 issue 717。
為了處理這個(gè)問(wèn)題,現(xiàn)在使用 privoxy 搭配 ss 實(shí)現(xiàn) PAC 文件所實(shí)現(xiàn)的功能。
雖然網(wǎng)絡(luò)上有一些更優(yōu)雅的方式解決,但是本人未實(shí)驗(yàn)成功。我最先使用這個(gè)笨方式成功了,能用了,所以我不再?lài)L試其他方式。此處的記錄僅為了以后我需要配置時(shí)能迅速配置。
整個(gè)思路是將所有請(qǐng)求專(zhuān)項(xiàng) privoxy,由 privoxy 將那些需要轉(zhuǎn)向 ss 的網(wǎng)絡(luò)請(qǐng)求轉(zhuǎn)向 ss,不需要的網(wǎng)絡(luò)請(qǐng)求直接發(fā)出。
1. 安裝 privoxy
自行查找如何安裝 privoxy 。
2. 安裝 sslocal
sudo apt-get update && sudo apt-get install python-gevent python-pip -y && sudo pip install xxx
配置 config 文件 /etc/ss/config.json 。
在啟動(dòng) sslocal 的時(shí)候會(huì)報(bào)錯(cuò),因?yàn)檫@都是 python 代碼,能夠直接看到源碼,也無(wú)需編譯,所以很容易解決。搜索可以找到答案。就是把出錯(cuò)文件中的 libcrypto 失效的變量 EVP_CIPHER_CTX_cleanup 改成 EVP_CIPHER_CTX_reset 。
3. 獲得 pac 文件
sudo pip install genpac
sudo genpac --proxy="SOCKS5 127.0.0.1:1080" -o autoproxy.pac --gfwlist-url="https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt"
生成了 autoproxy.pac 文件,打開(kāi)這個(gè)文件,是可以理解的。里面是 js 代碼,在文件末尾有一個(gè)函數(shù) testHost,用于判斷是否此 host 是使用 proxy 或是直連 DIRECT。proxy 就是生成 pac 文件時(shí)候的 SOCKS5 127.0.0.1:1080。
4. 為 privoxy 配置轉(zhuǎn)發(fā)規(guī)則
在 /etc/privoxy/config 中搜索 listen-address 可以查到語(yǔ)句如下。
listen-address 127.0.0.1:8118
listen-address [::1]:8118
所以知道 privoxy 監(jiān)聽(tīng)的端口是 8118 。
在 /etc/privoxy/config 中搜索 forward-socks4 可以查到相關(guān)的轉(zhuǎn)發(fā)規(guī)則配置語(yǔ)法。
使用我們獲得的語(yǔ)法,可以將 pac 文件中的所記錄的域名使用 pac 文件中的testHost函數(shù)配置成 privoxy 的轉(zhuǎn)發(fā)規(guī)則。
將 pac 文件后綴改為 js,并在底部添加如下代碼,將 pac 內(nèi)部的轉(zhuǎn)發(fā)規(guī)則輸出 privoxy 轉(zhuǎn)發(fā)規(guī)則至文件,隨后將此文件中的內(nèi)容 append 到 /etc/privoxy/config 。
var index = 1;
var str = "";
for (var i = 0; i < rules[index].length; i++){
for (var j = 0; j < rules[index][i].length; j++) {
lastRule = rules[index][i][j];
if(FindProxyForURL("", lastRule)=="DIRECT"){
str += "forward ." + lastRule + " .\n";
} else {
str += "forward-socks5 ." + lastRule + " 127.0.0.1:1080 .\n";
}
}
}
fs = require('fs');
fs.writeFile('rules', str);
127.0.0.1:1080 的 1080 是 ss 監(jiān)聽(tīng)的端口,表示遇到這個(gè)域名將其轉(zhuǎn)發(fā)到 ss 。
5. 啟動(dòng)
在 .bashrc 或其他 rc 文件中添加以下語(yǔ)句。
export http_proxy="127.0.0.1:8118"
export https_proxy="127.0.0.1:8118"
sudo /usr/local/bin/sslocal -c /etc/ss/config.json -d start
sudo service privoxy start
當(dāng)打開(kāi) Terminal 的時(shí)候就會(huì)自動(dòng)啟動(dòng) privoxy 與 sslocal 。當(dāng)然,我希望能夠在系統(tǒng) boot up 過(guò)程中自動(dòng)完成以上操作,但是失敗了,sslocal 無(wú)法正常開(kāi)啟。
以上就可以在 shell 中使用 privoxy 與 sslocal 的轉(zhuǎn)發(fā)。
在 Setting-Network 中配置 NetProxy 為 Manual,并設(shè)置 4 條規(guī)則都為 127.0.0.1:8118。這一步實(shí)現(xiàn)全局的網(wǎng)絡(luò)請(qǐng)求轉(zhuǎn)發(fā)配置,即在瀏覽器中可以用以上 privoxy 與 sslocal 的轉(zhuǎn)發(fā)服務(wù)。
以上在 .bashrc 文件中添加這些內(nèi)容會(huì)導(dǎo)致打開(kāi) Terminal 都需要因?yàn)?sudo 輸入密碼(頻率由 sudo 密碼記憶時(shí)間決定),這麻煩。為了解決這個(gè)問(wèn)題,可以寫(xiě)一個(gè)簡(jiǎn)單的 python 腳本,在 python 腳本中判斷 privoxy 與 sslocal 是否啟動(dòng),如果已經(jīng)啟動(dòng)則無(wú)需再次啟動(dòng)。代碼如下。
#!/usr/bin/python
import subprocess
import os
# export http_proxy="127.0.0.1:8118"
# export https_proxy="127.0.0.1:8118"
os.system("export http_proxy=\"127.0.0.1:8118\"")
os.system("export https_proxy=\"127.0.0.1:8118\"")
out = subprocess.check_output("ps -ef | grep sslocal", shell=True)
out_str = out.decode()
if "/usr/local/bin/sslocal" not in out_str:
os.system("sudo /usr/local/bin/sslocal -c /etc/ss/config.json -d start")
out = subprocess.check_output("ps -ef | grep privoxy", shell=True)
out_str = out.decode()
if "/usr/sbin/privoxy" not in out_str:
os.system("sudo service privoxy start")
一般在 ubuntu 下使用 ss-qt,在 Software 中搜索即可找到并安裝,理論上它是可以替換 sslocal 的,在使用 ss-qt 時(shí)需要將配置中的 Local Server Type 選定為 HTTP(S),這才能正常使用 Chome(chromium) 瀏覽器,因?yàn)檫@瀏覽器不像 Firefox 是不可以配置 proxy 的。(僅在此記錄,防止以后配置浪費(fèi)時(shí)間。)
總結(jié)
以上是生活随笔為你收集整理的pac文件提取服务器,[工具使用] privoxy 实现 PAC 请求过滤的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 上网行为管理设备网桥部署方式
- 下一篇: ArrayList类线程不安全的解决方法