polipo/privoxy 實現 Linux 系統全域性/自動代理

迪斯馬斯克發表於2019-04-05

前言

作業系統為 Ubuntu。
客戶端代理軟體為 Python 版本 Shadow 和諧 socks 自帶的 sslocal。

SS 安裝和配置過程不再贅述。預設本地埠 1080,這裡改成了 1081

sslocal 是 socks5 代理,需要一個軟體進行 socks5 和 HTTP 的轉換。
下面介紹 polipoprivoxy 兩種。

polipo 貌似只能全域性代理,privoxy 全域性/自動兩種代理方式都可以實現。

全域性代理下,訪問 localhost 時也會走代理,可能導致無法正常訪問本地服務。

polipo 實現全域性代理

安裝 polipo:

apt-get update
apt-get install polipo
複製程式碼

polipo 的配置檔案 /etc/polipo/config 初始內容只有 logSysloglogFile 兩項。
新增以下內容:

# SS 的代理地址
socksParentProxy = "127.0.0.1:1081"
# 型別
socksProxyType = socks5
# 轉換為 HTTP 之後的埠
proxyPort = 8123
# 下面的就不清楚了
chunkHighMark = 50331648
objectHighMark = 16384
serverMaxSlots = 64
serverSlots = 16
serverSlots1 = 32
proxyAddress = "0.0.0.0"
複製程式碼

8123 就是 HTTP 代理的埠了。

接下來把代理地址新增到環境變數。在 /etc/profile 新增以下內容:

export http_proxy="http://127.0.0.1:8123"
export https_proxy="http://127.0.0.1:8123"
複製程式碼

重新載入:

source /etc/profile
複製程式碼

啟動 polipo:

service polipo start
複製程式碼

測試一下:

curl www.google.com
複製程式碼

privoxy 實現全域性和自動代理

privoxy 可以配置 .action 格式的代理規則檔案。通過控制規則檔案實現全域性和自動代理。

action 檔案可以手動編輯,也可以從 gfwlist 生成。
下面將先介紹 privoxy 的安裝配置,再介紹 action 檔案的生成。

安裝配置

安裝 privoxy:

apt-get update
apt-get install privoxy
複製程式碼

進入目錄 /etc/privoxy,可以看到目錄結構大致為:

  • config 配置檔案,這個檔案很長。。
  • *.action 代理規則檔案
  • *.filter 過濾規則檔案
  • trust 不造幹嘛用
  • templates/ 同上

開始修改配置檔案。

privoxy 有 filter (過濾)的功能,可以用來實現廣告攔截。不過這裡只希望實現自動代理,在配置檔案中把 filter 部分註釋掉:

# 大約在435行
# filterfile default.filter
# filterfile user.filter      # User customizations
複製程式碼

我們將使用自定義的 action 檔案,所以把預設的 action 檔案註釋掉,並新增自定義檔案:

# 386行左右
# 預設的 action 檔案
# actionsfile match-all.action # Actions that are applied to all sites and maybe overruled later on.
# actionsfile default.action   # Main actions file
# actionsfile user.action      # User customizations
# 自定義 action 檔案
actionsfile my.action
複製程式碼

可以指定轉換後的 HTTP 代理地址,這裡直接使用預設埠 8118

# 785行左右
listen-address  127.0.0.1:8118
listen-address  [::1]:8118
複製程式碼

如果代理規則直接寫在配置檔案 config 中,那麼代理規則和本地 SS 代理地址是寫在一起的:

# / 代表匹配全部 URL,即全域性代理
forward-socks5 / 127.0.0.1:1081 .
複製程式碼

# 根據規則自動代理
forward-socks5 .google.com 127.0.0.1:1081 .
複製程式碼

注意!每行最後還有一個點。

實現全域性代理就是第一種寫法了。

但是如果要自動代理,第二種直接寫在配置檔案裡的做法其實不太合適,更合適的做法是寫成 action 檔案,配置檔案中只管引用。

把上面的註釋掉。
新建 action 檔案 my.action,內容如下:

# 這一行表示本 action 檔案中所有條目都使用代理
{+forward-override{forward-socks5 127.0.0.1:1081 .}}
# 新增一條規則
.google.com
複製程式碼

把 privoxy 轉換後的地址 http://127.0.0.1:8118 新增到環境變數,可以參照 polipo 部分。

啟動 privoxy,這時應該可以正常訪問 Google 了:

service privoxy start
curl www.google.com
複製程式碼

下面看一下怎麼用 gfwlist 生成 action 檔案。

生成 action 檔案

配置檔案 config 或 action 檔案修改後不需要重啟 privoxy。

使用的工具是 gfwlist2privoxy。這個工具很簡單,文件就幾行,寫得也很清楚。

安裝:

pip install gfwlist2privoxy
複製程式碼

gfwlist2privoxy 不支援 python3.x,安裝時注意使用的是 pip2 還是 pip3

引數說明:

  • -i/--input 輸入,本地 gfwlist 檔案或檔案 URL。這裡使用上面的 gfwlist
  • -f/ --file 輸出,即生成的 action 檔案的目錄。這裡輸出到 /etc/privoxy/gfwlist.action
  • -p/ --proxy SS 代理地址,生成後可以修改。這裡是 127.0.0.1:1081
  • -t/ --type 代理型別,生成後也可以修改。這裡是 socks5
  • --user-rule 使用者自定義規則檔案,這個檔案中的規則會被追加到 gfwlist 生成的規則後面

示例:

gfwlist2privoxy -i https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt -f /etc/privoxy/gfwlist.action -p 127.0.0.1:1081 -t socks5
複製程式碼

得到檔案 /etc/privoxy/gfwlist.action

# gfwlist.action generated by gfwlist2privoxy, 2018-08-02 07:36:00 +0000
# https://github.com/snachx/gfwlist2privoxy

{+forward-override{forward-socks5 127.0.0.1:1081 .}}

# 規則列表
...
複製程式碼

最後,把 /etc/privoxy/config 中的 actionsfile my.action 改為 actionsfile gfwlist.action 就完成了。

其他

  1. 還有一種自動代理的方法使用了 cow,還沒試過。

  2. 環境變數的配置 很多教程都只新增了 http_proxy 一項,但是實際使用中發現也需要設定 https_proxy

    另外,關於地址的寫法,只寫 127.0.0.1:8123 時,遇到過有軟體不能識別的情況,改為寫完整的地址 http://127.0.0.1:8123/ 就不會有問題了。

參考連結

Raspberry PI+SS+Polipo 實現科學上網
Privoxy 教程
使用 Privoxy 實現通用選擇性代理功能

相關文章