ShellCrash中如何自定义singbox的各json模块

·singbox中各个json模块的基本结构:

singbox在启动时,会自动将指定目录下的json文件加载及合并运行

每个json文件必须具有标准的json结构,否则就会报错

{
  "log": {},
  "dns": {},
  "ntp": {},
  "certificate": {},
  "inbounds": [],
  "outbounds": [],
  "providers": [], //限reF1nd分支内核
  "route": {},
  "endpoints": [],
  "experimental": {}
}

例如如果想要自定义dns.json模块

则内部结构必须是如下的形式,即开头和结尾的1级花括号必须存在!

{
  "dns": {
    "servers": [……]
  }
}

具体的格式可以在正确运行singbox内核后,参考/tmp/ShellCrash/jsons 目录下的相关文件

你也可以通过 https://www.json.cn 来在线解析json格式是否正确

·ShellCrash中自定义配置文件的名称及目录:

目前 log dns ntp experimental 是替换内置设定而非合并,即自定义的内容会覆盖脚本生成的内容,需要谨慎使用,请确保不会影响脚本内置功能的使用

inbounds outbounds providers route rule-set 则是与基础的config.json配置文件中的内容合并,注意singbox并不是增量合并,如果自定义内容和配置文件中的原有内容出现重复或者冲突,则内核依然会无法运行

各个模块的自定义文件必须放在ShellCrash安装目录下的jsons文件夹内!

且文件名必须是log.json、dns.json、outbounds.json…… 等,不得随意更改,否则不会加载!

·配置文件示例:

示例:自定义log等级

编辑$CRASHDIR/jsons/log.json文件:

{ 
  "log": { 
    "level": "debug",
    "timestamp": true
  }
}

示例:启用ntp服务

编辑$CRASHDIR/jsons/ntp.json文件:

{
  "ntp": {
    "enabled": true,
    "server": "time.apple.com",
    "server_port": 123,
    "interval": "30m"
  }
}

示例:自定义providers,实现在线更新订阅

注意:providers功能仅限reF1nd版内核使用!

注意:每个例如"my_airport1"的tag应当在outbounds模块中被正确引用!你可以通过搭配自定义outbounds.json来使用!

注意:多个平级的{}之间需要使用逗号连接,如果只有一个同级{}则不要写逗号!

具体字段内容可以参考:订阅 - sing-box (dustinwin.us.kg)

编辑$CRASHDIR/jsons/providers.json文件:

{
  "providers": [
    {
      "type": "remote",
      "tag": "my_airport1",
      "url": "https://my_airport1.com/asdfghjkl123",
      "path": "./providers/my_airport1.yaml",
      "user_agent": "clash.meta;mihomo",
      "update_interval": "24h0m0s",
      "health_check": {
        "enabled": true,
        "url": "https://www.gstatic.com/generate_204",
        "interval": "10m0s",
        "timeout": "3s"
      },
      "override_tls": {
        "enabled": true,
        "insecure": true
      }
    },
    {
      "type": "remote",
      "tag": "my_airport2",
      "url": "https://my_airport2.com/asdfghjkl123",
      "path": "./providers/my_airport2.yaml",
      "user_agent": "clash.meta;mihomo",
      "update_interval": "24h0m0s",
      "health_check": {
        "enabled": true,
        "url": "https://www.gstatic.com/generate_204",
        "interval": "10m0s",
        "timeout": "3s"
      },
      "override_tls": {
        "enabled": true,
        "insecure": true
      }
    }
  ]
}

编辑$CRASHDIR/jsons/outbounds.json文件以引用providers:

注意:如果你还想编辑自定义节点或者其他outbounds模块内容,必须都写在同一个文件内,脚本不会加载诸如outbounds2.json这样的文件,多个平级的{}之间请使用逗号连接,如果只有一个同级{}则不要写逗号!

{
  "outbounds": [
    {
      "type": "selector",
      "tag": "🇭🇰 香港节点",
      "providers": [ "my_airport1" ],
      "includes": [ "香港.*BGP" ],
      "use_all_providers": true
    },
    {
      "type": "urltest",
      "tag": "🇸🇬 新加坡节点",
      "tolerance": 100,
      "providers": [ "my_airport2" ],
      "includes": [ "新加坡" ],
      "use_all_providers": true
    }
  ]
}

示例:自定义outbounds,实现自定义节点或策略组

注意:每个例如"my_airport1"的tag应当在outbounds模块中被正确引用!你可以通过搭配自定义outbounds.json来使用!

注意:多个平级的{}之间需要使用逗号连接,如果只有一个同级{}则不要写逗号!

具体字段内容可以参考:官方文档

编辑$CRASHDIR/jsons/outbounds.json文件:

{
  "outbounds": [
    {
      "type": "trojan",
      "tag": "my_trojan1",
      "server": "example.my_trojan.com",
      "server_port": 443,
      "password": "123321",
      "tls": {
        "enabled": true,
        "insecure": true
      }
    },
    {
      "type":"shadowsocks",
      "tag":"my_ss1",
      "server":"example.my_ss.com",
      "server_port":10001,
      "method":"2022-blake3-aes-128-gcm",
      "password":"8JCsPssfgS8tiRwiMlhARg==",
      "tcp_fast_open":false
    },
    {
      "type": "selector",
      "tag": "🚀 自建手选",
      "outbounds": [
        "my_trojan1",
        "my_ss1"
      ]
    },
    {
      "type": "urltest",
      "tag": "♻️ 自建自动",
      "outbounds": [
        "my_trojan1",
        "my_ss1"
      ],
      "url": "https://www.gstatic.com/generate_204",
      "interval": "5m0s",
      "tolerance": 50
    },
    {
      "type": "selector",
      "tag": "🛑 广告拦截",
      "outbounds": [
        "DIRECT",
        "REJECT"
      ]
    }
  ]
}

示例:自定义shadowsocks/hysteria2等协议入站

注意:如果你想自定义二级或者更低等级的json字段,则其上级字段也必须包含在文件中,否则singbox内核无法完成合并

具体字段内容可以参考:官方文档

注意:多个平级的{}之间需要使用逗号连接,如果只有一个同级{}则不要写逗号!

编辑$CRASHDIR/jsons/inbounds.json文件:

{
  "inbounds": [
    {
      "type": "shadowsocks",
      "tag": "ss-in",
      "listen": "::",
      "listen_port": 24678,
      "sniff": true,
      "method": "2022-blake3-aes-128-gcm",
      "password": "8JCsPssfgS8tiRwiMlhARg==",
      "multiplex": {}
    },
    {
      "type": "hysteria2",
      "tag": "hy2-in",
      "listen": "::",
      "listen_port": 24678,
      "sniff": true,
      "up_mbps": 100,
      "down_mbps": 100,
      "obfs": {
        "type": "salamander",
        "password": "cry_me_a_r1ver"
      },
      "users": [
        {
          "name": "tobyxdd",
          "password": "goofy_ahh_password"
        }
      ],
      "ignore_client_bandwidth": false,
      "tls": {},
      "masquerade": "",
      "brutal_debug": false
    }
  ]
}

示例:启用Tailscale异地组网客户端

注意:默认内核为了节约内存考虑并为编译tailscale支持,请前往更新-内核-自定义内核界面下载安装完整版singbox内核

注意:需要在Tailscale官网创建账号后,在Keys - Tailscale界面创建Auth key并填入"auth_key":中方可正确连接!

注意:多个平级的{}之间需要使用逗号连接,如果只有一个同级{}则不要写逗号!

具体字段内容可以参考:官方文档

编辑$CRASHDIR/jsons/endpoints.json文件:

{
  "endpoints": [
    {
	  "type": "tailscale",
	  "tag": "ts-ep",
	  "state_directory": "/tmp/ShellCrash/tailscale",
	  "auth_key": "tskey-auth-abcddsfqwe-12315kjdlasjlfjljg",  //此处换成你自己的auth_key
	  "control_url": "",
	  "ephemeral": false,
	  "hostname": "ShellCrash",
	  "accept_routes": true,
	  "exit_node": "",    //默认直连,如果延迟高可以尝试换成你希望使用的代理出口,不推荐
	  "exit_node_allow_lan_access": false,
	  "advertise_routes": [],
	  "advertise_exit_node": false,
	  "udp_timeout": "5m"
    }
  ]
}

示例:启用内核内置缓存功能

注意:本处示例仅支持1.8.0以上版本singbox内核

注意:由于experimental.json是完全覆盖脚本内置设置,故如果需要使用clash面板就必须同时写入clash_api相关内容

注意:多个平级的{}之间需要使用逗号连接,如果只有一个同级{}则不要写逗号!

编辑$CRASHDIR/jsons/experimental.json文件:

{
  "experimental": {
    "clash_api": {
      "external_controller": "0.0.0.0:9999",
      "external_ui": "ui",
      "external_ui_download_url": "",
      "secret": "",
      "default_mode": "Rule"
    },
    "cache_file": {
      "enabled": true,
      "path": "",
      "cache_id": "",
      "store_fakeip": false
    }
  }
}

示例:自定义路由规则

注意:如果你想自定义二级或者更低等级的json字段,则其上级字段也必须包含在文件中,否则singbox内核无法完成合并

注意:多个平级的{}之间需要使用逗号连接,如果只有一个同级{}则不要写逗号!

注意:简单规则推荐使用脚本内置:6-6-2自定义规则功能进行编辑,更简单直观!

具体字段内容可以参考:官方文档

编辑$CRASHDIR/jsons/route.json文件:

{
  "route": {
    "rules": [
      { "inbound": [ "mixed-in" ], "outbound": "GLOBAL" },
      {
        "domain": [
          "example.a.com",
          "example.b.com"
        ],
        "domain_suffix": [
          "acl4.ssr",
          "ip6-localhost"
        ],
        "ip_cidr": [
          "0.0.0.0/8",
          "10.0.0.0/8"
        ],
        "outbound": "🎯 全球直连"
      },
      { "domain_suffix": [ "example.com" ], "outbound": "🚀 节点选择" },
      { "domain_keyword": [ "baidu" ], "outbound": "DIRECT" },
      { "source_ip_cidr": [ "10.0.0.0/24" ], "outbound": "REJECT" },
      { "rule-set": [ "geoip-cn" ], "outbound": "DIRECT" }
    ]
  }
}

示例:自定义rule-set规则

注意:如果你想自定义二级或者更低等级的json字段,则其上级字段也必须包含在文件中,否则singbox内核无法完成合并

注意:多个平级的{}之间需要使用逗号连接,如果只有一个同级{}则不要写逗号!

注意:你需要通过route.json模块或者dns.json模块来调用rule-set规则,详见示例:自定义路由规则示例:自定义DNS

具体字段内容可以参考:官方文档

编辑$CRASHDIR/jsons/rule-set.json文件:

{
  "route": {
    "rule_set": [
      {
        "tag": "geoip-cn",
        "type": "local",
        "format": "binary",
        "path": "./geoip-cn.sys"
      },
      {
        "tag": "geoip-us",
        "type": "remote",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-us.srs",
        "download_detour": "proxy"
      }      
    ]
  }
}

示例:自定义DNS

注意:由于dns.json是完全覆盖脚本内置设置,所以如需使用fakeip则切勿更改fakeip_range,以免引起回环!

注意:多个平级的{}之间需要使用逗号连接,如果只有一个同级{}则不要写逗号!

具体字段内容可以参考:官方文档

编辑$CRASHDIR/jsons/dns.json文件:

{
  "dns": {
    "servers": [
      {
        "tag": "dns_proxy",
        "type": "https",
        "server": "doh.pub",
		"routing_mark": 7894,
		"detour": "👑 高级节点",
        "domain_resolver": "dns_resolver"
      },
      {
        "tag": "dns_direct",
        "type": "https",
        "server": "doh.pub",
		"routing_mark": 7894,
        "domain_resolver": "dns_resolver"
      },
      {
        "tag": "dns_fakeip",
        "type": "fakeip",
        "inet4_range": "28.0.0.1/8",
        "inet6_range": "fc00::/16"
      },
      {
        "tag": "dns_resolver",
        "type": "https",
        "server": "223.5.5.5",
		"routing_mark": 7894
      }
    ],
    "rules": [
      { "clash_mode": "Direct", "server": "dns_direct", "strategy": "prefer_ipv4" },  
      { "domain_suffix": ["services.googleapis.cn"], "server": "dns_fakeip", "strategy": "prefer_ipv4", "rewrite_ttl": 1 },
      { "domain": ["time-ios.apple.com", "time1.cloud.tencent.com", "music.163.com", "musicapi.taihe.com", "music.taihe.com", "songsearch.kugou.com", "trackercdn.kugou.com", "api-jooxtt.sanook.com", "api.joox.com", "joox.com", "y.qq.com", "streamoc.music.tc.qq.com", "mobileoc.music.tc.qq.com", "isure.stream.qqmusic.qq.com", "dl.stream.qqmusic.qq.com", "aqqmusic.tc.qq.com", "amobile.music.tc.qq.com", "music.migu.cn", "localhost.ptlogin2.qq.com", "localhost.sec.qq.com", "xnotify.xboxlive.com", "proxy.golang.org", "heartbeat.belkin.com", "mesu.apple.com", "swscan.apple.com", "swquery.apple.com", "swdownload.apple.com", "swcdn.apple.com", "swdist.apple.com", "lens.l.google.com", "na.b.g-tun.com", "ff.dorado.sdo.com", "shark007.net", "adguardteam.github.io", "adrules.top", "anti-ad.net", "local.adguard.org", "static.adtidy.org", "ps.res.netease.com"], "server": "dns_direct" },
      { "domain_suffix": ["*", "lan", "localdomain", "example", "invalid", "localhost", "test", "local", "home.arpa", "direct", "time.edu.cn", "ntp.org.cn", "pool.ntp.org", "music.163.com", "126.net", "kuwo.cn", "y.qq.com", "xiami.com", "music.migu.cn", "msftconnecttest.com", "msftncsi.com", "steamcontent.com", "srv.nintendo.net", "n.n.srv.nintendo.net", "cdn.nintendo.net", "battle.net", "battlenet.com.cn", "wotgame.cn", "wggames.cn", "wowsgame.cn", "wargaming.net", "linksys.com", "linksyssmartwifi.com", "router.asus.com", "nflxvideo.net", "square-enix.com", "finalfantasyxiv.com", "ffxiv.com", "ff14.sdo.com", "mcdn.bilivideo.cn", "media.dssott.com", "market.xiaomi.com", "cmbchina.com", "cmbimg.com", "sandai.net", "n0808.com", "3gppnetwork.org", "uu.163.com", "pub.3gppnetwork.org", "oray.com", "orayimg.com", "gcloudcs.com", "gcloudsdk.com"], "server": "dns_direct" },
      { "domain_regex": ["time.*.com", "time.*.gov", "time.*.edu.cn", "time.*.apple.com", "time1.*.com", "time2.*.com", "time3.*.com", "time4.*.com", "time5.*.com", "time6.*.com", "time7.*.com", "ntp.*.com", "ntp1.*.com", "ntp2.*.com", "ntp3.*.com", "ntp4.*.com", "ntp5.*.com", "ntp6.*.com", "ntp7.*.com", "localhost.*.weixin.qq.com", "xbox.*.*.microsoft.com", ".*.*.xboxlive.com", "xbox.*.microsoft.com", ".+.stun.*.*", ".+.stun.*.*.*", ".+.stun.*.*.*.*", ".+.stun.*.*.*.*.*"], "server": "dns_direct" },
	  { "clash_mode": "Global", "query_type": ["A", "AAAA"], "server": "dns_fakeip", "strategy": "prefer_ipv4", "rewrite_ttl": 1 },
      { "rule_set": ["geosite-cn"], "server": "dns_direct" },
      { "query_type": ["A", "AAAA"], "server": "dns_fakeip", "strategy": "prefer_ipv4", "rewrite_ttl": 1 }
    ],
    "final": "dns_proxy",
	"strategy": "prefer_ipv4",
    "independent_cache": true,
    "reverse_mapping": true
  }
}

需要更简单的配置模版?

可参考:DustinWin-sing-box教程基础篇 进行配置!