Files

3996 lines
91 KiB
JSON

{
"sections": [
{
"id": "TypedSection:#0",
"kind": "TypedSection",
"tabs": [],
"options": [],
"subsection": null
},
{
"id": "NamedSection:config#1",
"kind": "NamedSection",
"name": "config",
"tabs": [
[
"routing",
"Routing Settings"
],
[
"routing_node",
"Routing Nodes"
],
[
"routing_rule",
"Routing Rules"
],
[
"dns",
"DNS Settings"
],
[
"dns_server",
"DNS Servers"
],
[
"dns_rule",
"DNS Rules"
],
[
"ruleset",
"Rule Set"
],
[
"dns_cache",
"DNS Settings"
],
[
"control",
"Access Control"
],
[
"udp_nat",
"UDP NAT Settings"
],
[
"tun_dns",
"TUN DNS"
]
],
"options": [
{
"kind": "ListValue",
"name": "main_node",
"title": "Main node",
"description": null,
"depends": [
{
"routing_mode": "custom",
"!reverse": true
}
],
"values": [
[
"nil",
"Disable"
],
[
"urltest",
"URLTest"
]
],
"subsection": null,
"props": {
"default": "nil",
"rmempty": false
}
},
{
"kind": "CBI.StaticList",
"name": "main_urltest_nodes",
"title": "URLTest nodes",
"description": "List of nodes to test.",
"depends": [
[
"main_node",
"urltest"
]
],
"values": [],
"subsection": null,
"props": {
"rmempty": false
}
},
{
"kind": "Value",
"name": "main_urltest_interval",
"title": "Test interval",
"description": "The test interval in seconds.",
"depends": [
[
"main_node",
"urltest"
]
],
"values": [],
"subsection": null,
"props": {
"datatype": "uinteger",
"placeholder": "180"
}
},
{
"kind": "Value",
"name": "main_urltest_tolerance",
"title": "Test tolerance",
"description": "The test tolerance in milliseconds.",
"depends": [
[
"main_node",
"urltest"
]
],
"values": [],
"subsection": null,
"props": {
"datatype": "uinteger",
"placeholder": "50"
}
},
{
"kind": "ListValue",
"name": "main_udp_node",
"title": "Main UDP node",
"description": null,
"depends": [
{
"routing_mode": {},
"proxy_mode": {}
}
],
"values": [
[
"nil",
"Disable"
],
[
"same",
"Same as main node"
],
[
"urltest",
"URLTest"
]
],
"subsection": null,
"props": {
"default": "nil",
"rmempty": false
}
},
{
"kind": "CBI.StaticList",
"name": "main_udp_urltest_nodes",
"title": "URLTest nodes",
"description": "List of nodes to test.",
"depends": [
[
"main_udp_node",
"urltest"
]
],
"values": [],
"subsection": null,
"props": {
"rmempty": false
}
},
{
"kind": "Value",
"name": "main_udp_urltest_interval",
"title": "Test interval",
"description": "The test interval in seconds.",
"depends": [
[
"main_udp_node",
"urltest"
]
],
"values": [],
"subsection": null,
"props": {
"datatype": "uinteger",
"placeholder": "180"
}
},
{
"kind": "Value",
"name": "main_udp_urltest_tolerance",
"title": "Test tolerance",
"description": "The test tolerance in milliseconds.",
"depends": [
[
"main_udp_node",
"urltest"
]
],
"values": [],
"subsection": null,
"props": {
"datatype": "uinteger",
"placeholder": "50"
}
},
{
"kind": "ListValue",
"name": "routing_mode",
"title": "Routing mode",
"description": null,
"depends": [],
"values": [
[
"gfwlist",
"GFWList"
],
[
"bypass_mainland_china",
"Bypass mainland China"
],
[
"proxy_mainland_china",
"Only proxy mainland China"
],
[
"custom",
"Custom routing"
],
[
"global",
"Global"
]
],
"subsection": null,
"props": {
"default": "bypass_mainland_china",
"onchange": "fn(87:72b58d771c8b)",
"rmempty": false
}
},
{
"kind": "Value",
"name": "routing_port",
"title": "Routing ports",
"description": "Specify target ports to be proxied. Multiple ports must be separated by commas.",
"depends": [],
"values": [
[
"",
"All ports"
],
[
"common",
"Common ports only (bypass P2P traffic)"
]
],
"subsection": null,
"props": {
"validate": "fn(376:3a1eaf5f61c2)"
}
},
{
"kind": "ListValue",
"name": "proxy_mode",
"title": "Proxy mode",
"description": null,
"depends": [],
"values": [
[
"redirect",
"Redirect TCP"
],
[
"redirect_tproxy",
"Redirect TCP + TProxy UDP"
],
[
"redirect_tun",
"Redirect TCP + Tun UDP"
],
[
"tun",
"Tun TCP/UDP"
]
],
"subsection": null,
"props": {
"default": "redirect_tproxy",
"rmempty": false
}
},
{
"kind": "Flag",
"name": "ipv6_support",
"title": "IPv6 support",
"description": null,
"depends": [],
"values": [],
"subsection": null,
"props": {
"rmempty": false
}
},
{
"kind": "Flag",
"name": "sniffer_advanced_mode",
"title": "Sniffer: advanced mode (100ms, universal list)",
"description": "Use the tutorial-recommended sniffer profile (100ms timeout, http/tls/stun/quic/dns). Default keeps the 300ms / unconstrained-list behaviour.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"default": "0",
"rmempty": false
}
},
{
"kind": "SectionValue",
"name": "_routing",
"description": "routing",
"depends": [
[
"routing_mode",
"custom"
]
],
"values": [],
"subsection": {
"id": "GridSection:_routing#2",
"kind": "GridSection",
"name": "_routing",
"tabs": [],
"options": [
{
"kind": "ListValue",
"name": "tcpip_stack",
"title": "TCP/IP stack",
"description": "TCP/IP stack.",
"depends": [
[
"homeproxy-pro.config.proxy_mode",
"redirect_tun"
],
[
"homeproxy-pro.config.proxy_mode",
"tun"
]
],
"values": [
[
"mixed",
"Mixed"
],
[
"gvisor",
"gVisor"
],
[
"system",
"System"
]
],
"subsection": null,
"props": {
"default": "system",
"onchange": "fn(373:f3ab42d1ca03)",
"rmempty": false
}
},
{
"kind": "Flag",
"name": "endpoint_independent_nat",
"title": "Enable endpoint-independent NAT",
"description": "Performance may degrade slightly, so it is not recommended to enable on when it is not needed.",
"depends": [
[
"tcpip_stack",
"mixed"
],
[
"tcpip_stack",
"gvisor"
]
],
"values": [],
"subsection": null,
"props": {
"rmempty": false
}
},
{
"kind": "Value",
"name": "udp_timeout",
"title": "UDP NAT expiration time",
"description": "In seconds.",
"depends": [
[
"homeproxy-pro.config.proxy_mode",
"redirect_tproxy"
],
[
"homeproxy-pro.config.proxy_mode",
"redirect_tun"
],
[
"homeproxy-pro.config.proxy_mode",
"tun"
]
],
"values": [],
"subsection": null,
"props": {
"datatype": "uinteger",
"placeholder": "300"
}
},
{
"kind": "Flag",
"name": "bypass_cn_traffic",
"title": "Bypass CN traffic",
"description": "Bypass mainland China traffic via firewall rules by default.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"rmempty": false
}
},
{
"kind": "Flag",
"name": "find_neighbor",
"title": "Find neighbor hosts",
"description": "Enable neighbor resolution so rules can match LAN devices by hostname (1.14).",
"depends": [],
"values": [],
"subsection": null,
"props": {
"rmempty": false
}
},
{
"kind": "ListValue",
"name": "domain_strategy",
"title": "Domain strategy",
"description": "If set, the requested domain name will be resolved to IP before routing.",
"depends": [],
"values": [
[
"",
"Default"
],
[
"prefer_ipv4",
"Prefer IPv4"
],
[
"prefer_ipv6",
"Prefer IPv6"
],
[
"ipv4_only",
"IPv4 only"
],
[
"ipv6_only",
"IPv6 only"
]
],
"subsection": null,
"props": {}
},
{
"kind": "ListValue",
"name": "default_outbound",
"title": "Default outbound",
"description": "Default outbound for connections not matched by any routing rules.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"default": "nil",
"load": "fn(347:bdff551797c2)",
"rmempty": false
}
},
{
"kind": "ListValue",
"name": "default_outbound_dns",
"title": "Default outbound DNS",
"description": "Default DNS server for resolving domain name in the server address.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"default": "default-dns",
"load": "fn(326:345de0db50cf)",
"rmempty": false
}
}
],
"subsection": null
},
"props": {}
},
{
"kind": "SectionValue",
"name": "_routing_node",
"description": "routing_node",
"depends": [
[
"routing_mode",
"custom"
]
],
"values": [],
"subsection": {
"id": "GridSection:_routing_node#3",
"kind": "GridSection",
"name": "_routing_node",
"tabs": [],
"options": [
{
"kind": "Value",
"name": "label",
"title": "Label",
"description": null,
"depends": [],
"values": [],
"subsection": null,
"props": {
"load": "bind(206:006f14096ca5;\"homeproxy-pro\")",
"modalonly": true,
"validate": "bind(461:3a6d28762720;\"homeproxy-pro\",\"routing_node\",\"label\")"
}
},
{
"kind": "Flag",
"name": "enabled",
"title": "Enable",
"description": null,
"depends": [],
"values": [],
"subsection": null,
"props": {
"editable": true,
"rmempty": false
}
},
{
"kind": "ListValue",
"name": "node",
"title": "Node",
"description": "Outbound node",
"depends": [],
"values": [
[
"urltest",
"URLTest"
]
],
"subsection": null,
"props": {
"editable": true,
"validate": "bind(461:3a6d28762720;\"homeproxy-pro\",\"routing_node\",\"node\")"
}
},
{
"kind": "ListValue",
"name": "domain_resolver",
"title": "Domain resolver",
"description": "For resolving domain name in the server address.",
"depends": [
{
"node": "urltest",
"!reverse": true
}
],
"values": [],
"subsection": null,
"props": {
"load": "fn(356:d9c0755071ec)",
"modalonly": true
}
},
{
"kind": "ListValue",
"name": "domain_strategy",
"title": "Domain strategy",
"description": "The domain strategy for resolving the domain name in the address.",
"depends": [
{
"node": "urltest",
"!reverse": true
}
],
"values": [
[
"",
"Default"
],
[
"prefer_ipv4",
"Prefer IPv4"
],
[
"prefer_ipv6",
"Prefer IPv6"
],
[
"ipv4_only",
"IPv4 only"
],
[
"ipv6_only",
"IPv6 only"
]
],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "class {}",
"name": "bind_interface",
"title": "Bind interface",
"description": "The network interface to bind to.",
"depends": [
{
"outbound": "",
"node": {}
}
],
"values": [],
"subsection": null,
"props": {
"modalonly": true,
"multiple": false,
"noaliases": true
}
},
{
"kind": "ListValue",
"name": "outbound",
"title": "Outbound",
"description": "The tag of the upstream outbound.<br/>Other dial fields will be ignored when enabled.",
"depends": [
{
"node": "urltest",
"!reverse": true
}
],
"values": [],
"subsection": null,
"props": {
"editable": true,
"load": "fn(284:530aca6575b5)",
"validate": "fn(487:34bee8692641)"
}
},
{
"kind": "CBI.StaticList",
"name": "urltest_nodes",
"title": "URLTest nodes",
"description": "List of nodes to test.",
"depends": [
[
"node",
"urltest"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true,
"validate": "fn(142:31d82e5bd86a)"
}
},
{
"kind": "Value",
"name": "urltest_url",
"title": "Test URL",
"description": "The URL to test.",
"depends": [
[
"node",
"urltest"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true,
"placeholder": "https://www.gstatic.com/generate_204",
"validate": "fn(239:6318979ec65f)"
}
},
{
"kind": "Value",
"name": "urltest_interval",
"title": "Test interval",
"description": "The test interval in seconds.",
"depends": [
[
"node",
"urltest"
]
],
"values": [],
"subsection": null,
"props": {
"datatype": "uinteger",
"modalonly": true,
"placeholder": "180",
"validate": "fn(276:b10cc6e36793)"
}
},
{
"kind": "Value",
"name": "urltest_tolerance",
"title": "Test tolerance",
"description": "The test tolerance in milliseconds.",
"depends": [
[
"node",
"urltest"
]
],
"values": [],
"subsection": null,
"props": {
"datatype": "uinteger",
"modalonly": true,
"placeholder": "50"
}
},
{
"kind": "Value",
"name": "urltest_idle_timeout",
"title": "Idle timeout",
"description": "The idle timeout in seconds.",
"depends": [
[
"node",
"urltest"
]
],
"values": [],
"subsection": null,
"props": {
"datatype": "uinteger",
"modalonly": true,
"placeholder": "1800"
}
},
{
"kind": "Flag",
"name": "urltest_interrupt_exist_connections",
"title": "Interrupt existing connections",
"description": "Interrupt existing connections when the selected outbound has changed.",
"depends": [
[
"node",
"urltest"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
}
],
"subsection": null
},
"props": {}
},
{
"kind": "SectionValue",
"name": "_routing_rule",
"description": "routing_rule",
"depends": [
[
"routing_mode",
"custom"
]
],
"values": [],
"subsection": {
"id": "GridSection:_routing_rule#4",
"kind": "GridSection",
"name": "_routing_rule",
"tabs": [
[
"field_other",
"Other fields"
],
[
"field_host",
"Host/IP fields"
],
[
"field_port",
"Port fields"
],
[
"fields_process",
"Process fields"
]
],
"options": [
{
"kind": "Value",
"name": "label",
"title": "Label",
"description": null,
"depends": [],
"values": [],
"subsection": null,
"props": {
"load": "bind(206:006f14096ca5;\"homeproxy-pro\")",
"modalonly": true,
"validate": "bind(461:3a6d28762720;\"homeproxy-pro\",\"routing_rule\",\"label\")"
}
},
{
"kind": "Flag",
"name": "enabled",
"title": "Enable",
"description": null,
"depends": [],
"values": [],
"subsection": null,
"props": {
"editable": true,
"rmempty": false
}
},
{
"kind": "ListValue",
"name": "mode",
"title": "Mode",
"description": "The default rule uses the following matching logic:<br/><code>(domain || domain_suffix || domain_keyword || domain_regex || ip_cidr || ip_is_private)</code> &&<br/><code>(port || port_range)</code> &&<br/><code>(source_ip_cidr || source_ip_is_private)</code> &&<br/><code>(source_port || source_port_range)</code> &&<br/><code>other fields</code>.<br/>Additionally, included rule sets can be considered merged rather than as a single rule sub-item.",
"depends": [],
"values": [
[
"default",
"Default"
]
],
"subsection": null,
"props": {
"default": "default",
"readonly": true,
"rmempty": false
}
},
{
"kind": "ListValue",
"name": "ip_version",
"title": "IP version",
"description": "4 or 6. Not limited if empty.",
"depends": [],
"values": [
[
"4",
"IPv4"
],
[
"6",
"IPv6"
],
[
"",
"Both"
]
],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "MultiValue",
"name": "protocol",
"title": "Protocol",
"description": "Sniffed protocol, see <a target=\"_blank\" href=\"https://sing-box.sagernet.org/configuration/route/sniff/\">Sniff</a> for details.",
"depends": [],
"values": [
[
"bittorrent",
"BitTorrent"
],
[
"dns",
"DNS"
],
[
"dtls",
"DTLS"
],
[
"http",
"HTTP"
],
[
"quic",
"QUIC"
],
[
"rdp",
"RDP"
],
[
"ssh",
"SSH"
],
[
"stun",
"STUN"
],
[
"tls",
"TLS"
]
],
"subsection": null,
"props": {}
},
{
"kind": "Value",
"name": "client",
"title": "Client",
"description": "Sniffed client type (QUIC client type or SSH client name).",
"depends": [
[
"protocol",
"quic"
],
[
"protocol",
"ssh"
]
],
"values": [
[
"chromium",
"Chromium / Cronet"
],
[
"firefox",
"Firefox / uquic firefox"
],
[
"quic-go",
"quic-go / uquic chrome"
],
[
"safari",
"Safari / Apple Network API"
]
],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "ListValue",
"name": "network",
"title": "Network",
"description": null,
"depends": [],
"values": [
[
"tcp",
"TCP"
],
[
"udp",
"UDP"
],
[
"",
"Both"
]
],
"subsection": null,
"props": {}
},
{
"kind": "DynamicList",
"name": "user",
"title": "User",
"description": "Match user name.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "CBI.StaticList",
"name": "rule_set",
"title": "Rule set",
"description": "Match rule set. Since 1.14: a rule-set holding a single default rule is merged into this rule; any other rule-set matches as an OR collection.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"load": "fn(219:b7b6c816012f)",
"modalonly": true
}
},
{
"kind": "Flag",
"name": "rule_set_ip_cidr_match_source",
"title": "Rule set IP CIDR as source IP",
"description": "Make IP CIDR in rule set used to match the source IP.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "Flag",
"name": "invert",
"title": "Invert",
"description": "Invert match result.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "ListValue",
"name": "action",
"title": "Action",
"description": null,
"depends": [],
"values": [
[
"route",
"Route"
],
[
"reject",
"Reject"
],
[
"route-options",
"Route options"
],
[
"resolve",
"Resolve"
]
],
"subsection": null,
"props": {
"default": "route",
"editable": true,
"rmempty": false
}
},
{
"kind": "ListValue",
"name": "outbound",
"title": "Outbound",
"description": "Tag of the target outbound.",
"depends": [
[
"action",
"route"
]
],
"values": [],
"subsection": null,
"props": {
"editable": true,
"load": "fn(263:6f52e51cea77)",
"rmempty": false
}
},
{
"kind": "Value",
"name": "override_address",
"title": "Override address",
"description": "Override the connection destination address.",
"depends": [
[
"action",
"route"
]
],
"values": [],
"subsection": null,
"props": {
"datatype": "ipaddr",
"modalonly": true
}
},
{
"kind": "Value",
"name": "override_port",
"title": "Override port",
"description": "Override the connection destination port.",
"depends": [
[
"action",
"route"
]
],
"values": [],
"subsection": null,
"props": {
"datatype": "port",
"modalonly": true
}
},
{
"kind": "Flag",
"name": "udp_disable_domain_unmapping",
"title": "Disable UDP domain unmapping",
"description": "If enabled, for UDP proxy requests addressed to a domain, the original packet address will be sent in the response instead of the mapped domain.",
"depends": [
[
"action",
"route"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "Flag",
"name": "udp_connect",
"title": "connect UDP connections",
"description": "If enabled, attempts to connect UDP connection to the destination instead of listen.",
"depends": [
[
"action",
"route"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "Value",
"name": "udp_timeout",
"title": "UDP timeout",
"description": "Timeout for UDP connections.<br/>Setting a larger value than the UDP timeout in inbounds will have no effect.",
"depends": [
[
"action",
"route"
]
],
"values": [],
"subsection": null,
"props": {
"datatype": "uinteger",
"modalonly": true
}
},
{
"kind": "Flag",
"name": "tls_record_fragment",
"title": "TLS record fragment",
"description": "Fragment TLS handshake into multiple TLS records.",
"depends": [
[
"action",
"route"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "Flag",
"name": "tls_fragment",
"title": "TLS fragment",
"description": "Fragment TLS handshakes. Due to poor performance, try <code>TLS record fragment</code> first.",
"depends": [
[
"action",
"route"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "Value",
"name": "tls_fragment_fallback_delay",
"title": "Fragment fallback delay",
"description": "The fallback value in milliseconds used when TLS segmentation cannot automatically determine the wait time.",
"depends": [
[
"tls_fragment",
"1"
]
],
"values": [],
"subsection": null,
"props": {
"datatype": "uinteger",
"modalonly": true,
"placeholder": "500"
}
},
{
"kind": "Value",
"name": "tls_spoof",
"title": "TLS spoof SNI (1.14)",
"description": "Inject a forged TLS ClientHello carrying this SNI before the real one to fool SNI-filtering middleboxes. Requires elevated privileges.",
"depends": [
[
"action",
"route"
]
],
"values": [],
"subsection": null,
"props": {
"datatype": "hostname",
"modalonly": true
}
},
{
"kind": "ListValue",
"name": "tls_spoof_method",
"title": "TLS spoof method (1.14)",
"description": "How the forged segment is rejected by the real server.",
"depends": [
[
"action",
"route"
],
[
"tls_spoof",
{}
]
],
"values": [
[
"",
"wrong-sequence (default)"
],
[
"wrong-checksum",
"wrong-checksum"
],
[
"wrong-ack",
"wrong-ack"
],
[
"wrong-md5",
"wrong-md5"
],
[
"wrong-timestamp",
"wrong-timestamp"
]
],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "ListValue",
"name": "resolve_server",
"title": "DNS server",
"description": "Specifies DNS server tag to use instead of selecting through DNS routing.",
"depends": [
[
"action",
"resolve"
]
],
"values": [],
"subsection": null,
"props": {
"load": "fn(356:d9c0755071ec)",
"modalonly": true
}
},
{
"kind": "ListValue",
"name": "reject_method",
"title": "Method",
"description": null,
"depends": [
[
"action",
"reject"
]
],
"values": [
[
"default",
"Reply with TCP RST / ICMP port unreachable"
],
[
"drop",
"Drop packets"
]
],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "Flag",
"name": "reject_no_drop",
"title": "Don't drop packets",
"description": "<code>Method</code> will be temporarily overwritten to <code>Drop packets</code> after 50 triggers in 30s if not enabled.",
"depends": [
[
"reject_method",
"default"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "ListValue",
"name": "resolve_strategy",
"title": "Resolve strategy",
"description": "Domain strategy for resolving the domain names.",
"depends": [
[
"action",
"resolve"
]
],
"values": [
[
"",
"Default"
],
[
"prefer_ipv4",
"Prefer IPv4"
],
[
"prefer_ipv6",
"Prefer IPv6"
],
[
"ipv4_only",
"IPv4 only"
],
[
"ipv6_only",
"IPv6 only"
]
],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "Flag",
"name": "resolve_disable_cache",
"title": "Disable DNS cache",
"description": "Disable DNS cache in this query.",
"depends": [
[
"action",
"resolve"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "Value",
"name": "resolve_rewrite_ttl",
"title": "Rewrite TTL",
"description": "Rewrite TTL in DNS responses.",
"depends": [
[
"action",
"resolve"
]
],
"values": [],
"subsection": null,
"props": {
"datatype": "uinteger",
"modalonly": true
}
},
{
"kind": "Value",
"name": "resolve_client_subnet",
"title": "EDNS Client subnet",
"description": "Append a <code>edns0-subnet</code> OPT extra record with the specified IP prefix to every query by default.<br/>If value is an IP address instead of prefix, <code>/32</code> or <code>/128</code> will be appended automatically.",
"depends": [
[
"action",
"resolve"
]
],
"values": [],
"subsection": null,
"props": {
"datatype": "or(cidr, ipaddr)",
"modalonly": true
}
},
{
"kind": "Flag",
"name": "resolve_disable_optimistic_cache",
"title": "Disable optimistic cache",
"description": "Disable optimistic DNS caching in this lookup (1.14).",
"depends": [
[
"action",
"resolve"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "Value",
"name": "resolve_timeout",
"title": "Query timeout",
"description": "Override dns.timeout for this lookup, in seconds (1.14).",
"depends": [
[
"action",
"resolve"
]
],
"values": [],
"subsection": null,
"props": {
"datatype": "uinteger",
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "domain",
"title": "Domain name",
"description": "Match full domain.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"datatype": "hostname",
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "domain_suffix",
"title": "Domain suffix",
"description": "Match domain suffix.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "domain_keyword",
"title": "Domain keyword",
"description": "Match domain using keyword.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "domain_regex",
"title": "Domain regex",
"description": "Match domain using regular expression.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "source_ip_cidr",
"title": "Source IP CIDR",
"description": "Match source IP CIDR.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"datatype": "or(cidr, ipaddr)",
"modalonly": true
}
},
{
"kind": "Flag",
"name": "source_ip_is_private",
"title": "Match private source IP",
"description": null,
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "ip_cidr",
"title": "IP CIDR",
"description": "Match IP CIDR.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"datatype": "or(cidr, ipaddr)",
"modalonly": true
}
},
{
"kind": "Flag",
"name": "ip_is_private",
"title": "Match private IP",
"description": null,
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "source_mac_address",
"title": "Source MAC address",
"description": "Match LAN device by MAC address.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"datatype": "macaddr",
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "source_hostname",
"title": "Source hostname",
"description": "Match LAN device hostname via neighbor resolution; enable find_neighbor.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "source_port",
"title": "Source port",
"description": "Match source port.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"datatype": "port",
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "source_port_range",
"title": "Source port range",
"description": "Match source port range. Format as START:/:END/START:END.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true,
"validate": "fn(390:7d62701c74bd)"
}
},
{
"kind": "DynamicList",
"name": "port",
"title": "Port",
"description": "Match port.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"datatype": "port",
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "port_range",
"title": "Port range",
"description": "Match port range. Format as START:/:END/START:END.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true,
"validate": "fn(390:7d62701c74bd)"
}
},
{
"kind": "DynamicList",
"name": "process_name",
"title": "Process name",
"description": "Match process name.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "process_path",
"title": "Process path",
"description": "Match process path.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "process_path_regex",
"title": "Process path (regex)",
"description": "Match process path using regular expression.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
}
],
"subsection": null
},
"props": {}
},
{
"kind": "SectionValue",
"name": "_dns",
"description": "dns",
"depends": [
[
"routing_mode",
"custom"
]
],
"values": [],
"subsection": {
"id": "GridSection:_dns#5",
"kind": "GridSection",
"name": "_dns",
"tabs": [],
"options": [
{
"kind": "ListValue",
"name": "default_strategy",
"title": "Default DNS strategy",
"description": "The DNS strategy for resolving the domain name in the address.",
"depends": [],
"values": [
[
"",
"Default"
],
[
"prefer_ipv4",
"Prefer IPv4"
],
[
"prefer_ipv6",
"Prefer IPv6"
],
[
"ipv4_only",
"IPv4 only"
],
[
"ipv6_only",
"IPv6 only"
]
],
"subsection": null,
"props": {}
},
{
"kind": "ListValue",
"name": "default_server",
"title": "Default DNS server",
"description": null,
"depends": [],
"values": [],
"subsection": null,
"props": {
"default": "default-dns",
"load": "fn(326:345de0db50cf)",
"rmempty": false
}
},
{
"kind": "Flag",
"name": "disable_cache",
"title": "Disable DNS cache",
"description": null,
"depends": [],
"values": [],
"subsection": null,
"props": {}
},
{
"kind": "Flag",
"name": "disable_cache_expire",
"title": "Disable cache expire",
"description": null,
"depends": [
[
"disable_cache",
"0"
]
],
"values": [],
"subsection": null,
"props": {}
},
{
"kind": "Value",
"name": "client_subnet",
"title": "EDNS Client subnet",
"description": "Append a <code>edns0-subnet</code> OPT extra record with the specified IP prefix to every query by default.<br/>If value is an IP address instead of prefix, <code>/32</code> or <code>/128</code> will be appended automatically.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"datatype": "or(cidr, ipaddr)"
}
},
{
"kind": "Flag",
"name": "optimistic_cache",
"title": "Optimistic DNS cache",
"description": "Return expired cache immediately and refresh in background (sing-box 1.14).",
"depends": [
[
"disable_cache",
"0"
],
[
"disable_cache_expire",
"0"
]
],
"values": [],
"subsection": null,
"props": {
"rmempty": false
}
},
{
"kind": "Value",
"name": "optimistic_timeout",
"title": "Optimistic cache timeout",
"description": "Max time an expired entry may be served. Examples: 3d, 1h.",
"depends": [],
"values": [],
"subsection": null,
"props": {}
},
{
"kind": "Value",
"name": "dns_timeout",
"title": "DNS query timeout",
"description": "Default timeout per DNS query in seconds (sing-box default: 10).",
"depends": [],
"values": [],
"subsection": null,
"props": {
"datatype": "uinteger"
}
},
{
"kind": "Flag",
"name": "cache_file_store_dns",
"title": "Store DNS cache",
"description": "Persist DNS cache across restarts (sing-box 1.14, replaces Store RDRC).",
"depends": [
[
"disable_cache",
"0"
]
],
"values": [],
"subsection": null,
"props": {
"rmempty": false
}
}
],
"subsection": null
},
"props": {}
},
{
"kind": "SectionValue",
"name": "_dns_server",
"description": "dns_server",
"depends": [
[
"routing_mode",
"custom"
]
],
"values": [],
"subsection": {
"id": "GridSection:_dns_server#6",
"kind": "GridSection",
"name": "_dns_server",
"tabs": [],
"options": [
{
"kind": "Value",
"name": "label",
"title": "Label",
"description": null,
"depends": [],
"values": [],
"subsection": null,
"props": {
"load": "bind(206:006f14096ca5;\"homeproxy-pro\")",
"modalonly": true,
"validate": "bind(461:3a6d28762720;\"homeproxy-pro\",\"dns_server\",\"label\")"
}
},
{
"kind": "Flag",
"name": "enabled",
"title": "Enable",
"description": null,
"depends": [],
"values": [],
"subsection": null,
"props": {
"editable": true,
"rmempty": false
}
},
{
"kind": "ListValue",
"name": "type",
"title": "Type",
"description": null,
"depends": [],
"values": [
[
"udp",
"UDP"
],
[
"tcp",
"TCP"
],
[
"tls",
"TLS"
],
[
"https",
"HTTPS"
],
[
"h3",
"HTTP/3"
],
[
"quic",
"QUIC"
]
],
"subsection": null,
"props": {
"default": "udp",
"rmempty": false
}
},
{
"kind": "Value",
"name": "server",
"title": "Address",
"description": "The address of the dns server.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"datatype": "or(hostname, ipaddr)",
"rmempty": false
}
},
{
"kind": "Value",
"name": "server_port",
"title": "Port",
"description": "The port of the DNS server.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"datatype": "port",
"placeholder": "auto"
}
},
{
"kind": "Value",
"name": "path",
"title": "Path",
"description": "The path of the DNS server.",
"depends": [
[
"type",
"https"
],
[
"type",
"h3"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true,
"placeholder": "/dns-query"
}
},
{
"kind": "DynamicList",
"name": "headers",
"title": "Headers",
"description": "Additional headers to be sent to the DNS server.",
"depends": [
[
"type",
"https"
],
[
"type",
"h3"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "Value",
"name": "tls_sni",
"title": "TLS SNI",
"description": "Used to verify the hostname on the returned certificates.",
"depends": [
[
"type",
"tls"
],
[
"type",
"https"
],
[
"type",
"h3"
],
[
"type",
"quic"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "ListValue",
"name": "address_resolver",
"title": "Address resolver",
"description": "Tag of a another server to resolve the domain name in the address. Required if address contains domain.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"load": "fn(384:9fa59da460cf)",
"modalonly": true,
"validate": "fn(322:e76c15d647fc)"
}
},
{
"kind": "ListValue",
"name": "address_strategy",
"title": "Address strategy",
"description": "The domain strategy for resolving the domain name in the address.",
"depends": [
{
"address_resolver": "",
"!reverse": true
}
],
"values": [
[
"",
"Default"
],
[
"prefer_ipv4",
"Prefer IPv4"
],
[
"prefer_ipv6",
"Prefer IPv6"
],
[
"ipv4_only",
"IPv4 only"
],
[
"ipv6_only",
"IPv6 only"
]
],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "ListValue",
"name": "outbound",
"title": "Outbound",
"description": "Tag of an outbound for connecting to the dns server.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"default": "direct-out",
"editable": true,
"load": "fn(263:6f52e51cea77)",
"rmempty": false
}
}
],
"subsection": null
},
"props": {}
},
{
"kind": "SectionValue",
"name": "_dns_rule",
"description": "dns_rule",
"depends": [
[
"routing_mode",
"custom"
]
],
"values": [],
"subsection": {
"id": "GridSection:_dns_rule#7",
"kind": "GridSection",
"name": "_dns_rule",
"tabs": [
[
"field_other",
"Other fields"
],
[
"field_host",
"Host/IP fields"
],
[
"field_port",
"Port fields"
],
[
"fields_process",
"Process fields"
]
],
"options": [
{
"kind": "Value",
"name": "label",
"title": "Label",
"description": null,
"depends": [],
"values": [],
"subsection": null,
"props": {
"load": "bind(206:006f14096ca5;\"homeproxy-pro\")",
"modalonly": true,
"validate": "bind(461:3a6d28762720;\"homeproxy-pro\",\"dns_rule\",\"label\")"
}
},
{
"kind": "Flag",
"name": "enabled",
"title": "Enable",
"description": null,
"depends": [],
"values": [],
"subsection": null,
"props": {
"editable": true,
"rmempty": false
}
},
{
"kind": "ListValue",
"name": "mode",
"title": "Mode",
"description": "The default rule uses the following matching logic:<br/><code>(domain || domain_suffix || domain_keyword || domain_regex)</code> &&<br/><code>(port || port_range)</code> &&<br/><code>(source_ip_cidr || source_ip_is_private)</code> &&<br/><code>(source_port || source_port_range)</code> &&<br/><code>other fields</code>.<br/>Additionally, included rule sets can be considered merged rather than as a single rule sub-item.",
"depends": [],
"values": [
[
"default",
"Default"
]
],
"subsection": null,
"props": {
"default": "default",
"modalonly": true,
"readonly": true,
"rmempty": false
}
},
{
"kind": "ListValue",
"name": "ip_version",
"title": "IP version",
"description": null,
"depends": [],
"values": [
[
"4",
"IPv4"
],
[
"6",
"IPv6"
],
[
"",
"Both"
]
],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "query_type",
"title": "Query type",
"description": "Match query type.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "ListValue",
"name": "network",
"title": "Network",
"description": null,
"depends": [],
"values": [
[
"tcp",
"TCP"
],
[
"udp",
"UDP"
],
[
"",
"Both"
]
],
"subsection": null,
"props": {}
},
{
"kind": "MultiValue",
"name": "protocol",
"title": "Protocol",
"description": "Sniffed protocol, see <a target=\"_blank\" href=\"https://sing-box.sagernet.org/configuration/route/sniff/\">Sniff</a> for details.",
"depends": [],
"values": [
[
"bittorrent",
"BitTorrent"
],
[
"dtls",
"DTLS"
],
[
"http",
"HTTP"
],
[
"quic",
"QUIC"
],
[
"rdp",
"RDP"
],
[
"ssh",
"SSH"
],
[
"stun",
"STUN"
],
[
"tls",
"TLS"
]
],
"subsection": null,
"props": {}
},
{
"kind": "DynamicList",
"name": "user",
"title": "User",
"description": "Match user name.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "CBI.StaticList",
"name": "rule_set",
"title": "Rule set",
"description": "Match rule set. DNS: rules referencing rule-sets that contain query_type are incompatible with legacy address filters (ip_cidr / ip_is_private) — use match_response instead (1.14).",
"depends": [],
"values": [],
"subsection": null,
"props": {
"load": "fn(219:b7b6c816012f)",
"modalonly": true
}
},
{
"kind": "Flag",
"name": "rule_set_ip_cidr_match_source",
"title": "Rule set IP CIDR as source IP",
"description": "Make IP CIDR in rule sets match the source IP.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "Flag",
"name": "invert",
"title": "Invert",
"description": "Invert match result.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "ListValue",
"name": "action",
"title": "Action",
"description": null,
"depends": [],
"values": [
[
"route",
"Route"
],
[
"reject",
"Reject"
],
[
"predefined",
"Predefined"
],
[
"evaluate",
"Evaluate (1.14)"
]
],
"subsection": null,
"props": {
"default": "route",
"editable": true,
"rmempty": false
}
},
{
"kind": "ListValue",
"name": "server",
"title": "Server",
"description": "Tag of the target dns server.",
"depends": [
[
"action",
"route"
],
[
"action",
"evaluate"
]
],
"values": [],
"subsection": null,
"props": {
"editable": true,
"load": "fn(326:345de0db50cf)",
"rmempty": false
}
},
{
"kind": "Flag",
"name": "dns_disable_cache",
"title": "Disable dns cache",
"description": "Disable cache and save cache in this query.",
"depends": [
[
"action",
"route"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "Value",
"name": "rewrite_ttl",
"title": "Rewrite TTL",
"description": "Rewrite TTL in DNS responses.",
"depends": [
[
"action",
"route"
]
],
"values": [],
"subsection": null,
"props": {
"datatype": "uinteger",
"modalonly": true
}
},
{
"kind": "Value",
"name": "client_subnet",
"title": "EDNS Client subnet",
"description": "Append a <code>edns0-subnet</code> OPT extra record with the specified IP prefix to every query by default.<br/>If value is an IP address instead of prefix, <code>/32</code> or <code>/128</code> will be appended automatically.",
"depends": [
[
"action",
"route"
]
],
"values": [],
"subsection": null,
"props": {
"datatype": "or(cidr, ipaddr)",
"modalonly": true
}
},
{
"kind": "Value",
"name": "match_response",
"title": "Match response",
"description": "1 matches the latest untagged evaluate result; other values match an evaluate tag (1.14).",
"depends": [
[
"action",
"route"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "Value",
"name": "evaluate_tag",
"title": "Evaluate tag",
"description": "Optional tag for this evaluate result.",
"depends": [
[
"action",
"evaluate"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "Flag",
"name": "race",
"title": "Race",
"description": "Judge this response-dependent rule in parallel; first match wins (1.14).",
"depends": [
{
"action": "route",
"match_response": {}
}
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "Flag",
"name": "speculative",
"title": "Speculative",
"description": "Send the query before pending race rules are judged (1.14).",
"depends": [
[
"action",
"route"
],
[
"action",
"evaluate"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "Flag",
"name": "disable_optimistic_cache",
"title": "Disable optimistic cache",
"description": "Disable optimistic DNS caching for this query.",
"depends": [
[
"action",
"route"
],
[
"action",
"evaluate"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "Value",
"name": "dns_timeout",
"title": "Query timeout",
"description": "Override dns.timeout for this query, in seconds.",
"depends": [
[
"action",
"route"
],
[
"action",
"evaluate"
]
],
"values": [],
"subsection": null,
"props": {
"datatype": "uinteger",
"modalonly": true
}
},
{
"kind": "Flag",
"name": "remove_client_subnet",
"title": "Remove EDNS client subnet",
"description": "Remove the edns0-subnet record from the query (1.14).",
"depends": [
[
"action",
"route"
],
[
"action",
"evaluate"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "ListValue",
"name": "response_rcode",
"title": "Response RCode",
"description": "Match the evaluated response code (requires match_response).",
"depends": [
{
"action": "route",
"match_response": {}
}
],
"values": [
[
"NOERROR",
null
],
[
"FORMERR",
null
],
[
"SERVFAIL",
null
],
[
"NXDOMAIN",
null
],
[
"NOTIMP",
null
],
[
"REFUSED",
null
]
],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "response_answer",
"title": "Response answer",
"description": "Text DNS records to match in the evaluated answer.",
"depends": [
{
"action": "route",
"match_response": {}
}
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "response_ns",
"title": "Response NS",
"description": null,
"depends": [
{
"action": "route",
"match_response": {}
}
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "response_extra",
"title": "Response extra",
"description": null,
"depends": [
{
"action": "route",
"match_response": {}
}
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "ListValue",
"name": "reject_method",
"title": "Method",
"description": null,
"depends": [
[
"action",
"reject"
]
],
"values": [
[
"default",
"Reply with REFUSED"
],
[
"drop",
"Drop requests"
]
],
"subsection": null,
"props": {
"default": "default",
"modalonly": true
}
},
{
"kind": "Flag",
"name": "reject_no_drop",
"title": "Don't drop requests",
"description": "<code>Method</code> will be temporarily overwritten to <code>Drop requests</code> after 50 triggers in 30s if not enabled.",
"depends": [
[
"reject_method",
"default"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "ListValue",
"name": "predefined_rcode",
"title": "RCode",
"description": "The response code.",
"depends": [
[
"action",
"predefined"
]
],
"values": [
[
"NOERROR",
null
],
[
"FORMERR",
null
],
[
"SERVFAIL",
null
],
[
"NXDOMAIN",
null
],
[
"NOTIMP",
null
],
[
"REFUSED",
null
]
],
"subsection": null,
"props": {
"default": "NOERROR",
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "predefined_answer",
"title": "Answer",
"description": "List of text DNS record to respond as answers.",
"depends": [
[
"action",
"predefined"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "predefined_ns",
"title": "NS",
"description": "List of text DNS record to respond as name servers.",
"depends": [
[
"action",
"predefined"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "predefined_extra",
"title": "Extra records",
"description": "List of text DNS record to respond as extra records.",
"depends": [
[
"action",
"predefined"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "domain",
"title": "Domain name",
"description": "Match full domain.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"datatype": "hostname",
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "domain_suffix",
"title": "Domain suffix",
"description": "Match domain suffix.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "domain_keyword",
"title": "Domain keyword",
"description": "Match domain using keyword.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "domain_regex",
"title": "Domain regex",
"description": "Match domain using regular expression.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "source_ip_cidr",
"title": "Source IP CIDR",
"description": "Match source IP CIDR.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"datatype": "or(cidr, ipaddr)",
"modalonly": true
}
},
{
"kind": "Flag",
"name": "source_ip_is_private",
"title": "Match private source IP",
"description": null,
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "ip_cidr",
"title": "IP CIDR",
"description": "Match IP CIDR with the evaluated response (needs match_response; old rules are auto-wrapped in 1.14).",
"depends": [],
"values": [],
"subsection": null,
"props": {
"datatype": "or(cidr, ipaddr)",
"modalonly": true
}
},
{
"kind": "Flag",
"name": "ip_is_private",
"title": "Match private IP",
"description": "Match private IP with the evaluated response (needs match_response).",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "source_mac_address",
"title": "Source MAC address",
"description": "Match LAN device by MAC address.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"datatype": "macaddr",
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "source_hostname",
"title": "Source hostname",
"description": "Match LAN device hostname via neighbor resolution; enable find_neighbor.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "Value",
"name": "query_client_subnet",
"title": "Query EDNS client subnet",
"description": "Match the EDNS Client Subnet in the query (1.14).",
"depends": [],
"values": [],
"subsection": null,
"props": {
"datatype": "or(cidr, ipaddr)",
"modalonly": true
}
},
{
"kind": "Flag",
"name": "query_dnssec",
"title": "Match DNSSEC OK",
"description": "Match queries with the DNSSEC OK bit set (1.14).",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "source_port",
"title": "Source port",
"description": "Match source port.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"datatype": "port",
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "source_port_range",
"title": "Source port range",
"description": "Match source port range. Format as START:/:END/START:END.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true,
"validate": "fn(390:7d62701c74bd)"
}
},
{
"kind": "DynamicList",
"name": "port",
"title": "Port",
"description": "Match port.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"datatype": "port",
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "port_range",
"title": "Port range",
"description": "Match port range. Format as START:/:END/START:END.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true,
"validate": "fn(390:7d62701c74bd)"
}
},
{
"kind": "DynamicList",
"name": "process_name",
"title": "Process name",
"description": "Match process name.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "process_path",
"title": "Process path",
"description": "Match process path.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
},
{
"kind": "DynamicList",
"name": "process_path_regex",
"title": "Process path (regex)",
"description": "Match process path using regular expression.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"modalonly": true
}
}
],
"subsection": null
},
"props": {}
},
{
"kind": "SectionValue",
"name": "_ruleset",
"description": "ruleset",
"depends": [
[
"routing_mode",
"custom"
]
],
"values": [],
"subsection": {
"id": "GridSection:_ruleset#8",
"kind": "GridSection",
"name": "_ruleset",
"tabs": [],
"options": [
{
"kind": "Value",
"name": "label",
"title": "Label",
"description": null,
"depends": [],
"values": [],
"subsection": null,
"props": {
"load": "bind(206:006f14096ca5;\"homeproxy-pro\")",
"modalonly": true,
"validate": "bind(461:3a6d28762720;\"homeproxy-pro\",\"ruleset\",\"label\")"
}
},
{
"kind": "Flag",
"name": "enabled",
"title": "Enable",
"description": null,
"depends": [],
"values": [],
"subsection": null,
"props": {
"editable": true,
"rmempty": false
}
},
{
"kind": "ListValue",
"name": "type",
"title": "Type",
"description": null,
"depends": [],
"values": [
[
"local",
"Local"
],
[
"remote",
"Remote"
]
],
"subsection": null,
"props": {
"default": "remote",
"rmempty": false
}
},
{
"kind": "ListValue",
"name": "format",
"title": "Format",
"description": "Rule-set file format. Leave it empty and HomeProxy reads it from the file itself; a value that does not match the file is corrected and reported in the log.",
"depends": [],
"values": [
[
"binary",
"Binary file"
],
[
"source",
"Source file"
]
],
"subsection": null,
"props": {
"rmempty": true
}
},
{
"kind": "Value",
"name": "path",
"title": "Path",
"description": "Rule-set file in /etc/homeproxy-pro/ruleset/. Copy it there first: the generator refuses a rule-set whose file is missing.",
"depends": [
[
"type",
"local"
]
],
"values": [
[
"/etc/homeproxy-pro/ruleset/example.srs",
null
]
],
"subsection": null,
"props": {
"datatype": "file",
"modalonly": true,
"placeholder": "/etc/homeproxy-pro/ruleset/example.srs",
"rmempty": false,
"validate": "fn(279:52e3f36f3a3c)"
}
},
{
"kind": "Value",
"name": "url",
"title": "Rule set URL",
"description": null,
"depends": [
[
"type",
"remote"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true,
"rmempty": false,
"validate": "fn(490:744c4c36ac8a)"
}
},
{
"kind": "ListValue",
"name": "outbound",
"title": "Outbound",
"description": "Outbound used to download this rule-set (via sing-box 1.14 http_clients).",
"depends": [
[
"type",
"remote"
]
],
"values": [],
"subsection": null,
"props": {
"load": "fn(293:8a1c8158e8ba)"
}
},
{
"kind": "Value",
"name": "initial_path",
"title": "Initial path",
"description": "Local file with initial rule-set content; avoids blocking startup on first download (1.14). Must be under /etc/homeproxy-pro/ruleset/.",
"depends": [
[
"type",
"remote"
]
],
"values": [
[
"/etc/homeproxy-pro/ruleset/example.srs",
null
]
],
"subsection": null,
"props": {
"datatype": "file",
"modalonly": true,
"placeholder": "/etc/homeproxy-pro/ruleset/example.srs",
"validate": "fn(279:52e3f36f3a3c)"
}
},
{
"kind": "DynamicList",
"name": "extra_tags",
"title": "Extra tags",
"description": "Extra rule-set tags sharing these options. Requires {tag} in path/url (1.14).",
"depends": [
[
"type",
"remote"
]
],
"values": [],
"subsection": null,
"props": {
"modalonly": true,
"validate": "fn(481:26f8e4956cd4)"
}
},
{
"kind": "Value",
"name": "update_interval",
"title": "Update interval",
"description": "Update interval of rule set, e.g. 24h or 3600 (seconds).",
"depends": [
[
"type",
"remote"
]
],
"values": [],
"subsection": null,
"props": {
"placeholder": "24h",
"validate": "fn(242:e40abf36902a)"
}
}
],
"subsection": null
},
"props": {}
},
{
"kind": "Value",
"name": "dns_server",
"title": "Overseas DNS server",
"description": "Resolves every domain that is not on the China DNS path, through the selected proxy node. A domestic resolver answers these queries with polluted or NXDOMAIN results, which is what makes a foreign site fail to resolve while the proxy itself works - so only overseas services are offered here. Support UDP, TCP, DoH, DoQ, DoT. TCP protocol will be used if not specified.",
"depends": [
{
"routing_mode": "custom",
"!reverse": true
}
],
"values": [
[
"1.1.1.1",
"CloudFlare Public DNS (1.1.1.1)"
],
[
"208.67.222.222",
"Cisco Public DNS (208.67.222.222)"
],
[
"8.8.8.8",
"Google Public DNS (8.8.8.8)"
]
],
"subsection": null,
"props": {
"default": "8.8.8.8",
"rmempty": false,
"validate": "fn(758:77dbe8107e5c)"
}
},
{
"kind": "Value",
"name": "china_dns_server",
"title": "China DNS server",
"description": "Resolves the domains on the China path, so it has to be a domestic service to get the correct local CDN answers. Keep the default; the upstream may block UDP/53, in which case a DoH address (https://dns.alidns.com/dns-query, https://doh.pub/dns-query) also works. Support UDP, TCP, DoH, DoQ, DoT. This address is also the resolver the proxy DNS server above uses to look up its own hostname when that one is a domain - and a URL here is a domain, which cannot do that lookup itself, so with a URL here the proxy DNS server falls back to the WAN resolver. Enter the bare IP form of the same service to keep that lookup on this router.",
"depends": [
[
"routing_mode",
"bypass_mainland_china"
]
],
"values": [
[
"wan",
"WAN DNS (read from interface)"
],
[
"223.5.5.5",
"Aliyun Public DNS (223.5.5.5)"
],
[
"210.2.4.8",
"CNNIC Public DNS (210.2.4.8)"
],
[
"119.29.29.29",
"Tencent Public DNS (119.29.29.29)"
],
[
"117.50.10.10",
"ThreatBook Public DNS (117.50.10.10)"
]
],
"subsection": null,
"props": {
"default": "223.5.5.5",
"rmempty": false,
"validate": "fn(624:299cd4e865be)"
}
},
{
"kind": "Flag",
"name": "cn_ip_fallback",
"title": "CN-IP DNS fallback (sing-box 1.14)",
"description": "When the main DNS returns a mainland China IP, re-resolve via China DNS using evaluate/match_response.",
"depends": [
[
"routing_mode",
"bypass_mainland_china"
]
],
"values": [],
"subsection": null,
"props": {
"rmempty": false
}
},
{
"kind": "SectionValue",
"name": "_dns_cache",
"description": "dns",
"depends": [
{
"routing_mode": "custom",
"!reverse": true
}
],
"values": [],
"subsection": {
"id": "GridSection:_dns_cache#9",
"kind": "GridSection",
"name": "_dns_cache",
"tabs": [],
"options": [
{
"kind": "Flag",
"name": "optimistic_cache",
"title": "Optimistic DNS cache",
"description": "Return expired cache immediately and refresh in background (sing-box 1.14).",
"depends": [
[
"disable_cache",
"0"
],
[
"disable_cache_expire",
"0"
]
],
"values": [],
"subsection": null,
"props": {
"rmempty": false
}
},
{
"kind": "Value",
"name": "optimistic_timeout",
"title": "Optimistic cache timeout",
"description": "Max time an expired entry may be served. Examples: 3d, 1h.",
"depends": [],
"values": [],
"subsection": null,
"props": {}
},
{
"kind": "Value",
"name": "dns_timeout",
"title": "DNS query timeout",
"description": "Default timeout per DNS query in seconds (sing-box default: 10).",
"depends": [],
"values": [],
"subsection": null,
"props": {
"datatype": "uinteger"
}
},
{
"kind": "Flag",
"name": "cache_file_store_dns",
"title": "Store DNS cache",
"description": "Persist DNS cache across restarts (sing-box 1.14, replaces Store RDRC).",
"depends": [
[
"disable_cache",
"0"
]
],
"values": [],
"subsection": null,
"props": {
"rmempty": false
}
}
],
"subsection": null
},
"props": {}
},
{
"kind": "SectionValue",
"name": "_control",
"description": "control",
"depends": [],
"values": [],
"subsection": {
"id": "GridSection:_control#10",
"kind": "GridSection",
"name": "_control",
"tabs": [
[
"interface",
"Interface Control"
],
[
"lan_ip_policy",
"LAN IP Policy"
],
[
"wan_ip_policy",
"WAN IP Policy"
],
[
"proxy_domain_list",
"Proxy Domain List"
],
[
"direct_domain_list",
"Direct Domain List"
]
],
"options": [
{
"kind": "class {}",
"name": "listen_interfaces",
"title": "Listen interfaces",
"description": "Only process traffic from specific interfaces. Leave empty for all.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"multiple": true,
"noaliases": true
}
},
{
"kind": "class {}",
"name": "bind_interface",
"title": "Bind interface",
"description": "Bind outbound traffic to specific interface. Leave empty to auto detect.",
"depends": [],
"values": [],
"subsection": null,
"props": {
"multiple": false,
"noaliases": true
}
},
{
"kind": "ListValue",
"name": "lan_proxy_mode",
"title": "Proxy filter mode",
"description": null,
"depends": [],
"values": [
[
"disabled",
"Disable"
],
[
"listed_only",
"Proxy listed only"
],
[
"except_listed",
"Proxy all except listed"
]
],
"subsection": null,
"props": {
"default": "disabled",
"rmempty": false
}
},
{
"kind": "Value",
"name": "lan_ip_policy",
"title": "lan_direct_ipv4_ips",
"description": "Direct IPv4 IP-s",
"depends": [
[
"lan_proxy_mode",
"except_listed"
]
],
"values": [],
"subsection": null,
"props": {}
},
{
"kind": "Value",
"name": "lan_ip_policy",
"title": "lan_direct_ipv6_ips",
"description": "Direct IPv6 IP-s",
"depends": [
{
"lan_proxy_mode": "except_listed",
"homeproxy-pro.config.ipv6_support": "1"
}
],
"values": [],
"subsection": null,
"props": {}
},
{
"kind": "Value",
"name": "lan_ip_policy",
"title": "lan_direct_mac_addrs",
"description": "Direct MAC-s",
"depends": [
[
"lan_proxy_mode",
"except_listed"
]
],
"values": [],
"subsection": null,
"props": {}
},
{
"kind": "Value",
"name": "lan_ip_policy",
"title": "lan_proxy_ipv4_ips",
"description": "Proxy IPv4 IP-s",
"depends": [
[
"lan_proxy_mode",
"listed_only"
]
],
"values": [],
"subsection": null,
"props": {}
},
{
"kind": "Value",
"name": "lan_ip_policy",
"title": "lan_proxy_ipv6_ips",
"description": "Proxy IPv6 IP-s",
"depends": [
{
"lan_proxy_mode": "listed_only",
"homeproxy-pro.config.ipv6_support": "1"
}
],
"values": [],
"subsection": null,
"props": {}
},
{
"kind": "Value",
"name": "lan_ip_policy",
"title": "lan_proxy_mac_addrs",
"description": "Proxy MAC-s",
"depends": [
[
"lan_proxy_mode",
"listed_only"
]
],
"values": [],
"subsection": null,
"props": {}
},
{
"kind": "Value",
"name": "lan_ip_policy",
"title": "lan_gaming_mode_ipv4_ips",
"description": "Gaming mode IPv4 IP-s",
"depends": [],
"values": [],
"subsection": null,
"props": {}
},
{
"kind": "Value",
"name": "lan_ip_policy",
"title": "lan_gaming_mode_ipv6_ips",
"description": "Gaming mode IPv6 IP-s",
"depends": [
[
"homeproxy-pro.config.ipv6_support",
"1"
]
],
"values": [],
"subsection": null,
"props": {}
},
{
"kind": "Value",
"name": "lan_ip_policy",
"title": "lan_gaming_mode_mac_addrs",
"description": "Gaming mode MAC-s",
"depends": [],
"values": [],
"subsection": null,
"props": {}
},
{
"kind": "Value",
"name": "lan_ip_policy",
"title": "lan_global_proxy_ipv4_ips",
"description": "Global proxy IPv4 IP-s",
"depends": [
{
"homeproxy-pro.config.routing_mode": "custom",
"!reverse": true
}
],
"values": [],
"subsection": null,
"props": {}
},
{
"kind": "Value",
"name": "lan_ip_policy",
"title": "lan_global_proxy_ipv6_ips",
"description": "Global proxy IPv6 IP-s",
"depends": [
{
"homeproxy-pro.config.routing_mode": {},
"homeproxy-pro.config.ipv6_support": "1"
}
],
"values": [],
"subsection": null,
"props": {}
},
{
"kind": "Value",
"name": "lan_ip_policy",
"title": "lan_global_proxy_mac_addrs",
"description": "Global proxy MAC-s",
"depends": [
{
"homeproxy-pro.config.routing_mode": "custom",
"!reverse": true
}
],
"values": [],
"subsection": null,
"props": {}
},
{
"kind": "DynamicList",
"name": "wan_proxy_ipv4_ips",
"title": "Proxy IPv4 IP-s",
"description": null,
"depends": [],
"values": [],
"subsection": null,
"props": {
"datatype": "or(ip4addr, cidr4)"
}
},
{
"kind": "DynamicList",
"name": "wan_proxy_ipv6_ips",
"title": "Proxy IPv6 IP-s",
"description": null,
"depends": [
[
"homeproxy-pro.config.ipv6_support",
"1"
]
],
"values": [],
"subsection": null,
"props": {
"datatype": "or(ip6addr, cidr6)"
}
},
{
"kind": "DynamicList",
"name": "wan_direct_ipv4_ips",
"title": "Direct IPv4 IP-s",
"description": null,
"depends": [],
"values": [],
"subsection": null,
"props": {
"datatype": "or(ip4addr, cidr4)"
}
},
{
"kind": "DynamicList",
"name": "wan_direct_ipv6_ips",
"title": "Direct IPv6 IP-s",
"description": null,
"depends": [
[
"homeproxy-pro.config.ipv6_support",
"1"
]
],
"values": [],
"subsection": null,
"props": {
"datatype": "or(ip6addr, cidr6)"
}
},
{
"kind": "TextValue",
"name": "_proxy_domain_list",
"description": null,
"depends": [
{
"homeproxy-pro.config.routing_mode": "custom",
"!reverse": true
}
],
"values": [],
"subsection": null,
"props": {
"datatype": "hostname",
"description": "One domain per line. No spaces, no comments, no wildcards; the backend rejects invalid characters and tells you which line.",
"load": "fn(274:3a38855f08ed)",
"monospace": true,
"remove": "fn(338:d04583a0e63e)",
"rows": 10,
"validate": "fn(203:c60da90ca2f3)",
"write": "fn(247:51376a274a47)"
}
},
{
"kind": "TextValue",
"name": "_direct_domain_list",
"description": null,
"depends": [
{
"homeproxy-pro.config.routing_mode": "custom",
"!reverse": true
}
],
"values": [],
"subsection": null,
"props": {
"datatype": "hostname",
"description": "One domain per line. No spaces, no comments, no wildcards; the backend rejects invalid characters and tells you which line.",
"load": "fn(275:0bec3bd57ebe)",
"monospace": true,
"remove": "fn(339:4486a5c409ee)",
"rows": 10,
"validate": "fn(203:c60da90ca2f3)",
"write": "fn(248:6bd5224288bd)"
}
}
],
"subsection": null
},
"props": {}
},
{
"kind": "ListValue",
"name": "udp_mapping",
"title": "UDP NAT mapping (1.14)",
"description": null,
"depends": [
[
"proxy_mode",
"redirect_tproxy"
],
[
"proxy_mode",
"redirect_tun"
],
[
"proxy_mode",
"tun"
]
],
"values": [
[
"endpoint_independent",
"Endpoint independent"
],
[
"address_dependent",
"Address dependent"
],
[
"address_and_port_dependent",
"Address and port dependent"
]
],
"subsection": null,
"props": {
"default": "endpoint_independent",
"description": "sing-box default; recommended for home use (small NAT table, QUIC/game friendly). Choose stricter only for specific UDP issues.",
"rmempty": false
}
},
{
"kind": "ListValue",
"name": "udp_filtering",
"title": "UDP NAT filtering (1.14)",
"description": null,
"depends": [
[
"proxy_mode",
"redirect_tproxy"
],
[
"proxy_mode",
"redirect_tun"
],
[
"proxy_mode",
"tun"
]
],
"values": [
[
"endpoint_independent",
"Endpoint independent"
],
[
"address_dependent",
"Address dependent"
],
[
"address_and_port_dependent",
"Address and port dependent"
]
],
"subsection": null,
"props": {
"default": "endpoint_independent",
"description": "sing-box default; recommended for home use (accepts replies from any remote after mapping). Choose stricter only for specific UDP issues.",
"rmempty": false
}
},
{
"kind": "Value",
"name": "udp_nat_max",
"title": "UDP NAT sessions max (1.14)",
"description": null,
"depends": [
[
"proxy_mode",
"redirect_tproxy"
],
[
"proxy_mode",
"redirect_tun"
],
[
"proxy_mode",
"tun"
]
],
"values": [],
"subsection": null,
"props": {
"datatype": "uinteger"
}
},
{
"kind": "ListValue",
"name": "tun_dns_mode",
"title": "TUN DNS mode (1.14)",
"description": "Since sing-box 1.14 the default (Unset) behaves as hijack: sing-box sets the platform interface DNS and hijacks port 53. On OpenWrt this overlaps with the own dnsmasq/nftables DNS hijack of this plugin, so keep Disabled on a gateway unless you need sing-box to own TUN DNS.",
"depends": [
[
"proxy_mode",
"redirect_tun"
],
[
"proxy_mode",
"tun"
]
],
"values": [
[
"default",
"Unset (default)"
],
[
"disabled",
"Disabled"
],
[
"native",
"Native"
],
[
"hijack",
"Hijack"
]
],
"subsection": null,
"props": {
"default": "default",
"rmempty": true
}
},
{
"kind": "DynamicList",
"name": "tun_dns_address",
"title": "TUN DNS addresses (1.14)",
"description": null,
"depends": [
{
"proxy_mode": {},
"tun_dns_mode": {}
}
],
"values": [],
"subsection": null,
"props": {
"datatype": "ipaddr",
"modalonly": true
}
}
],
"subsection": null
}
]
}