sing-box 复杂环境中自定义路由规则写法—— sing-box 系列的补充知识

日常上网环境还是很复杂的,不同场景可能会使用不同的出站协议,毕竟如果线路是 CN2 GIA 的用来上网还是挺好的,用来下载就有点奢侈了。

目前使用场景,日常有备份苹果精品应用和 GitHub 某些仓库的习惯。正常情况下会直接通过域名规则集分流选择某个出站,不过使用起来不够精准,用来上网的浏览也会走该出站方式。当然还可以通过该下载软件的链接直接定位,不过可能需要大量的收集,所以还是结合 sing-box logical 方式精准定位,实现下载只使用某个出站的协议,并且不需要更多的维护。

当然不同人的使用场景会有不同,sing-box 提供了非常的路由规则写法,可以组合使用,来精准实现你复杂的需求,下面也给大家贴出各种写法的注释。

实现方式的逻辑

logical and 精准定位;
基于下载链接或者该下载链接的规则集加上程序名精确分流;
如果使用 V2rayN 和 sing-box 搭配,那么应用程序名会不一样;

个人案例自定义路由规则写法

V2rayN 和 sing-box 搭配

      {									//逻辑和代理,苹果应用备份
        "type": "logical",
        "mode": "and",
        "rules": [
          {
            "process_name": "xray.exe"
          },
          {
          "domain": "iosapps.itunes.apple.com"
          }
        ],
        "outbound": "vless-sb"
      },
      {									//逻辑和代理,IDM下载
        "type": "logical",
        "mode": "and",
        "rules": [
          {
            "process_name": "xray.exe"
          },
          {
          "rule_set": "cnsite-!cn"
          }
        ],
        "outbound": "vless-sb"
      }

sing-box 单独内核自定义

      {									//逻辑和代理,苹果应用备份
        "type": "logical",
        "mode": "and",
        "rules": [
          {
            "process_name": "iTunes.exe"
          },
          {
          "domain": "iosapps.itunes.apple.com"
          }
        ],
        "outbound": "vless-sb"
      },
      {									//逻辑和代理,IDM下载
        "type": "logical",
        "mode": "and",
        "rules": [
          {
            "process_name": "IDMan.exe"
          },
          {
          "rule_set": "cnsite-!cn"
          }
        ],
        "outbound": "vless-sb"
      }

补充点路由规则写法

{
  "route": {
    "rules": [
      {
        "protocol": "dns",        // 使用DNS协议的流量
        "outbound": "dns-out"     // 将通过'dns-out'出口转发
      },
      {
        "clash_mode": "direct",   // Clash模式为直连
        "outbound": "direct"      // 将通过'direct'出口直接连接
      },
      {
        "clash_mode": "global",   // Clash模式为全局
        "outbound": "select"      // 将通过'select'出口选择转发
      },
      {
        "domain_suffix": [        // 特定后缀的域名
          "icloudnative.io",
          "fuckcloudnative.io",
          "sealos.io",
          "cdn.jsdelivr.net"
        ],
        "outbound": "direct"      // 将通过'direct'出口直接连接
      },
      {
        "process_name": [         // 特定进程名称
          "TencentMeeting",
          "NemoDesktop",
          ...
        ],
        "outbound": "direct"      // 将通过'direct'出口直接连接
      },
      {
        "rule_set": [             // 特定的规则集
          "WeChat",
          "Bilibili"
        ],
        "outbound": "direct"      // 将通过'direct'出口直接连接
      },
      {
        "protocol": "quic",       // 使用QUIC协议的流量
        "outbound": "block"       // 将被阻止
      },
      {
        "inbound": "socks-in",    // 来自'socks-in'入口的流量
        "outbound": "select"      // 将通过'select'出口选择转发
      },
      {
        "rule_set": "OpenAI",     // OpenAI规则集
        "outbound": "openai"      // 将通过'openai'出口转发
      },
      {
        "domain_suffix": [        // OpenAI相关的域名后缀
          "openai.com",
          "oaistatic.com",
          "oaiusercontent.com"
        ],
        "outbound": "openai"      // 将通过'openai'出口转发
      },
      {
        "package_name": "com.openai.chatgpt", // OpenAI ChatGPT应用包名
        "outbound": "openai"                  // 将通过'openai'出口转发
      },
      {
        "rule_set": "TikTok",     // TikTok规则集
        "outbound": "tiktok"      // 将通过'tiktok'出口转发
      },
      {
        "package_name": "com.zhiliaoapp.musically", // TikTok应用包名
        "outbound": "tiktok"                          // 将通过'tiktok'出口转发
      },
      {
        "domain_suffix": [        // 特定的域名后缀
          "depay.one",
          "orbstack.dev"
        ],
        "outbound": "select"      // 将通过'select'出口选择转发
      },
      {
        "process_name": [         // 特定的进程名称
          "DropboxMacUpdate",
          "Dropbox"
        ],
        "outbound": "select"      // 将通过'select'出口选择转发
      },
      {
        "package_name": [         // 特定应用包名
          "com.google.android.youtube",
          ...
        ],
        "outbound": "select"      // 将通过'select'出口选择转发
      },
      {
        "domain": "accounts.google.com", // 特定的域名
        "domain_suffix": [               // 特定的域名后缀
          "sourceforge.net",
          "fhjasokiwq.com"
        ],
        "outbound": "select"             // 将通过'select'出口选择转发
      },
      {
        "domain_suffix": "cloud.sealos.io", // 特定的域名后缀
        "outbound": "direct"                // 将通过'direct'出口直接连接
      },
      {
        "type": "logical",        // 逻辑类型规则
        "mode": "and",            // 使用'and'模式
        "rules": [                // 组合规则
          {
            "rule_set": "geosite-geolocation-!cn"
          },
          {
            "rule_set": "geoip-cn",
            "invert": true
          }
        ],
        "outbound": "select"      // 将通过'select'出口选择转发
      },
      {
        "rule_set": "Global",     // Global规则集
        "outbound": "select"      // 将通过'select'出口选择转发
      },
      {
        "rule_set": "geoip-cn",   // 中国地理位置IP规则集
        "outbound": "direct"      // 将通过'direct'出口直接连接
      },
      {
        "ip_is_private": true,    // 私有IP地址
        "outbound": "direct"      // 将通过'direct'出口直接连接
      },
      {
        "rule_set": [             // 特定的规则集
          "YouTube",
          "Telegram",
          "Netflix",
          "geoip-google",
          "geoip-telegram",
          "geoip-twitter",
          "geoip-netflix"
        ],
        "outbound": "select"      // 将通过'select'出口选择转发
      }
    ]
  }
}
2 个赞

大佬牛逼

牛~

学习了

实际使用过程中还是有些局限性,比如 V2rayN 和 sing-box 搭配组合中,因为消除了程序名这个最大的特征,也会导致某些场景定位的消失,比如油管网页播放视频链接和下载的链接一样,导致无法区分成功。如果只有内核应该有程序名精准定位,倒也简单。

实际网络太过复杂,佬友们还是需要根据自己的场景自定义。

感谢大佬

From #optimize to 开发调优