pac文件提取服务器,[工具使用] privoxy 实现 PAC 请求过滤
在 ubuntu 下使用 ss 下是不能夠使用 PAC 文件進行過濾的。所有的網絡請求都會通過 ss 轉向服務器,導致有些不必要的網站訪問速度過慢。
對于這個問題官方也不想解決,自行查看 github.com 的 issue 717。
為了處理這個問題,現在使用 privoxy 搭配 ss 實現 PAC 文件所實現的功能。
雖然網絡上有一些更優雅的方式解決,但是本人未實驗成功。我最先使用這個笨方式成功了,能用了,所以我不再嘗試其他方式。此處的記錄僅為了以后我需要配置時能迅速配置。
整個思路是將所有請求專項 privoxy,由 privoxy 將那些需要轉向 ss 的網絡請求轉向 ss,不需要的網絡請求直接發出。
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 。
在啟動 sslocal 的時候會報錯,因為這都是 python 代碼,能夠直接看到源碼,也無需編譯,所以很容易解決。搜索可以找到答案。就是把出錯文件中的 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 文件,打開這個文件,是可以理解的。里面是 js 代碼,在文件末尾有一個函數 testHost,用于判斷是否此 host 是使用 proxy 或是直連 DIRECT。proxy 就是生成 pac 文件時候的 SOCKS5 127.0.0.1:1080。
4. 為 privoxy 配置轉發規則
在 /etc/privoxy/config 中搜索 listen-address 可以查到語句如下。
listen-address 127.0.0.1:8118
listen-address [::1]:8118
所以知道 privoxy 監聽的端口是 8118 。
在 /etc/privoxy/config 中搜索 forward-socks4 可以查到相關的轉發規則配置語法。
使用我們獲得的語法,可以將 pac 文件中的所記錄的域名使用 pac 文件中的testHost函數配置成 privoxy 的轉發規則。
將 pac 文件后綴改為 js,并在底部添加如下代碼,將 pac 內部的轉發規則輸出 privoxy 轉發規則至文件,隨后將此文件中的內容 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 監聽的端口,表示遇到這個域名將其轉發到 ss 。
5. 啟動
在 .bashrc 或其他 rc 文件中添加以下語句。
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
當打開 Terminal 的時候就會自動啟動 privoxy 與 sslocal 。當然,我希望能夠在系統 boot up 過程中自動完成以上操作,但是失敗了,sslocal 無法正常開啟。
以上就可以在 shell 中使用 privoxy 與 sslocal 的轉發。
在 Setting-Network 中配置 NetProxy 為 Manual,并設置 4 條規則都為 127.0.0.1:8118。這一步實現全局的網絡請求轉發配置,即在瀏覽器中可以用以上 privoxy 與 sslocal 的轉發服務。
以上在 .bashrc 文件中添加這些內容會導致打開 Terminal 都需要因為 sudo 輸入密碼(頻率由 sudo 密碼記憶時間決定),這麻煩。為了解決這個問題,可以寫一個簡單的 python 腳本,在 python 腳本中判斷 privoxy 與 sslocal 是否啟動,如果已經啟動則無需再次啟動。代碼如下。
#!/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 時需要將配置中的 Local Server Type 選定為 HTTP(S),這才能正常使用 Chome(chromium) 瀏覽器,因為這瀏覽器不像 Firefox 是不可以配置 proxy 的。(僅在此記錄,防止以后配置浪費時間。)
總結
以上是生活随笔為你收集整理的pac文件提取服务器,[工具使用] privoxy 实现 PAC 请求过滤的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上网行为管理设备网桥部署方式
- 下一篇: ArrayList类线程不安全的解决方法