Sing-box realip配置方案

在开头先写写,这篇文章其实自己也没有很大的底气写出来,因为不是网络相关专业的,仅仅是自己学习参考其他一部分人有讲解过后的教程/博客/视频等自己折腾的一套配置,应该会有错误的地方,请相关专业的大咖指出,愿意继续学习!

1. 为什么想折腾Sing-box

有一部分原因是看了坛友所发:

以下阐述针对Windows端:

一直以来我都是使用的clash,不过后面可能出了点事情,就换mihomo(clash meta)咯。一个是基本所有订阅都会有clash的订阅方式,一个是后面自己深入发现写写分流更简单。

不过最近看了几篇文章,发现 singbox 还挺不错的,还有就是clash也有点用腻了哈哈,动了想折腾的心思。

目前更新维护的速度非常感人,愿意称之为“究极为爱发电”,就是官方文档写的实在是太过 专业 了,因此需要折腾挺长一段时间的。 因此这边做个总结~

2. 不同模块的组成

2.1 log(日志)

这部分配置其实没啥好说的

  "log": {
    "disabled": false,
    "level": "warn",
    "timestamp": true
  },

就日志的 level 这边需要看看,如果是要仔细看看具体的cli日志 设置成 info 或者 debug 即可。

2.2 DNS(我自用的主要是使用realip)

fakeip和realip其实一直在被讨论,虽然我用fakeip没有用出什么问题,但是我还是更愿意追求realip。

2.2.1 DNS.servers

    "servers": [
      {
        "tag": "tx",
        "address": "https://120.53.53.53/dns-query",
        "detour": "direct"
      },
      {
        "tag": "google",
        "address": "https://dns.google/dns-query",
        "address_resolver": "tx",
        "address_strategy": "ipv4_only",
        "strategy": "ipv4_only",
        "client_subnet": "1.0.1.0"
      }
    ],

国内dns目前我更推荐用腾讯,因为阿里马上就要做限制啦,虽然腾讯也有,不过还是腾讯的限制还是相对少一点的。

至于非国内的域名或者ip,更推荐google的doh,毕竟"大"。

那这边的配置其实很好理解 tag 是 tx 的就走国内直连

下面的google其实就是realip的一个应用了, client_subnet1.0.1.0 简单理解 ,会根据你节点的位置,与google的dns服务器的距离,选择个最近的,这样延迟就会低一些,就会使得整体的dns解析就相对快很多,只要你不是延迟很高的节点,基本dns解析就是无感的,而且优越性在一定上比fakeip好些。

这边其实有个点我的配置都用的doh,也就是每次都得建立tcp连接,可能你会觉得很慢,实际体验下来不慢。后面看了部分讲解,因为只要链接过一次,就会链式的一直连下去,且会有缓存,就不会那么慢咯。

2.2.2 DNS.rules

    "rules": [
      {
        "outbound": "any",
        "server": "tx"
      },
      {
        "clash_mode": "direct",
        "server": "tx"
      },
      {
        "clash_mode": "global",
        "server": "google"
      },
      {
        "rule_set": "geosite-cn",
        "server": "tx"
      }, 
      {
        "type": "logical",
        "mode": "and",
        "rules": [
          {
            "rule_set": "geolocation-!cn",
            "invert": true
          },
          {
            "rule_set": "geoip-cn"
          }
        ],
        "server": "google",
        "client_subnet": "114.114.114.114/24"
      }
    ],
    "strategy": "ipv4_only",
    "disable_cache": false,
    "disable_expire": false,
    "independent_cache": false,
    "final": "google"
  },

any 指代的其实就是订阅中会鉴权的时候 一般提供的都是域名,而进行鉴权认证的时候,肯定要走国内的dns,不然也连接不到google的dns,所以需要有个 any

后面的简单看看也就能理解,逻辑与那边简单提一下。

这是官方的无DNS泄露的一个案例,我觉得有必要放过来,实际上就是

当域名是中国的域名(不在 geolocation-!cn 集合中)与 IP 地址是中国的 IP 地址时,使用 Google DNS 服务器进行解析,并使用 114.114.114.114/24 作为客户端子网。

为了处理一些特殊情况,比如某些中国域名可能解析到国外 IP 地址,通过这个规则可以确保使用 Google DNS 来解析这些特殊的中国域名,同时告诉 Google DNS 服务器客户端位于中国(通过 client_subnet),以获得更准确的 DNS 解析结果。

2.3 inbounds(入站)

  "inbounds": [
    {
      "tag": "tun",
      "type": "tun",
      "interface_name": "singbox",
      "inet4_address": "172.19.0.1/30",
      "mtu": 9000,
      "stack": "mixed",
      "auto_route": true,
      "sniff": true,
      "strict_route": true,
      "platform": {
        "http_proxy": {
          "enabled": true,
          "server": "127.0.0.1",
          "server_port": 7890
        }
      }
    }
  ],

这个tun入站,我踩了很多坑,后面也是慢慢排查才排查出来的。

至少在使用我整理的这份配置上, 一定要开启 sniff 嗅探,(插个题外话,个人觉得是realip的问题,所以必须开启sniff),不然会启动singbox后会非常非常卡,乃至连Google首页都进不去等情况。

stack 也建议开启 mixed

如果你对DNS泄露有严格想法的话,也要开启 strict_route 否则还是会存在泄露的情况,官方解释如下:

在 Windows 中:
添加防火墙规则以阻止 Windows 的 普通多宿主 DNS 解析行为 造成的 DNS 泄露
它可能会使某些应用程序(如 VirtualBox)在某些情况下无法正常工作。

2.4 outbounds(出站)

  "outbounds": [
    {
      "tag": "direct",
      "type": "direct"
    },
    {
      "tag": "dns-out",
      "type": "dns"
    },
    ...
  ],

这边详细的请看我的自用配置

这边就是两个出站一定要写 一个是 direct 一个是 dns

2.5 route(路由)

2.5.1 route.rules

    "rules": [
      {
        "protocol": "dns",
        "outbound": "dns-out"
      },
      {
        "ip_is_private": true,
        "outbound": "direct"
      },
      {
        "clash_mode": "direct",
        "outbound": "direct"
      },
      {
        "clash_mode": "global",
        "outbound": "GLOBAL"
      },
      ...
    ],

一样的 几个必要的一定要写,其他的请看我的自用配置,其实就是分流

2.5.2 route.rule_set

    "rule_set": [
      {
        "tag": "geoip-apple",
        "type": "remote",
        "format": "binary",
        "url": "https://github.com/MetaCubeX/meta-rules-dat/raw/sing/geo-lite/geoip/apple.srs",
        "download_detour": "proxy"
      },
      ...
    ],

很多规则集,具体看我的配置吧,你可以自己添加新的规则集。

需要注意的就是 singbox 更偏向使用 二进制文件的规则集 srs 可能考虑到,想要性能更好吧,具体看文档。

可以使用sing-box rule-set compile [--output <file-name>.srs] <file-name>.json 编译成二进制文件

这里推荐直接用 MetaCubeX 维护的singbox规则集就行,如果你有自己需要维护的,根据上面的命令自行转换即可

2.6 experimental

2.6.1 experimental.cache_file

    "cache_file": {
      "enabled": true
    },

就是缓存文件,打开就行,缓存一些路由等等

2.6.2 experimental.clash_api

    "clash_api": {
      "external_controller": "127.0.0.1:9090",
      "external_ui": "ui", 
      "external_ui_download_url": "https://github.com/MetaCubeX/Yacd-meta/archive/gh-pages.zip", 
      "external_ui_download_detour": "proxy",
      "default_mode": "rule"
    }

简单理解 就是一个可视化的面板 因为singbox官方还没出Windows的客户端,可以暂时先用clash_api来代替

3. 如何搭配sub-store使用

3.1 搭建sub-store

git clone https://github.com/sub-store-org/Sub-Store.git
cd ./Sub-Store/backend

# 我是用的是fnm 创建了一个 node -v 是 18 的(也推荐这个版本 不然启动会有奇怪的问题)
npm install -g pnpm
pnpm i
pnpm run --parallel --stream "/^dev:.*/"

这样就启动起来了,不过是后端,搭配官方的前端 sub-store.vercel.app/?api=http://127.0.0.1:3000 使用即可

3.2 导入自己的订阅

3.3 生成singbox配置文件

链接 里 填写 自用配置的远程地址 这边以 realip 为例

https://raw.githubusercontent.com/yyhhyyyyyy/selfproxy/main/Sing-Box/singbox_realip.json

添加一个 脚本操作 然后选择 链接 填写

https://raw.githubusercontent.com/yyhhyyyyyy/selfproxy/main/Sing-Box/tp.js#name=klm&outbound=🕳ℹ️all|all-auto🕳ℹ️hk|hk-auto🏷ℹ️港|hk|hongkong|kong kong|🇭🇰🕳ℹ️tw|tw-auto🏷ℹ️台|tw|taiwan|🇹🇼🕳ℹ️jp|jp-auto🏷ℹ️日本|jp|japan|🇯🇵🕳ℹ️sg|sg-auto🏷ℹ️^(?!.*(?:us)).*(新|sg|singapore|🇸🇬)🕳ℹ️us|us-auto🏷ℹ️美|us|unitedstates|united states|🇺🇸🕳ℹ️de|de-auto🏷ℹ️德|de|germany|🇩🇪🕳ℹ️gb|gb-auto🏷ℹ️英|uk|unitedkingdom|united kingdom|🇬🇧🕳ℹ️kr|kr-auto🏷ℹ️韩|kr|korea|southkorea|🇰🇷🕳ℹ️fr|fr-auto🏷ℹ️法|fr|france|🇫🇷🕳ℹ️nl|nl-auto🏷ℹ️荷|nl|netherlands|🇳🇱🕳ℹ️in|in-auto🏷ℹ️印|india|🇮🇳🕳ℹ️tr|tr-auto🏷ℹ️(🇹🇷)|(土)|(Türkiye)|turkey

其实就是分国家组啦 脚本如果有需要自行看js内容

最后点 即使预览 就能copy 整份 配置的 json文件了

4. 运行singbox

# 先进入到singbox目录 然后执行
.\singbox.exe run -c .\singbox.json

就能跑起来咯, 不过不好的地方就是目前是 cli 的形式 ,就是启动后的 cmd or powershell 需要放在后台, 后面有空在把静默启动的教程也一并写入吧~

5. 参考文档

  1. 不良林
  2. sing-box 官方文档
  3. 初步fakeip配置文件
  4. tp.js 来源

6. 仓库地址

自己的配置仓库地址 如果有用,欢迎各位帅哥点个小小的star​:sparkles:~

包含自用的 clash(mihomo) surge singbox 配置

186 Likes

说的不错,但是不用

4 Likes

希望早点有解析器

2 Likes

感谢分享,点赞

4 Likes

最近也看了几个,nekobox、clash meta、sing-box等,能否详细解析一下?目前知道neko使用的 Sing-box 内核。nekobox开启后导致很多应用自动重启了,不确定是不是设置问题。

2 Likes

nekobox我没折腾过 还真不知道
我是裸singbox内核启动的

虽然但是系列,
singbox的作者有问题,请谨慎使用,

另外大家用的时候要知道自己到底再用什么,vmess vless ss reality还是其他

1 Like

可否细说(

1 Like

感谢教程

又来这么晚 大帅哥今天不帅 :face_with_raised_eyebrow:

2 Likes

你说我不帅,我给你两拳

2 Likes

Hiddify 不太敢用

1 Like

关于client_subnet有个疑问,正常发起dns请求,如果是国外的网站,走的google doh,拿到的cdn ip应该也是跟client_subnet指定的ip最相近的地址吧?最终是节点发起请求,节点还是会重新请求一遍dns解析吧?那这个配置有意思吗

1 Like

逻辑错了
假设现在已经拿到了 google doh 的 ip (8.8.8.8) (这个假设是为了忽略使用节点去请求doh拿doh服务器的ip过程)
那没接下来这个网站的请求就是会请求 google dns 的ip
但是由于路由的规则 没有涵盖 这个网站 也就是走向了 final
final 就是你 的节点
所以 实际上 你在获取这个网站的ip的时候 已经是从 你的节点 发出的 不过 client_subnet 的作用就是告诉 google的dns 你要返回给我 离 节点 最近的地址

不过这个client_subnet = “1.0.1.0” 我感觉更针对的是 没被geo记录的小众国内网站 使得他们不管套没套cdn 最后返回的其实都是国内的ip
假设dns 返回 回来套了cdn 离 final 节点 更近的是 2.2.2.2 这个ip 但是由于 1.0.1.0 是中国的ip 所以他还是会重新获取到国内的ip地址(指代cdn) 所以还是国内的
如果没套cdn 那就是直接返回的国内的ip 也是直接进行访问

我的描述可能有点绕 没有图文直观 可以参考下 不良林 的视频

不良林的视频我也看了。

现在我要访问一个 out.com

第一种情况,我们假设它是国内的小众网站 , geosite没收录。
首先是解析dns(前提已经获取了8.8.8.8的ip),根据dns规则,走google doh
然后这个dns请求交给 google doh,发现携带了client_subnet,返回了一个离 1.0.1.0 最近的ip(这个ip我查了下,好像是福建的?)然后返回国内ip,命中geoip,直接访问,没问题

第二种情况,他是国外的网站
首先是解析dns,根据dns规则,走google doh,这个时候携带client_subnet,
那不是会返回一个离1.0.1.0最近的ip么,假设返回了一个香港ip,访问从节点出去

假设节点是美国节点
在开启 sniff_override_destination 的情况下,节点还是需要拿到域名再解析一遍dns吧?这个时候有什么意义吗?
如果没开启 sniff_override_destination,这个时候节点拿到的是不是香港ip,节点需要先回香港获取数据,然后再返回给节点,节点再返回给我们么?

1 Like

如果开覆写 好像确实没意义了 (而且覆写好复杂 我没开启)

得分情况吧
1.他是国外网站 没有套cdn
那返回的就是他自己的ip 而这个时候一般就会直接走 !geoip-cn 也就是 proxy
2.他是国外网站 套了cdn
那返回的就是离美国节点 更近的cdn ip 然后 再从 美国节点那边拿数据 再通过singbox内核返回回来
因为他本身就不是国内小众网站 我觉得 1.0.1.0 就有点 形同虚设了

11 Likes

sing-box realip 的配置,怎么说呢,更多是解决 fakeip 模式下一些使用的小问题,比如游戏啥啥的。

不良林那种 dns 配置写法,在 sing-box 使用系统代理或者 fakeip 模式时,正常的国外域名访问都是没有影响的,因为匹配到国外域名规则集或者兜底,直接通过节点封装到服务器了。

有一个问题就是在 realip 模式下,正常的国外域名通过解析获取到 ip 后,通过规则集判断为代理出站后,如果开启复写,那么传递的还是域名,也可以获得节点附近的 cdn 加速。如果没开启复写,那么传递的有可能是 IP,封装到服务器后,因为 client_subnet 是国内 IP ,获取的也是周边的地区 IP,反正离服务器的位置较远,无法获得 cdn 的加速。当然,大多数情况使用的是香港,日本,体验也不会很明显。

(不是,有谁知道,开启复写后,IP 转为域名的行为,是在规则匹配前还是规则匹配之后,哪位大佬晓得吗,不然最终结果不一样啊!!!)

上面还是国外正常域名,如果是国内小众域名,那意味着只可以使用国外 dns 获得域名解析 IP,通过 client_subnet 设置。这里有两种情况,如果没有套 cdn,也就只有一个 IP,那就直接是国内 IP,这里有疑问了,复写是在这个 IP 匹配规则前,还是匹配规则后。如果是规则前,大概率会匹配中国内 ip 数据库,走直连。如果是规则后,那就还是走代理。有套 cdn 的话,依旧是国内 IP 或者 附近地区的 IP,结论也和上面类似。

以上的种种情况,由于对复写这个功能的不确定性,最终结论暂无定论。不过无论复写怎么起作用,一个结论还是可以确定的,他的这种写法有点不合适。我看了一下官方的写法,就没有这样的问题了,不良林大佬这里属于魔改了一下。

官方 dns 模块就是正常配置,client_subnet 交由 logical and 匹配,只有域名是非国外的且 IP 是国内的,才会匹配到这条规则。这条规则十分苛刻,虽然难以匹配到,但也符合小众国内网站的苛刻性,官方这个逻辑也十分合理。十分推荐使用官方的这个写法,不良林大佬的写法暂时先搁置吧。

{
  "dns": {
    "servers": [
      {
        "tag": "google",
        "address": "tls://8.8.8.8"
      },
      {
        "tag": "local",
        "address": "https://223.5.5.5/dns-query",
        "detour": "direct"
      }
    ],
    "rules": [
      {
        "outbound": "any",
        "server": "local"
      },
      {
        "clash_mode": "Direct",
        "server": "local"
      },
      {
        "clash_mode": "Global",
        "server": "google"
      },
      {
        "rule_set": "geosite-geolocation-cn",
        "server": "local"
      },
      {
        "type": "logical",
        "mode": "and",
        "rules": [
          {
            "rule_set": "geosite-geolocation-!cn",
            "invert": true
          },
          {
            "rule_set": "geoip-cn"
          }
        ],
        "server": "google",
        "client_subnet": "114.114.114.114/24" // Any China client IP address
      }
    ]
  },
  "route": {
    "rule_set": [
      {
        "type": "remote",
        "tag": "geosite-geolocation-cn",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-geolocation-cn.srs"
      },
      {
        "type": "remote",
        "tag": "geosite-geolocation-!cn",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-geolocation-!cn.srs"
      },
      {
        "type": "remote",
        "tag": "geoip-cn",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-cn.srs"
      }
    ]
  },
  "experimental": {
    "cache_file": {
      "enabled": true,
      "store_rdrc": true
    },
    "clash_api": {
      "default_mode": "Enhanced"
    }
  }
}
5 Likes

当然 sniff 这个参数都在入站里,所以更倾向于规则匹配前开启复写,那么还是更推荐官方配置,等有空找找小众网站域名和对比服务器日志再说,目前上面结论还不确定。

2 Likes

继上面的问题延续,搜索到了 Xray 对 sniffing 的处理,默认情况下,流程如下:

  1. 如有一个设备上网,去访问 abc.com,首先设备通过 DNS 查询得到 abc.com 的 IP 是 1.2.3.4,然后设备会向 1.2.3.4 去发起连接.
  2. 如果不设置嗅探,Xray 收到的连接请求是 1.2.3.4,并不能用于域名规则的路由分流.
  3. 当设置了 sniffing 中的 enable 为 true,Xray 处理此连接的流量时,会从流量的数据中,嗅探出域名,即 abc.com
  4. Xray 会把 1.2.3.4 重置为 abc.com.路由就可以根据域名去进行路由的域名规则的分流

同时还有一个 destOverride 参数, Xray只会嗅探 destOverride 中协议的域名用作路由,如果只想进行嗅探用作路由而不想重置目标地址(如使用Tor浏览器时,重置目标地址会导致无法连接),请在这里添加对应的协议并启用 routeOnly

所以综合上面 xray 对嗅探和复写的操作,域名先解析为 ip 后,数据被劫持,开启嗅探后,会直接把 IP 先处理为域名进行规则匹配,如果是代理出站,那么 destOverride 开启的话,会直接传递域名到服务器,想要传递 IP 的话,就在 destOverride 中忽略,默认情况是被解析为 IP 地址的域名,通过嗅探功能恢复成域名,然后进行域名分流匹配,代理出站的话,默认就直接使用被嗅探恢复的域名封装到服务器。如果不想封装的是域名,那就在 destOverride 中设置,封装的就是域名解析后的 IP。

当然以上是 xray 的处理方式,只是作为 sing-box 处理的参考,因此最后还是推荐官方的 dns 设置参考,不良林大佬的设置存在比较大的问题。

有兴趣可以看一下 xray 官方对嗅探的讲解:入站代理 | Project X

3 Likes

很好的教程啊,不错

2 Likes