Rules¶
By defining rules, you can granularly control how spoofdpi handles connections to specific domains or IP addresses. You can define per-domain bypass strategies, DNS settings, or simply block connections.
Note
Rules are only available via the TOML config file and cannot be set via command-line flags.
Structure¶
The top-level [[rules]] array contains one table per rule. Each rule consists of matching criteria (match) and per-section overrides (dns, https, udp, connection).
Rule Fields¶
| Field | Type | Description |
|---|---|---|
name |
String | A descriptive name for the rule. |
priority |
Int | Order of precedence. Higher numbers take priority. |
block |
Bool | If true, completely blocks connections matching this rule. |
Match Criteria (match)¶
You can specify a domains list or a cidrs list.
| Field | Type | Description |
|---|---|---|
domains |
Array | List of domain patterns. Supports wildcards (*, **). |
cidrs |
Array | List of IP ranges in CIDR notation (e.g., ["10.0.0.0/8"]). |
File-based match lists¶
Both domains and cidrs accept items with a file: prefix. The path after the prefix is read line by line, and each non-empty, non-comment line is treated as an additional item.
[[rules]]
name = "streaming"
match = { domains = ["file:assets/streaming-domains.txt", "*.youtube.com"] }
https = { fake-count = 5 }
Path resolution
| Prefix / form | Resolved against |
|---|---|
| Relative path | Directory of the config file |
Absolute path (/…) |
Used as-is |
~/… |
User home directory |
$VAR/… |
Environment variable |
File format rules
- Lines beginning with
#are treated as comments and ignored. - Blank lines are ignored.
- If the file does not exist, a warning is emitted at startup and the entry is skipped (the server still starts).
- Any other I/O error (e.g. permission denied) is fatal.
DNS Override (dns)¶
Customize how domain names are resolved for matched traffic. The available fields mirror the global DNS Configuration.
| Field | Type | Description |
|---|---|---|
mode |
String | Resolver to use: "udp", "https" (DoH), or "system". |
addr |
String | Custom upstream server (e.g., 8.8.8.8:53). |
https-url |
String | Custom DoH URL (e.g., https://dns.google/dns-query). |
qtype |
String | Query type: "ipv4", "ipv6", or "all". |
cache |
Bool | If true, enables caching for this rule. |
HTTPS Override (https)¶
Customize how HTTPS connections are established. The available fields mirror the global HTTPS Configuration.
| Field | Type | Description |
|---|---|---|
disorder |
Bool | Send Client Hello packets out of order. |
fake-count |
Int | Number of fake packets to send. |
fake-packet |
Array | List of bytes for the fake packet (e.g., [0x16]). |
split-mode |
String | Split strategy: "chunk", "sni", "random", etc. |
chunk-size |
Int | Size of chunks when split-mode is "chunk". |
skip |
Bool | If true, bypasses DPI modifications (standard TLS). |
Example¶
# Example A: Allow YouTube with specific DPI bypass settings
[[rules]]
name = "allow youtube"
priority = 50
match = { domains = ["*.youtube.com"] }
https = { disorder = true, fake-count = 7 }
# Example B: Bypass DPI for local network traffic (Standard Connection)
[[rules]]
name = "skip local"
priority = 51
match = { cidrs = ["192.168.0.0/24"] }
https = { skip = true }
# Example C: Block a specific domain
[[rules]]
name = "block ads"
priority = 100
match = { domains = ["ads.example.com"] }
block = true
Deprecated: [[policy.overrides]]¶
Earlier versions used [[policy.overrides]] instead of [[rules]]. The old key is still accepted for backward compatibility but emits a deprecation warning at startup. Migrate to the top-level [[rules]] form — it removes the [policy] indirection that no longer carries any other configuration.