Surge for macOS 通过前置代理支持 ShadowsocksR 和 V2Ray 等代理工具

Nov 5, 2017 00:00 · 2951 words · 6 minutes read network

更新记录

  • 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 部分添加 ShadowsocksR = socks5,127.0.0.1,9001,其中:

    • ShadowsocksR:代理的名称,可以自定义
    • socks5:代理协议
    • 127.0.0.1:IP 地址,与上图中「本地 Socks5 监听地址」一致,这里为 127.0.0.1,不要改动
    • 9001:端口,与上图中「本地 Socks5 监听端口」一致,这里为 9001
  2. 在所需要的规则处使用上一部分所定义的名字即可,比如: DOMAIN-SUFFIX,google.com,ShadowsocksR

  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
  4. 在终端使用 /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
    
  2. 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 所处网络以及手机网络的带宽密切相关。

最后

感谢大家阅读,如有任何错漏或者疑问欢迎评论或者电邮至 [email protected],我会在闲暇时间浏览,但并不保证一定答复。本文内容也会根据个人或者大家需求适当增删。