Skip to content

Configuration ​

Look up honk's DAE settings exposed by doona, their defaults, and how they take effect. For configuration syntax, use honk's nodes, subscriptions, groups, routing, and DNS references. Start with Quick start or follow Route your first connection.

The tables show defaults for honk 1b95e2e. The example overrides some defaults. The Applies column links to the corresponding write-permission or restart row in What doona can change.

Native API and authentication ​

KeyDefaultWhat doona does with itApplieshonk reference
experimental.native_api.enabledfalseEnables the native API used by doona.Restartexperimental
experimental.native_api.listen127.0.0.1:9527API address. Use a numeric IP and a nonzero port.Restartexperimental
experimental.native_api.password_authfalseEnables administrator sign-in; cannot coexist with secret or anonymous loopback.Restartexperimental
experimental.native_api.secret''Token sign-in. Visible ASCII without whitespace or commas.Restartexperimental
experimental.native_api.allow_anonymous_loopbackfalseAllows uncredentialed loopback access; does not grant protected writes.Restartexperimental
experimental.native_api.config_writefalsePermits source writes and geodata updates with credentials.Restartexperimental
experimental.native_api.ui''Serves doona at /ui/: a directory containing index.html, or embedded / embedded-lite with a native-ui build.Restartexperimental
experimental.native_api.allow_origins[]Additional browser origins, such as https://panel.example.Restartexperimental
experimental.native_api.allowed_hosts[]Additional HTTP host authorities, such as panel.example.Restartexperimental

Data directory and state database ​

KeyDefaultWhat doona does with itApplieshonk reference
global.data_dir/var/lib/honkRuntime root; state database is state/honk.db below it.Restartglobal
global.store_subscribetrueRetains subscription bodies for offline startup; per-entry cache must also allow it.Restartsubscription
experimental.cache_file.enabledUnsetUnset keeps Selector choices and delay samples; false disables this cache; true also keeps Clash mode and permits DNS persistence.Restartexperimental
experimental.cache_file.store_dnsfalseRetains DNS answers when enabled: true.Restartexperimental

The state database also holds administrator credentials and geodata settings. --store db selects database-backed configuration revisions; it is a startup option, not a DAE key. See revision requirements.

Assets and subscription defaults ​

KeyDefaultWhat doona does with itApplieshonk reference
assets.routeEmpty; routing rulesDefault download route: routing, direct, or a group. Inherited by geodata, UI and subscriptions.Restartassets
assets.geodata.geosite''; built-in URLs with state DBHTTP(S) source for loaded domain categories.Restartassets
assets.geodata.geoip''; built-in URLs with state DBHTTP(S) source for loaded IP categories.Restartassets
assets.geodata.routeInherits assets.routeDownload route for data and checksums. An unset route preserves a stored override.Restartassets
assets.ui.urlzashboard dist.zipClash dashboard download, not the doona directory. HONK_UI_DOWNLOAD_URL overrides it.Restartassets
assets.ui.routeInherits assets.routeClash dashboard download route; also accepts a node tag.Restartassets
assets.subscription.uahonk/<version>Default subscription User-Agent; an entry can override it.Reloadassets
assets.subscription.interval86400sDefault refresh interval; 0 disables scheduled refresh.Reloadassets
assets.subscription.cachetrueDefault per-entry body cache, subject to global.store_subscribe.Reloadassets

Entry options override subscription defaults. Sub-block routes override assets.route. An effective change to inherited geodata or UI settings requires a restart; subscription-only changes can reload. Explicit startup geodata URLs and routes replace stored overrides. Defining a URL does not load an asset. See geodata requirements.

Recording permissions ​

KeyDefaultWhat doona does with itApplieshonk reference
experimental.native_api.record_traffictrueTraffic history charts.Restartexperimental
experimental.native_api.record_memorytrueMemory history charts.Restartexperimental
experimental.native_api.record_flowstruePermits flow recording for Routing log and rule-hit evidence.Restartexperimental
experimental.native_api.record_logstruePermits the Logs recorder.Restartexperimental
experimental.native_api.record_dns_logtruePermits the DNS resolution log recorder.Restartexperimental

These file keys grant recorder permission. Flows, logs and DNS logs start in on-demand mode. Their runtime switches cannot override a configured prohibition. Connections lists active userspace connections separately from the flow recorder. See Connections, flows, and runtime overrides.

Health checks ​

KeyDefaultWhat doona does with itApplieshonk reference
global.tcp_check_urlhttps://www.gstatic.com/generate_204Global HTTP probe target list; the health loop uses the first URL.Restartglobal
global.tcp_check_http_methodHEADGlobal HTTP health-check method.Restartglobal
global.udp_check_dnsdns.google:53, 8.8.8.8, 2001:4860:4860::8888UDP probe targets; the first literal IP takes precedence over names.Restartglobal
global.check_interval30sGlobal health-check interval.Restartglobal
global.check_tolerance50msDefault latency improvement required to switch URLTest members.Reloadglobal

Logging ​

KeyDefaultWhat doona does with itApplieshonk reference
global.log_levelinfoStartup filter. A valid RUST_LOG takes precedence, then --debug.Restartglobal
global.log_file''Optional file output. Relative paths resolve below data_dir; --log-file overrides this value.Restartglobal

Interfaces and kernel ​

KeyDefaultWhat doona does with itApplieshonk reference
global.lan_interface[]LAN interfaces for forwarded traffic; no LAN hooks when empty.Restartglobal
global.wan_interface[]Interfaces for host traffic; auto follows the lowest-metric IPv4 default route.Restartglobal
global.tproxy_port12345Transparent TCP/UDP listener port.Restartglobal
global.so_mark_from_dae0Effective mark is 0x100 at zero; otherwise the configured socket bypass mark.Restartglobal
global.nfqueue_enabletrueRequests NFQUEUE staging for ambiguous forwarded LAN UDP. Requires the real eBPF backend.Restartglobal

To handle LAN clients, set global.lan_interface to the interface facing them:

  • On a main router, use its LAN bridge, commonly br-lan; clients already use this router as their gateway.
  • On a side router, also set clients' gateway and DNS to the side router's LAN address, either on each client or through the main router's DHCP settings.

Do not assume lan_interface: auto selects the LAN. It selects the interface with the lowest-metric IPv4 default route, usually the WAN interface on a main router.

Dialing and warm-up ​

KeyDefaultWhat doona does with itApplieshonk reference
global.dial_modedomainDomain discovery and rerouting mode: ip, domain, domain+, domain++.Reloadglobal
global.bootstrap_resolver''Resolver for node names and control-plane dials. Direct geodata downloads from hostnames need it.Reloadglobal
global.tls_implementationtlsSelects regular TLS or utls ClientHello emulation.Restartglobal
global.max_concurrent_dials64Requested cap on physical proxy connects and handshakes; resource budgeting can lower it.Reloadglobal
global.udp_warm_node_count0UDP warm-up candidate count; zero disables it.Reloadglobal
global.preconnect_node_countautoStartup-only bare-TCP warm-up; auto chooses at most eight eligible nodes. Reload does not repeat it.Restart for warm-upglobal

Accepted without runtime effect ​

KeyDefaultWhat doona does with itApplieshonk reference
global.tproxy_port_protecttrueStored only; does not control port protection.Restartglobal
global.pprof_port0Stored only; starts no pprof server.Restartglobal
global.auto_config_kernel_parameterfalseStored only; does not control the datapath's fixed sysctl setup.Restartglobal
global.disable_waiting_networkfalseStored only; does not alter startup waiting.Reloadglobal
global.allow_insecurefalseStored only; does not disable certificate verification globally.Reloadglobal
global.sniffing_timeout30msStored only; does not set the runtime sniffing timeout.Reloadglobal
global.mptcpfalseStored only; does not enable MPTCP.Reloadglobal
global.fallback_resolver8.8.8.8:53Stored only; does not select a fallback resolver.Reloadglobal
global.tls_fragmentfalseStored only; does not enable TLS fragmentation.Reloadglobal
global.tls_fragment_length''Stored only; does not set a fragment length.Reloadglobal
global.tls_fragment_interval''Stored only; does not set a fragment interval.Reloadglobal
global.bandwidth_max_tx''Stored only; does not limit transmit bandwidth.Reloadglobal
global.bandwidth_max_rx''Stored only; does not limit receive bandwidth.Reloadglobal
global.utls_imitatechrome_autoAccepted fingerprint request; does not change the single supported Chrome profile.Reloadglobal

DNS listener and Clash compatibility ​

KeyDefaultWhat doona does with itApplieshonk reference
dns.bind''Standalone DNS listener; empty disables it. Edit outside doona.Restartdns
experimental.clash_api.external_controller''Clash API listener; empty disables it.Restartexperimental
experimental.clash_api.external_ui''Clash dashboard directory.Restartexperimental
experimental.clash_api.secret''Clash bearer secret; declaring it makes its source read-only in doona.Restartexperimental
experimental.clash_api.default_modeRuleInitial Clash mode: Rule, Global, or Direct.Restartexperimental

Runtime API fields, not DAE keys ​

KeyDefaultWhat doona does with itApplieshonk reference
record_flows, record_logs, record_dns_logautoOn-demand recorder modes: auto, on, off; configured prohibitions still apply.Liveapi
log.levelFrom global.log_levelLive log filter; also changes console and file output when overridden.Liveapi
log.buffered_records512Log ring capacity; 64–512.Liveapi
dns_log.max_records512DNS log capacity; 64–512.Liveapi
flows.max_flows1024Flow record capacity; 64–1024.Liveapi
flows.retention_seconds300Terminal flow retention; 1–300 seconds.Liveapi

Change these through Settings, not a DAE file. An accepted activation or restart resets them. See runtime override requirements.

Stored geodata settings, not DAE keys ​

KeyDefaultWhat doona does with itApplieshonk reference
geodata.geosite.urls, geodata.geoip.urlsGitHub + jsDelivr; geoip.dat for GeoIPStored URL lists; startup file URLs take precedence.Live, storedapi
geodata.downloadRouting rulesDownload route and optional group_id; configured startup routes take precedence.Live, storedapi
geodata.verify_checksumtrueChecksum verification for downloads.Live, storedapi
geodata.auto_update.enabledtrueEnables scheduled update checks.Live, storedapi
geodata.auto_update.interval_hours24Interval between scheduled checks, in hours.Live, storedapi

Change these through Settings with credentials and an available state database. Saving settings does not itself activate new asset files. See geodata settings requirements.

Aliases and migration keys ​

Old nameCurrent name
experimental.native_api.geosite_download_urlassets.geodata.geosite
experimental.native_api.geoip_download_urlassets.geodata.geoip
experimental.native_api.geodata_download_detourassets.geodata.route
experimental.clash_api.external_ui_download_urlassets.ui.url
experimental.clash_api.external_ui_download_detourassets.ui.route
experimental.udp_nfqueue.enabledglobal.nfqueue_enable

Use the current names in new files. Asset aliases emit legacy-assets-key; a nonempty old value combined with its new key fails with conflicting-assets-setting. The old NFQUEUE block emits a migration warning and supplies the value only when global.nfqueue_enable is absent. experimental.cache_file.path and cache_id are legacy import hints, not the active database location. store_fakeip has no effect.

Complete annotated example ​

This main file adds the tutorial subscription, group, domain rule, DNS rule and download defaults. Replace the subscription URL before starting honk.

Keep API credentials separate from the main file that Nodes modifies. See source write requirements.

Main file ​

dae
# /etc/honk/config.dae
# Keep API credentials in a separate include.
include {
    config.d/*.dae
}

# Host traffic, storage, checks and connection settings.
global {
    wan_interface: auto
    # For LAN clients, uncomment and replace with their gateway interface.
    # lan_interface: br-lan
    data_dir: '/var/lib/honk'
    store_subscribe: true
    log_level: info
    # Optional append-only log file, relative to data_dir.
    # log_file: 'honk.log'
    tproxy_port: 12345
    so_mark_from_dae: 0
    nfqueue_enable: true
    tcp_check_url: 'https://www.gstatic.com/generate_204'
    tcp_check_http_method: HEAD
    udp_check_dns: 'dns.google:53', '8.8.8.8', '2001:4860:4860::8888'
    check_interval: 30s
    check_tolerance: 50ms
    dial_mode: domain
    bootstrap_resolver: '1.1.1.1:53'
    tls_implementation: tls
    max_concurrent_dials: 64
    preconnect_node_count: auto
    udp_warm_node_count: 0
}

# Replace the placeholder with your provider's subscription URL.
subscription {
    harbor: 'https://subscription.example/sub'
}

# Optional static nodes; uncomment only with your real node details.
node {
    # backup: 'socks5://192.0.2.2:1080'
}

# Select from harbor's nodes by moving-average latency.
group {
    # This group is used by both the traffic rule and the DNS upstream.
    proxy {
        filter: subtag('harbor')
        policy: min_moving_avg
    }
}

# Send only the tutorial domain through the group.
routing {
    domain(full: example.com) -> proxy
    fallback: direct
}

# Resolve the tutorial domain through the same group.
dns {
    # An IP-based HTTPS endpoint avoids a bootstrap hostname dependency.
    upstream {
        remote_dns: 'https://1.1.1.1/dns-query' -> proxy
    }
    # Other DNS requests keep their original destination.
    routing {
        # Match the same full domain as the traffic rule.
        request {
            qname(full: example.com) -> remote_dns
            fallback: asis
        }
        # Keep the selected upstream's answer.
        response {
            fallback: accept
        }
    }
}

# Download defaults; these URLs alone do not load geodata assets.
assets {
    route: routing
    # Sources for updates after routing rules load the relevant assets.
    geodata {
        geosite: 'https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/release/geosite.dat'
        geoip: 'https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/release/geoip.dat'
        route: direct
    }
    # Applies only to a separately configured Clash dashboard, not doona.
    ui {
        url: 'https://github.com/Zephyruso/zashboard/releases/latest/download/dist.zip'
        route: direct
    }
    # Individual subscription options can override these defaults.
    subscription {
        interval: 86400s
        cache: true
        # ua: 'clash.meta'
    }
}

API file ​

Write the API block from Quick start to /etc/honk/config.d/api.dae, or use the separate UI configuration for installed UI files.

Then restart honk. For the corresponding UI steps, follow Route your first connection.


Source: doona upstream, licensed under CC BY 4.0.