Surge for macOS 通過前置代理支持 SSR 和 V2Ray 等代理工具

Nov 5, 2017 00:00 · 3789 words · 8 minute read network

更新記錄

  • 2018-08-12: 添加 External Proxy Provider 部份使用實例
  • 2018-05-15: 刪除 Surge for iOS 部分(實用性太低),以及多個 V2Ray 服務端的本地參考配置
  • 2017-11-06: 添加 Surge for iOS 以及 Brook 部分
  • 2017-11-05: 初始版本

更新計劃

此更新計劃沒有優先級以及沒有預計完成時間,根據評論和心情來

  • Surge for iOS 的支持(已添加) (已刪除)
  • Brook 的支持 (已添加)
  • ……

前言

Surge for macOS (以下簡稱為 Surge,本文若提到 Surge for iOS 會專門指出)是 Mac 上強大的網絡調試工具,很多人也將其用作代理工具來實現某些上網需求。在 Surge 的官方網站上,對 Surge 的描述是這樣的:

Surge is a high-performance HTTP/SOCKS5 proxy server. It is capable of intercepting and logging the summary of HTTP traffic, and meanwhile transmitting the traffic to other proxy servers according to the flexible rule system. Multiple proxy protocols are supported including HTTP, HTTPS, SOCKS5, SOCK5 over TLS.

我個人喜歡 Surge 的原因有兩個:其一是穩定,本人從使用 Surge 到現在幾乎從未遇見過軟件崩潰等問題;其二是可定制性強,通過配置文件,用戶可以定制種類豐富的規則來滿足個人需求。關於配置文件的詳細介紹,大家可以參考官方文檔

儘管 Surge 有著上述優點,但它某些功能的缺失也讓很多用戶望而卻步。由於目前 Surge 支持的代理類型只有 HTTP, HTTPS, SOCKS5, SOCK5 over TLS 和 Shadowsocks (以下簡稱為 SS),使用 ShadowsocksR (以下簡稱為 SSR)和 V2Ray 等其它代理工具的用戶很難享受到 Surge 的便利。儘管 SSR 的兼容模式可以兼容 SS 原版協議,但對於某些地區用戶來說效果並不理想。本文將介紹如何通過 Surge 連接前置代理的方式來支持 SSR 和 V2Ray 等代理工具,從而既享受到 Surge 配置規則的便利,又可以使用合適的代理工具/協議來保證速度和穩定性。當然,對於其它的代理工具,本文的方法亦有參考價值。

本文的部分內容咨詢了 VINGA 的意見及參考了其博客的部分文章,在此表示衷心感謝。

背景

這裡將來會補充一些具體工作原理的東西,不過大家先忽略這一部分好了,畢竟我懶,能用就行您說是吧…… 期待有緣人幫我補充

SSR

準備工作:

  • Mac 電腦
  • Surge
  • ShadowsocksX-NG-R8
  • 可以使用的 SSR 節點
  • 對 Surge 配置文件有一定的瞭解
  • 細心、耐心等一切美好的品質

ShadowsocksX-NG-R8 部分

  1. 下載 ShadowsocksX-NG-R8 並運行,你會看到系統頂部欄出現一個小飛機的圖標。如果你是第一次打開這個軟件,你需要手動添加 SSR 節點服務器信息或者節點訂閱信息,點擊小飛機圖標,選擇「編輯訂閱」或者「服務器設置…」來添加信息:

  2. 點擊小飛機圖標,選擇「高級設置…」,如下圖所示:

    這裡我們要注意如下幾個地方:

    • 「本地 Socks5 監聽地址」:默認為 127.0.0.1,保持不變
    • 「本地 Socks5 監聽端口」:SSR 客戶端監聽的端口,這裡你可以自定義一個端口,但是為了避免與已有端口衝突,建議使用一個高位端口(比如大於 10000 的端口),我這裡選擇了 9001
    • 「啟用 Udp Relay」:默認為不啟用,選擇啟用
  3. 點擊小飛機圖標,選擇「手動模式」,確保服務器處有選擇你所添加的節點。

Surge 部分

  1. 打開 Surge 使用的 .conf 配置文件文件,在 Proxy 部分添加 ssr = socks5,127.0.0.1,9001,其中:

    • ssr:代理的名稱,可以自定義
    • socks5:代理協議
    • 127.0.0.1:IP 地址,與上圖中「本地 Socks5 監聽地址」一致,這裡為 127.0.0.1,不要改動
    • 9001:端口,與上圖中「本地 Socks5 監聽端口」一致,這裡為 9001
  2. 在所需要的規則處使用上一部分所定義的名字即可,比如: DOMAIN-SUFFIX,google.com,ssr

  3. 點擊 Surge 的圖標,確定選擇了「Set as System Proxy」,開始享受 Surge 和 SSR 合體的快感吧~

注意事項

Surge 需要監聽本機的指定 HTTP/HTTPS/SOCKS 端口才能正常工作,因此默認情況下,「Set as System Proxy」的操作會自動開啟本機代理將流量轉發到指定端口。然而對 ShadowsocksX-NG-R8 的操作有時會更改本機代理設置,從而導致 Surge 未能正常工作。

解決方法:取消選擇「Set as System Proxy」之後重新選擇就可以了。

V2Ray

準備工具:

  • Mac 電腦
  • Surge
  • v2ray-core
  • 對 v2ray 及其配置文件有一定的瞭解,如果你之前沒有接觸過 V2Ray 或者不太清楚如何配置,可以參考 VINGA 的這篇文章以及 V2Ray 的官方網站
  • 細心、耐心等一切美好的品質

v2ray-core 部分

  1. 下載 v2ray-core 的最新版本,注意下載的是 v2ray-macos.zip。

  2. 將文件解壓到 Mac 上某個路徑處,然後打開 config.json。

  3. inbound 部分按照如下配置,outbound 部分和服務器端匹配即可。

"inbound": {
  "protocol": "socks",
  "listen": "0.0.0.0",
  "port": 10001,
  "settings": {
    "auth": "noauth",
    "udp": true,
    "timeout": 30
}

其中:

- `"port": 10001"`:v2ray-core 監聽的端口,這裡使用 10001
  1. 在終端使用 /path/to/v2ray -config=/path/to/json 來啟動 v2ray。

Surge 部分

這部分與之前 SSR 部分基本一致:

  1. 打開 Surge 使用的 .conf 配置文件文件,在 Proxy 部分添加 v2ray = socks5,127.0.0.1,10001,其中:

    • v2ray:代理的名稱,可以自定義
    • socks5:代理協議
    • 127.0.0.1:IP 地址,這裡為 127.0.0.1,不要改動
    • 10001:端口,與上圖中 "port": 定義的一致,這裡為 10001
  2. 在所需要的規則處使用上一部分所定義的名字即可,比如: DOMAIN-SUFFIX,google.com,v2ray

  3. 點擊 Surge 的圖標,確定選擇了「Set as System Proxy」,開始享受 Surge 和 V2Ray 合體的快感吧~

多個 V2Ray 服務端參考配置

如果你擁有多個 V2Ray 服務端,並希望在本地可以通過 Surge 切換或者對不同規則應用不同的 V2Ray 服務端代理,可以參考如下配置進行修改。這裡 V2Ray 服務端均用 vmess + websocket + tls 方式部署,對應本機 10001,10002 以及 10003 端口。

  1. 在 Surge 使用的 .conf 配置文件的 Proxy 部分添加:
v2ray1 = socks5,127.0.0.1,10001
v2ray2 = socks5,127.0.0.1,10002
v2ray3 = socks5,127.0.0.1,10003
  1. v2ray-core 使用的 config.json 參考配置:
{
    "log": {
      "loglevel": "warning"
    },
    "routing": {
      "strategy": "rules",
      "settings": {
      "rules": [
        {
        "type": "field",
        "inboundTag": "tag1",
        "outboundTag": "tag1"
        },
        {
        "type": "field",
        "inboundTag": "tag2",
        "outboundTag": "tag2"
        },
        {
        "type": "field",
        "inboundTag": "tag3",
        "outboundTag": "tag3"
        }
      ]
      }
    },
    "inbound": {
      "protocol": "socks",
      "listen": "0.0.0.0",
      "port": 10001,
      "tag": "tag1",
      "settings": {
        "auth": "noauth",
        "udp": true,
        "timeout": 30
      }
    },
    "outbound": {
      "protocol": "vmess",
      "settings": {
        "vnext": [
          {
            "address": "url1.nliu.work", 
            "port": 443, 
            "users": [
              {
                "id": "xxxxxxxxxxxx",
                "alterId": 32,
                "security": "none"
              }
            ]
          }
        ]
      },
      "tag": "tag1",
      "streamSettings": {
        "network": "ws", 
        "security": "tls",
        "tlsSettings": {
          "serverName": "url1.nliu.work",
          "allowInsecure": false
        },
        "wsSettings": {
          "connectionReuse": true,
          "path": ""
        }
      },
      "mux":{
        "enabled": true,
        "concurrency": 8
      }
    },
    "inboundDetour": [{
      "protocol": "socks",
      "listen": "0.0.0.0",
      "port": 10002,
      "tag": "tag2",
      "settings": {
        "auth": "noauth",
        "udp": true,
        "timeout": 30
      }
    },
    {
      "protocol": "socks",
      "listen": "0.0.0.0",
      "port": 10003,
      "tag": "tag3",
      "settings": {
        "auth": "noauth",
        "udp": true,
        "timeout": 30
      }
    }],
    "outboundDetour": [{
      "protocol": "vmess",
      "settings": {
        "vnext": [
          {
            "address": "url2.nliu.work", 
            "port": 443, 
            "users": [
              {
                "id": "xxxxxxxxxxxx",
                "alterId": 32,
                "security": "none"
              }
            ]
          }
        ]
      },
      "tag": "tag2",
      "streamSettings": {
        "network": "ws", 
        "security": "tls",
        "tlsSettings": {
          "serverName": "url2.nliu.work",
          "allowInsecure": false
        },
        "path": ""
      },
      "mux":{
        "enabled": true,
        "concurrency": 8
      }
    },
    {
      "protocol": "vmess",
      "settings": {
        "vnext": [
          {
            "address": "url3.nliu.work", 
            "port": 443, 
            "users": [
              {
                "id": "xxxxxxxxxxxx",
                "alterId": 32,
                "security": "none"
              }
            ]
          }
        ]
      },
      "tag": "tag3",
      "streamSettings": {
        "network": "ws", 
        "security": "tls",
        "tlsSettings": {
          "serverName": "url3.nliu.work",
          "allowInsecure": false
        },
        "path": ""
      },
      "mux":{
        "enabled": true,
        "concurrency": 8
      }
    }]
} 

Brook

準備工具:

  • Mac 電腦
  • Surge
  • Brook
  • 對 Brook 有一定的瞭解,瞭解如何部署服務端
  • 細心、耐心等一切美好的品質

Brook 部分

  1. 下載 Brook 的最新版本,注意下載的是 brook_macos_amd64。

  2. 將文件解壓到 Mac 上某個路徑處。

  3. 在終端使用 /path/to/brook client -l 127.0.0.1:15001 -i 127.0.0.1 -s server_address:port -p password 來啟動 Brook,這裡我假設服務端使用 brook server -l :port -p password 的方式啟動,如果是其它方式可對應修改。其中,

    • 15001:Brook 服務端監聽的端口,這裡為15001
    • server_address:Brook 服務端的 IP 地址
    • port:Brook 服務端設置的端口
    • password:Brook 服務端設置的密碼

Surge 部分

這部分與之前 SSR 以及 V2Ray 部分基本一致:

  1. 打開 Surge 使用的 .conf 配置文件文件,在 Proxy 部分添加 brook = socks5,127.0.0.1,15001,其中:

    • brook:代理的名稱,可以自定義
    • socks5:代理協議
    • 127.0.0.1:IP 地址,這裡為 127.0.0.1,不要改動
    • 15001:端口,與上一部分定義的一致,這裡為 15001
  2. 在所需要的規則處使用上一部分所定義的名字即可,比如: DOMAIN-SUFFIX,google.com,brook

  3. 點擊 Surge 的圖標,確定選擇了「Set as System Proxy」,開始享受 Surge 和 Brook 合體的快感吧~

Surge for iOS

iOS 上想要實現上述功能其實也不難,但是就便捷性來說不如直接用 Shadowrocket 等工具來的方便,首先你同樣需要一台 Mac 電腦來進行上文所述的操作,然後:

1. 如果你的手機和 Mac 處在同一局域網環境,將 127.0.0.1 改成 Mac 內網地址已經可以使用。

2. 如果你的手機和 Mac 處在不同局域網環境,用 Mac 的公網 IP 替代 Proxy 部分的 127.0.0.1 即可,如果沒有公網 IP 的話可以考慮內網穿透等操作.當然最終使用效果和你 Mac 所處網絡以及手機網絡的帶寬密切相關。

External Proxy Provider 使用實例

作者從 Surge for macOS Build 622 開始引入了一個新的功能:External Proxy Provider,可以让 Surge 与其他代理软件更方便的协同工作,可以參考作者 Medium 文章。下面僅列舉兩個使用場景:

Shadowsocks-libev

這部分基本參考作者 Medium 文章,Shadowsocks-libev 的配置文件內容這裡不作闡述,請自行查閱相關資料。

  1. 打開 Surge 使用的 .conf 配置文件文件,在 Proxy 部分添加 ss-libev = external,exec = "/usr/local/bin/ss-local",args = "-c",args = "/usr/local/etc/shadowsocks-libev.json",local-port = 1080,addresses = 11.22.33.44,其中:

    • ss-libev:代理的名稱,可以自定義
    • external:配合 External Proxy Provider 的新的代理類型
    • exec = "..":外部程序路徑,此處引號內為 Shadowsocks-libev 程序路徑
    • args = "..":外部程序參數,此處引號內為 Shadowsocks-libev 程序參數(指定配置文件位置),args 字段可以反复使用进行追加
    • local-port = 1080:Surge 會將請求轉發到配置文件所指定端口,這裡為 1080
    • addresses = 11.22.33.44:此處應指定代理 IP 地址,這裡為 11.22.33.44,addresses 字段可以反复使用进行追加
  2. 在所需要的規則處使用上一部分所定義的名字即可,比如: DOMAIN-SUFFIX,google.com,ss-libev

V2Ray

這裡 V2Ray 的配置文件內容這裡不作闡述,請自行查閱相關資料。

  1. 打開 Surge 使用的 .conf 配置文件文件,在 Proxy 部分添加 v2ray = external,exec = "/usr/local/bin/v2ray/v2ray",args = "-config=/usr/local/bin/v2ray/config.json",local-port = 10000,addresses = 11.22.33.44,其中:

    • v2ray:代理的名稱,可以自定義
    • external:配合 External Proxy Provider 的新的代理類型
    • exec = "..":外部程序路徑,此處引號內為 V2Ray 程序路徑
    • args = "..":外部程序參數,此處引號內為 V2ray 程序參數(指定配置文件位置),args 字段可以反复使用进行追加
    • local-port = 10000:Surge 會將請求轉發到配置文件所指定端口,這裡為 10000
    • addresses = 11.22.33.44:此處應指定代理 IP 地址,這裡為 11.22.33.44,addresses 字段可以反复使用进行追加
  2. 在所需要的規則處使用上一部分所定義的名字即可,比如: DOMAIN-SUFFIX,google.com,v2ray

最後

感謝大家閱讀,如有任何錯漏或者疑問歡迎評論或者電郵至 [email protected],我會在空閒時間瀏覽,但並不保證一定答覆。