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

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

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

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

{
  "log": {},
  "dns": {},
  "inbounds": [],
  "outbounds": [],
  "outbound_providers": [], //限PuerNya版内核
  "route": {},
  "experimental": {}
}

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

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

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

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

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

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

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

inbounds outbounds outbound_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": false
  }
}

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

注意:outbound_providers功能仅限PuerNya版内核使用!

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

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

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

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

{
  "outbound_providers": [
    {
      "tag": "my_airport1",
      "type": "http",
      "healthcheck_url": "https://www.gstatic.com/generate_204",
      "healthcheck_interval": "10m",
      "download_url": "example.your_airport1.com",
      "path": "./yamls/your_airport1.yaml",
      "download_ua": "clash.meta",
      "download_interval": "24h",
      "download_detour": "DIRECT",
      "override_dialer": { "domain_strategy": "prefer_ipv6" }
    },
    {
      "tag": "my_airport2",
      "type": "http",
      "healthcheck_url": "https://www.gstatic.com/generate_204",
      "healthcheck_interval": "10m",
      "download_url": "example.your_airport2.com",
      "path": "./yamls/your_airport2.yaml",
      "download_ua": "clash.meta",
      "download_interval": "24h",
      "download_detour": "DIRECT",
      "override_dialer": { "domain_strategy": "prefer_ipv6" }
    }
  ]
}

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

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

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

示例:自定义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/inbound.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
    }
  ]
}

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

注意:本处示例仅支持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",
      "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" } //注意:仅限1.8.0以上版本内核搭配自定义rule-set规则使用
    ]
  }
}

示例:自定义rule-set规则

注意:仅限1.8.0以上版本singbox内核

注意:如果你想自定义二级或者更低等级的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",
      "address": "tls://1.0.0.1:853",
      "strategy": "prefer_ipv4",
      "address_resolver": "dns_resolver"
    }, {
      "tag": "dns_direct",
      "address": "https://223.5.5.5/dns-query",
      "strategy": "prefer_ipv4",
      "address_resolver": "dns_resolver",
      "detour": "DIRECT"
    }, {
      "tag": "dns_fakeip",
      "address": "fakeip"
    }, {
      "tag": "dns_resolver",
      "address": "223.5.5.5",
      "detour": "DIRECT"
    }, {
      "tag": "block",
      "address": "rcode://success"
    }
    ],
    "rules": [
    {
      "outbound": ["any"],
      "server": "dns_resolver"
    }, {
      "geosite": ["cn"],
	  "query_type": [ "A", "AAAA" ],
      "server": "dns_direct"
	}, {
      "geosite": ["geolocation-!cn"],
	  "query_type": [ "A", "AAAA" ],
      "server": "dns_fakeip"
    },
    { 
      "rule-set": [ "geosite-cn" ],
      "query_type": [ "A", "AAAA" ],
      "server": "dns_direct"
    } //注意:仅限1.8.0以上版本内核搭配自定义rule-set规则使用
    ],
    "final": "dns_direct",
    "independent_cache": true,
    "reverse_mapping": true,
    "fakeip": { "enabled": true, "inet4_range": "198.18.0.0/16", "inet6_range": "fc00::/16" }
  }
}

需要更简单的配置模版?

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