Ubuntu 安裝shadowsocks

主要跟大家說下如何在Ubuntu18.04上安裝shadowsocks,實現科學上網

並詳細說明如何在 Ubuntu 18.04 下安裝使用 shadowsocks 客戶端

同時給大家提供了讓系統使用 PAC 模式或全局模式的配置方法。

本文使用的是 shadowsocks 的 python 實現版本,沒有 GUI,此外只涉及客戶端配置,服務端可參考 官方文檔

Github 主頁:shadowsocks

官網:https://shadowsocks.org/en/index.html

使用 shadowsocks 的前提

  • 一台在防火牆之外的伺服器
  • 牆內主機需要安裝 shadowsocks 本地端
  • 牆外伺服器需要安裝 shadowsocks 服務端

shadowsocks 基本原理

hadowsocks 是一個基於 SOCKS5 的安全拆分代理,由兩部分組成,客戶端和服務端。

client <---> ss-local <--[encrypted]--> ss-remote <---> target

Shadowsocks 本地組件(ss-local)就像傳統的 SOCKS5 伺服器,為客戶端提供代理服務。它將數據流和數據包從客戶端加密並轉發到 Shadowsocks 遠程組件(ss-remote),後者解密並轉發到目標。來自目標的回復同樣被加密並由 ss-remote 中繼回 ss-local,後者解密並最終返回到原始客戶端。

安裝 shadowsocks

使用的是阿里的鏡像源,執行安裝命令

sudo apt install shadowsocks

查看版本號

執行以下命令查看 shadowsocks 的版本

sslocal --version

sslocal-version

配置 shadowsocks 客戶端

Configuration via Config File 通過配置文件進行配置

修改 /etc/shadowsocks/config.json 配置(客戶端配置),例如:

{
    "server":"my_server_ip",
    "server_port":8388,
    "local_address": "127.0.0.1",
    "local_port":1080,
    "password":"mypassword",
    "timeout":300,
    "method":"aes-256-cfb",
    "fast_open": false
}

欄位說明:

Name Explanation
server the address your server listens 服務端IP
server_port server port 服務端埠
local_address the address your local listens 本地代理監聽地址
local_port local port 本地代理監聽埠
password password used for encryption 服務端設置的密碼
timeout in seconds 超時設置 與服務端保持一致
method default: “aes-256-cfb”, see Encryption 加密演算法, 與服務端保持一致
fast_open use TCP_FASTOPEN, true / false
workers number of workers, available on Unix/Linux

運行

前台運行

sslocal -c /etc/shadowsocks.json

後台運行

sslocal -c /etc/shadowsocks.json -d start
sslocal -c /etc/shadowsocks.json -d stop

是否使用 sudo 許可權根據具體情況而定

run-ss

shadowsocks 代理模式

啟動後還不能直接翻牆,因為上面只是啟動了代理伺服器,但是網路請求並沒有經過代理伺服器,所以還需要配置代理服務,代理服務可分為部分代理和全局代理。

特別說明:這裡所說的是 shadowsocks 的 PAC 模式和全局模式,另外 shadowsocks 的全局模式並不是整個系統所有軟體都進行代理,而只是針對所有瀏覽器進行的全局代理。

  • PAC 模式PAC 也即代理自動配置 Proxy auto-config,是一種網頁瀏覽器技術,用於定義瀏覽器該如何自動選擇適當的代理伺服器來訪問一個網址。PAC-modePAC 模式會在連接網站的時候讀取 PAC 文件的規則,來確定所訪問的網站有沒有被牆,如果被牆了或者符合規則,那就會使用代理伺服器連接網站,而 PAC 列表一般都是從 GFWList 更新的。GFWList 定期會更新被牆的網站,不過一般比較慢。
  • 全局模式Shadowsocks 的全局模式,是設置系統的代理伺服器,使所有的 Http Proxy/Socks5 請求都由代理伺服器轉發。
  • 區別簡單地說,在全局模式下,所有網站默認走代理。而 PAC 模式是只有被牆的才會走代理,推薦使用 PAC 模式,如果 PAC 模式無法訪問一些網站,就換全局模式試試,一般是因為 PAC 更新不及時(也就是 GFWList 更新不及時)導致的。

配置 Ubuntu 使用 PAC 模式

配置 PAC 模式需要 pac 文件,這個 pac 文件可以自己編寫也可以用工具生成,這裡直接使用工具 GenPAC 來生成。

Github 主頁: GenPAC

GenPAC:基於 gfwlist 的多種代理軟體配置文件生成工具,支持自定義規則,目前可生成的格式有 pac, dnsmasq, wingy

  1. 安裝 GenPAC
sudo pip install genpac
sudo pip install --upgrade genpac
  1. 生成 autoproxy.pac

進入終端,cd 到你希望存放配置文件的目錄,例如:

cd /home/wylu/.config/GenPAC

執行以下命令生成 pac 配置文件:

sudo genpac –pac-proxy=”SOCKS5 127.0.0.1:1080″ -o autoproxy.pac –gfwlist-url=”https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt”

關於命令參數說明,詳見官方文檔 GenPAC

  1. 設置系統網路代理

進入設置:Settings –> Network –> Network Proxy

方法選擇 Automatic

Configuration URL 填寫剛剛生成的 pac 文件路徑 /home/wylu/.config/GenPAC/autoproxy.pac

  1. 測試

瀏覽器訪問 Google 驗證代理是否配置成功

一般的瀏覽器都是默認使用系統代理,所以這裡只配置了系統代理,如果瀏覽器沒有走 Socks5 代理伺服器,需要自行設置瀏覽器的代理

  1. 關於 privoxy

以上只是針對瀏覽器的代理,而使用 privoxy 代理能把電腦上所有 http 請求都轉發給 ss,這意味著在終端下也能使用 wget、curl 等命令訪問牆外資源。

配置手動代理可以參考:

https://www.serverlab.ca/tutorials/linux/administration-linux/how-to-configure-proxy-on-ubuntu-18-04/

shell 終端里執行的命令,發起的網路請求現在還不支持 socks5 代理,只支持 http/https 代理。使用 privoxy 代理,可以將 shell 發起的網路請求轉發給 shadowsocks

autoproxy.pac 文件分析

var proxy = 'SOCKS5 127.0.0.1:1080';
var rules = [
    /*
    用於添加自定義規則
    分析以下的js代碼,可以知道rules元素,越靠前的優先順序越高;
    即如果在rules[0]中匹配成功,則不再匹配,直接返回選擇"直連"或者"走代理"
    */
    [
        [],
        []
    ],
    [
        /*
        以rules[1]為例進行分析,其它類似;
        同樣,在rules[1]中的元素也是越靠前的優先順序越高;
        如果在rules[1][0]中匹配成功,則不再匹配,直接返回;
        分析代碼可知,當匹配成功時:
            --如果該元素的索引為偶數,則返回字面值'DIRECT',即選擇直連
            --如果該元素的索引為奇數,則返回proxy變數的值,即選擇使用代理
        */
        [],
        []
    ]
    /*
    以上規則如果沒有一個匹配成功,根據代碼分析,最終將返回字面值'DIRECT',
    也就是選擇直連;這也意味著如果某些URL被牆,而又沒有加入到pac規則中,
    最終會以直連的方式訪問,因為被牆所以肯定是訪問不到的, 這時應該使用全局模式,
    或者在pac中添加規則。
    */
]

var lastRule = '';

function FindProxyForURL(url, host) {
    /*
    個人認為,如果這裡直接返回proxy,應該就等同於全局模式了,
    此時,不管是什麼URL,都會走代理
    */
    for (var i = 0; i < rules.length; i++) {
        ret = testHost(host, i);
        if (ret != undefined)
            return ret;
    }
    return 'DIRECT';
}

function testHost(host, index) {
    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 (host == lastRule || host.endsWith('.' + lastRule))
                return i % 2 == 0 ? 'DIRECT' : proxy;
        }
    }
    lastRule = '';
}

// REF: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
if (!String.prototype.endsWith) {
    String.prototype.endsWith = function(searchString, position) {
        var subjectString = this.toString();
        if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) {
            position = subjectString.length;
        }
        position -= searchString.length;
        var lastIndex = subjectString.indexOf(searchString, position);
        return lastIndex !== -1 && lastIndex === position;
  };
}

理解 pac 文件 rules 的含義後,就可以自行添加一些規則了。比如 PAC 模式下訪問不了 Jetbrains 的插件網址 https://plugins.jetbrains.com,因為在該 pac 文件中並沒有與此 URL 匹配的規則,所以最後會以直連的方式訪問,但是該網址已被牆,最終是無法訪問的,我們可以把該域名添加到 pac 文件的規則列表中,該規則列表應是一個使用代理的列表,在添加規則後會以走代理的方式訪問 Jetbrains 的插件網址。

pac-file-rules

配置 Ubuntu 使用 Global 模式

要實現 Global 模式,需要使用 privoxy,並且配置系統網路代理使用手動模式。

privoxy 能夠實現不同代理之間的切換,使用它可以作為 SOCKS 代理和 HTTP、HTTPS 代理連接的橋樑,它能把所有的 http 請求(包括終端執行的命令,瀏覽器)轉發給 shadowsocks,它就像是一個適配器,將 SOCKS 代理轉為 HTTP 代理。

安裝配置 privoxy

  1. 安裝 privoxy
sudo apt install privoxy
  1. 配置 privoxy
sudo vim /etc/privoxy/config

找到 #listen-address 127.0.0.1:8118,取消注釋,表示 privoxy 監聽本機 8118 埠

privoxy-listen-address

找到 #forward-socks5t / 127.0.0.1:9050 .,在下方添加一行 forward-socks5t / 127.0.0.1:1080 .,表示轉發請求到本地 1080 埠,而 1080 埠是 shadowsocks 監聽的埠

privoxy-forward-socks5t

  1. 修改完後,重啟 privoxy
systemctl restart privoxy
  1. 配置請求轉發

在 ~/.bashrc 中添加如下內容,如果使用的是 zsh,則在 ~/.zshrc 中添加

# set proxy
export http_proxy="127.0.0.1:8118"
export https_proxy="127.0.0.1:8118"
export ftp_proxy="127.0.0.1:8118"

不建議在 shell 的配置文件下設置代理,這種方式下所有的 shell 命令都會走代理,如果你突然不想終端命令走代理,那麼又需要修改配置文件,注釋掉代理相關配置,反覆修改配置文件是一件挺麻煩的事。推薦使用下面”配置系統網路代理”的方式,該配置手動模式下就能使終端命令走代理,不需要配置 .bashrc 或 .zshrc,當禁用系統網路代理時,終端命令就不會走代理了。

  1. 測試

Global-mode-shell-test

配置系統網路代理

配置完 privoxy 後,終端發起的網路請求也能走 SOCKS5 代理了,但瀏覽器要使用全局模式還需要配置系統網路代理。

默認瀏覽器默認使用系統代理,所以只需配置系統網路代理即可,具體配置過程如下:

  1. 進入設置:Settings –> Network –> Network Proxy
  2. 方法選擇 Manual
  3. 設置 HTTP、HTTPS 請求由 privoxy 來代理

manual-mode-setting

  1. Pac 和 Global 模式切換

系統網路代理的自動 (Automatic) 模式和手動 (Manual) 模式都配置完成後,當選用 Automatic 則使用 Pac 模式,當選用 Manual 則使用 Global 模式。

讚賞

微信讚賞支付寶讚賞