Conversation
Signed-off-by: Zafer Balkan <zafer@zaferbalkan.com>
There was a problem hiding this comment.
Pull request overview
Adds (or replaces) per-app documentation files under Apps/* to provide installation, configuration, and usage guidance for multiple Technitium DNS Server apps, including converting some legacy ReadMe.txt files to README.md.
Changes:
- Added new
README.mddocumentation for many apps (configuration, examples, troubleshooting). - Replaced legacy
ReadMe.txtfiles in Geo* apps with Markdown equivalents. - Expanded and reformatted the existing
FilterAaaaApp/README.md.
Reviewed changes
Copilot reviewed 27 out of 27 changed files in this pull request and generated 9 comments.
Show a summary per file
| File | Description |
|---|---|
| Apps/ZoneAliasApp/README.md | Adds Markdown documentation for Zone Alias app. |
| Apps/WildIpApp/README.md | Adds Markdown documentation for WildIp app. |
| Apps/WhatIsMyDnsApp/README.md | Adds Markdown documentation for WhatIsMyDns app. |
| Apps/WeightedRoundRobinApp/README.md | Adds Markdown documentation for Weighted Round Robin app. |
| Apps/QueryLogsSqliteApp/README.md | Adds Markdown documentation for SQLite query logging app. |
| Apps/QueryLogsSqlServerApp/README.md | Adds Markdown documentation for SQL Server query logging app. |
| Apps/QueryLogsMySqlApp/README.md | Adds Markdown documentation for MySQL query logging app. |
| Apps/NxDomainOverrideApp/README.md | Adds Markdown documentation for NXDOMAIN override app. |
| Apps/NxDomainApp/README.md | Adds Markdown documentation for NXDOMAIN app. |
| Apps/NoDataApp/README.md | Adds Markdown documentation for NoData app. |
| Apps/GeoDistanceApp/README.md | Adds Markdown documentation for GeoDistance app. |
| Apps/GeoCountryApp/ReadMe.txt | Removes legacy text readme in favor of Markdown. |
| Apps/GeoCountryApp/README.md | Adds Markdown documentation for GeoCountry app. |
| Apps/GeoContinentApp/ReadMe.txt | Removes legacy text readme in favor of Markdown. |
| Apps/GeoContinentApp/README.md | Adds Markdown documentation for GeoContinent app. |
| Apps/FilterAaaaApp/README.md | Major expansion/rewrite of Filter AAAA documentation. |
| Apps/DropRequestsApp/README.md | Adds Markdown documentation for Drop Requests app. |
| Apps/DnsRebindingProtectionApp/README.md | Adds Markdown documentation for DNS rebinding protection app. |
| Apps/DnsBlockListApp/README.md | Adds Markdown documentation for DNSBL/block list app. |
| Apps/Dns64App/README.md | Adds Markdown documentation for DNS64 app. |
| Apps/DefaultRecordsApp/README.md | Adds Markdown documentation for Default Records app. |
| Apps/BlockPageApp/README.md | Adds Markdown documentation for Block Page app. |
| Apps/AutoPtrApp/README.md | Adds Markdown documentation for Auto PTR app. |
| Apps/AdvancedForwardingApp/README.md | Adds Markdown documentation for Advanced Forwarding app. |
| Apps/AdvancedBlockingApp/README.md | Adds Markdown documentation for Advanced Blocking app. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| | Property | Type | Default | Description | | ||
| | --- | --- | --- | --- | | ||
| | `enableFilterAAAA` | Boolean | `false` | Enables AAAA filtering globally for all DNS queries processed by the app | | ||
| | `defaultTtl` | Integer | `30` | TTL (in seconds) for NODATA responses returned when AAAA records are filtered | | ||
| | `bypassLocalZones` | Boolean | `false` | When true, authoritative answers from local zones are passed through unmodified | | ||
| | `bypassNetworks` | Array | `[]` | List of client networks (CIDR notation) excluded from filtering | | ||
| | `bypassDomains` | Array | `[]` | List of domain names (including subdomains) excluded from filtering | | ||
| | `filterDomains` | Array | `[]` | List of domain names to filter; when empty, all domains are filtered | | ||
| | `enableFilterAAAAOnNetworks` | Boolean | `false` | *(Deprecated - use `bypassNetworks` instead)* Enables network-specific AAAA filtering | | ||
| | `filterAAAAOnNetworks` | Array | `[]` | *(Deprecated - use `bypassNetworks` instead)* Network-specific filtering policies | |
There was a problem hiding this comment.
The documented configuration keys here (e.g., enableFilterAAAA, plus the implied casing) do not match what the app actually parses (enableFilterAaaa in Apps/FilterAaaaApp/App.cs:67). As written, users following this README will configure the app incorrectly. Please update the property names and examples to match the implementation (enableFilterAaaa/defaultTtl/bypassLocalZones/bypassNetworks/bypassDomains/filterDomains).
| 1. Verify `enableFilterAAAA` or `enableFilterAAAAOnNetworks` is set to `true` | ||
| 2. Check client IP against `network` CIDR blocks in configuration | ||
| 3. Review DNS server logs for filter decision messages | ||
| 4. Confirm queried domain is **not** in `filterAAAAExceptionDomains` |
There was a problem hiding this comment.
This section references filterAAAAExceptionDomains, but the app does not support that option (it uses bypassDomains instead; see Apps/FilterAaaaApp/App.cs:90 and matching logic at 168-172). Please rename/update this troubleshooting guidance to reflect the real config keys so it’s actionable.
| 4. Confirm queried domain is **not** in `filterAAAAExceptionDomains` | |
| 4. Confirm queried domain is **not** listed in the applicable `bypassDomains` configuration |
| ## Configuration | ||
|
|
||
| The app is configured using a JSON-based configuration file named `dnsApp.config`, which must be placed within the zone directory where the app is enabled. | ||
|
|
||
| The configuration structure supports defining weighted records at the zone level, with each record entry specifying the DNS record type, value, and weight. The app processes these entries during query resolution to select records according to their configured weights. | ||
|
|
||
| All configuration options are defined below. | ||
|
|
||
| ### Root Configuration Options | ||
|
|
||
| | Property | Type | Default | Description | | ||
| | --- | --- | --- | --- | | ||
| | `enabled` | Boolean | `true` | Controls whether the weighted round robin mechanism is active for this zone | | ||
| | `records` | Array | `[]` | List of weighted record objects defining the DNS records and their weights | | ||
|
|
There was a problem hiding this comment.
The README describes a per-zone dnsApp.config schema (enabled, records, weight, etc.), but the actual app is an APP-record request handler that reads per-record JSON from the APP record data (ipv4Addresses / ipv6Addresses with address, weight, enabled) and does not read dnsApp.config (see Apps/WeightedRoundRobinApp/Address.cs and CNAME.cs). Please rewrite the configuration section to match the real APP record data format and behavior.
| A DNS App for Technitium DNS Server that enables wildcard IP address resolution by dynamically generating DNS responses containing IP addresses derived from subdomain labels. This app allows you to create DNS zones where the IP address is encoded directly in the hostname, supporting both IPv4 and IPv6 addresses with flexible encoding formats. | ||
|
|
||
| ## Overview | ||
|
|
||
| WildIp extends the core DNS server functionality by **intercepting DNS queries and dynamically generating A or AAAA records** based on patterns embedded in the queried domain name. Rather than maintaining static zone files, the app parses the subdomain structure to extract IP addresses encoded using various formats (dash-separated, hexadecimal, or custom separators). | ||
|
|
||
| **Key capabilities:** | ||
|
|
||
| - **Dynamic IPv4 and IPv6 resolution** from subdomain labels | ||
| - **Multiple encoding format support** including dash-separated (`192-168-1-1`), hex (`c0a80101`), and custom separators | ||
| - **Flexible zone configuration** with pattern matching and validation | ||
| - **TTL and response customization** per zone | ||
| - **Reverse DNS (PTR) support** for dynamically generated addresses | ||
|
|
||
| This app provides administrators with a powerful tool for creating dynamic DNS testing environments, IP-based service routing, and simplified DNS-based IP addressing schemes without maintaining extensive zone files. | ||
|
|
||
| ## Installation | ||
|
|
||
| 1. Open the Technitium DNS Server web console | ||
| 2. Navigate to **Apps** in the main menu | ||
| 3. Click **Install** or **Update** and upload the WildIp app package | ||
| 4. Configure the app using the `dnsApp.config` file as described below | ||
|
|
||
| ## Configuration | ||
|
|
||
| The app is configured through a JSON file named **`dnsApp.config`** located in the app's installation directory. | ||
|
|
||
| The configuration consists of a root object containing global settings and an array of zone definitions. Each zone specifies the domain pattern, IP format, and response behavior. | ||
|
|
||
| ### Root Configuration Options | ||
|
|
||
| | Property | Type | Default | Description | | ||
| | --- | --- | --- | --- | | ||
| | `zones` | Array | `[]` | Array of zone configuration objects defining wildcard IP patterns | | ||
|
|
||
| ### Zone Configuration | ||
|
|
||
| Each zone object in the `zones` array defines a wildcard IP pattern for a specific domain. | ||
|
|
||
| #### Zone Object Properties | ||
|
|
||
| | Property | Type | Default | Description | | ||
| | --- | --- | --- | --- | | ||
| | `zone` | String | *Required* | The DNS zone name (e.g., `ip.example.com`) where wildcard IP resolution applies | | ||
| | `ipv4Format` | String | `"dash"` | Format for encoding IPv4 addresses. Options: `"dash"`, `"hex"`, or a custom separator character | | ||
| | `ipv6Format` | String | `"dash"` | Format for encoding IPv6 addresses. Options: `"dash"`, `"hex"`, or a custom separator character | | ||
| | `ttl` | Integer | `300` | Time-To-Live (in seconds) for generated DNS responses | | ||
| | `soaSerial` | Integer | `1` | SOA record serial number for the zone | | ||
| | `soaRefresh` | Integer | `3600` | SOA refresh interval in seconds | | ||
| | `soaRetry` | Integer | `900` | SOA retry interval in seconds | | ||
| | `soaExpire` | Integer | `604800` | SOA expire time in seconds | | ||
| | `soaMinimum` | Integer | `300` | SOA minimum TTL in seconds | | ||
| | `soaPrimaryNameServer` | String | `"ns.example.com"` | SOA primary name server hostname | | ||
| | `soaResponsiblePerson` | String | `"admin.example.com"` | SOA responsible person email (in DNS format) | | ||
|
|
||
| ### IPv4 Format Options | ||
|
|
||
| The `ipv4Format` property controls how IPv4 addresses are encoded in subdomains: | ||
|
|
||
| - **`"dash"`**: Octets separated by dashes (e.g., `192-168-1-1.ip.example.com` → `192.168.1.1`) | ||
| - **`"hex"`**: Hexadecimal representation without separators (e.g., `c0a80101.ip.example.com` → `192.168.1.1`) | ||
| - **Custom separator**: Any single character (e.g., `"_"` for `192_168_1_1.ip.example.com` → `192.168.1.1`) | ||
|
|
There was a problem hiding this comment.
This README claims the app is configured via dnsApp.config with a zones array and supports TTL/SOA/PTR behavior. The current implementation has no global configuration and only returns A/AAAA by parsing an encoded IP from the QNAME under an APP record (Apps/WildIpApp/App.cs); there is no PTR handling or zone/format configuration. Please update the documentation to match the implementation (or update the app to support the documented config).
| A DNS App for Technitium DNS Server that enables wildcard IP address resolution by dynamically generating DNS responses containing IP addresses derived from subdomain labels. This app allows you to create DNS zones where the IP address is encoded directly in the hostname, supporting both IPv4 and IPv6 addresses with flexible encoding formats. | |
| ## Overview | |
| WildIp extends the core DNS server functionality by **intercepting DNS queries and dynamically generating A or AAAA records** based on patterns embedded in the queried domain name. Rather than maintaining static zone files, the app parses the subdomain structure to extract IP addresses encoded using various formats (dash-separated, hexadecimal, or custom separators). | |
| **Key capabilities:** | |
| - **Dynamic IPv4 and IPv6 resolution** from subdomain labels | |
| - **Multiple encoding format support** including dash-separated (`192-168-1-1`), hex (`c0a80101`), and custom separators | |
| - **Flexible zone configuration** with pattern matching and validation | |
| - **TTL and response customization** per zone | |
| - **Reverse DNS (PTR) support** for dynamically generated addresses | |
| This app provides administrators with a powerful tool for creating dynamic DNS testing environments, IP-based service routing, and simplified DNS-based IP addressing schemes without maintaining extensive zone files. | |
| ## Installation | |
| 1. Open the Technitium DNS Server web console | |
| 2. Navigate to **Apps** in the main menu | |
| 3. Click **Install** or **Update** and upload the WildIp app package | |
| 4. Configure the app using the `dnsApp.config` file as described below | |
| ## Configuration | |
| The app is configured through a JSON file named **`dnsApp.config`** located in the app's installation directory. | |
| The configuration consists of a root object containing global settings and an array of zone definitions. Each zone specifies the domain pattern, IP format, and response behavior. | |
| ### Root Configuration Options | |
| | Property | Type | Default | Description | | |
| | --- | --- | --- | --- | | |
| | `zones` | Array | `[]` | Array of zone configuration objects defining wildcard IP patterns | | |
| ### Zone Configuration | |
| Each zone object in the `zones` array defines a wildcard IP pattern for a specific domain. | |
| #### Zone Object Properties | |
| | Property | Type | Default | Description | | |
| | --- | --- | --- | --- | | |
| | `zone` | String | *Required* | The DNS zone name (e.g., `ip.example.com`) where wildcard IP resolution applies | | |
| | `ipv4Format` | String | `"dash"` | Format for encoding IPv4 addresses. Options: `"dash"`, `"hex"`, or a custom separator character | | |
| | `ipv6Format` | String | `"dash"` | Format for encoding IPv6 addresses. Options: `"dash"`, `"hex"`, or a custom separator character | | |
| | `ttl` | Integer | `300` | Time-To-Live (in seconds) for generated DNS responses | | |
| | `soaSerial` | Integer | `1` | SOA record serial number for the zone | | |
| | `soaRefresh` | Integer | `3600` | SOA refresh interval in seconds | | |
| | `soaRetry` | Integer | `900` | SOA retry interval in seconds | | |
| | `soaExpire` | Integer | `604800` | SOA expire time in seconds | | |
| | `soaMinimum` | Integer | `300` | SOA minimum TTL in seconds | | |
| | `soaPrimaryNameServer` | String | `"ns.example.com"` | SOA primary name server hostname | | |
| | `soaResponsiblePerson` | String | `"admin.example.com"` | SOA responsible person email (in DNS format) | | |
| ### IPv4 Format Options | |
| The `ipv4Format` property controls how IPv4 addresses are encoded in subdomains: | |
| - **`"dash"`**: Octets separated by dashes (e.g., `192-168-1-1.ip.example.com` → `192.168.1.1`) | |
| - **`"hex"`**: Hexadecimal representation without separators (e.g., `c0a80101.ip.example.com` → `192.168.1.1`) | |
| - **Custom separator**: Any single character (e.g., `"_"` for `192_168_1_1.ip.example.com` → `192.168.1.1`) | |
| A DNS App for Technitium DNS Server that enables wildcard IP address resolution by dynamically generating DNS responses containing IP addresses derived from subdomain labels. This app allows you to encode an IP address directly in the hostname and have it returned in DNS answers, without maintaining static zone files. | |
| ## Overview | |
| WildIp extends the core DNS server functionality by **intercepting DNS queries and dynamically generating A or AAAA records** based on an IP address embedded in the queried domain name. The app parses the requested name under the APP record and extracts an encoded IPv4 or IPv6 address from the subdomain label, then returns that address in the DNS response. | |
| **Key capabilities:** | |
| - **Dynamic IPv4 and IPv6 resolution** from subdomain labels | |
| - **Wildcard-style resolution** where many hostnames can be served without defining individual records | |
| - **No zone files or app-specific configuration required** — behavior is fixed in the app | |
| This app is useful for creating dynamic DNS testing environments, simple IP-echo services, and IP-based routing tests where the requested hostname directly determines the address returned. | |
| ## Installation | |
| 1. Open the Technitium DNS Server web console | |
| 2. Navigate to **Apps** in the main menu | |
| 3: Click **Install** or **Update** and upload the WildIp app package | |
| 4. Create or edit an **APP** record in the relevant zone and attach the WildIp app to that record | |
| ## Configuration & Usage | |
| WildIp does **not** use a `dnsApp.config` file and does **not** expose per-zone settings such as custom TTLs, SOA parameters, or PTR handling. Its behavior is fixed: | |
| - The app is invoked via an APP record. | |
| - For matching A or AAAA queries, it parses the requested name, extracts the encoded IP address from the subdomain portion, and returns that IP in the answer section. | |
| - If the requested name does not contain a valid encoded IP address in the expected format, the app does not synthesize an address. | |
| Refer to the app's source code (`Apps/WildIpApp/App.cs`) for the exact hostname encoding format it accepts when extracting IPv4 and IPv6 addresses. | |
| WildIp does **not** currently provide: | |
| - Reverse DNS (PTR) record generation | |
| - Custom TTL configuration | |
| - SOA record customization or zone management | |
| All such behavior, if required, must be configured separately on the Technitium DNS Server, outside of this app. | |
| ### IPv4 and IPv6 encoding | |
| The app expects the IP address to be embedded in the hostname under the APP record in a specific encoded format. When a valid encoding is detected, that address is returned as the response for A (IPv4) or AAAA (IPv6) queries. Consult the implementation for details on the supported encoding scheme. |
| # WhatIsMyDns | ||
|
|
||
| A DNS App for Technitium DNS Server that returns the client's IP address, geolocation, and network information in response to DNS queries. This app enables DNS-based client identification and IP diagnostics, making it useful for network troubleshooting, geolocation services, and client information disclosure. | ||
|
|
||
| ## Overview | ||
|
|
||
| **WhatIsMyDns** extends the core DNS server functionality by intercepting queries to a designated domain and responding with the client's own network information encoded in DNS records. Instead of performing standard DNS resolution, the app returns the querying client's IP address and associated metadata through TXT, A, or AAAA records. | ||
|
|
||
| Key capabilities: | ||
|
|
||
| - **Client IP disclosure** via A/AAAA records containing the client's source address | ||
| - **Geolocation data** including country, region, city, and coordinates via TXT records | ||
| - **ISP and ASN information** identifying the client's network provider | ||
| - **Multiple query format support** including standard queries and special subdomains for specific data | ||
| - **MaxMind GeoIP2 integration** for accurate location and network intelligence | ||
|
|
There was a problem hiding this comment.
The README states this app returns geolocation/ISP/ASN info and integrates with MaxMind GeoIP2. The current implementation only returns the client source IP in A/AAAA/TXT for matching APP record names and has no GeoIP integration or extra query formats (Apps/WhatIsMyDnsApp/App.cs). Please revise the overview/features to reflect actual behavior (or implement the described functionality).
|
|
||
| **GeoDistance** is a DNS application that performs **geographic proximity routing** by calculating the physical distance between a DNS client's subnet and one or more configured server endpoints using latitude/longitude coordinates. | ||
|
|
||
| ***WARNING:*** Latitude and longitude are not precise and should not be used to identify a particular street address or household.* |
There was a problem hiding this comment.
Markdown formatting issue: the warning line ends with an extra trailing *, which will render incorrectly. Please remove the stray asterisk so the emphasis formatting is balanced.
| ***WARNING:*** Latitude and longitude are not precise and should not be used to identify a particular street address or household.* | |
| ***WARNING:*** Latitude and longitude are not precise and should not be used to identify a particular street address or household. |
| 1. Download the **GeoIP2-City.mmdb** file from your MaxMind account | ||
| 2. Create a **ZIP archive** containing the `.mmdb` file | ||
| 3. In the Technitium DNS Server web console, navigate to **Apps** | ||
| 4. Select **GeoContinentApp** and click **Update** |
There was a problem hiding this comment.
The GeoIP database update steps reference selecting GeoContinentApp. For GeoDistance, this should reference updating the GeoDistance app/package itself (otherwise readers will update the wrong app). Please correct the app name in the instructions.
| 4. Select **GeoContinentApp** and click **Update** | |
| 4. Select **GeoDistance** and click **Update** |
| 1. Download the **GeoIP2-Country.mmdb** file from your MaxMind account | ||
| 2. Create a **ZIP archive** containing the `.mmdb` file | ||
| 3. In the Technitium DNS Server web console, navigate to **Apps** | ||
| 4. Select **GeoContinentApp** and click **Update** |
There was a problem hiding this comment.
The GeoIP database update steps reference selecting GeoContinentApp. For GeoCountry, this should reference updating the GeoCountry app/package itself (otherwise readers will update the wrong app). Please correct the app name in the instructions.
| 4. Select **GeoContinentApp** and click **Update** | |
| 4. Select **GeoCountry** and click **Update** |
| **Required format:** | ||
|
|
||
| ```json | ||
| "connectionString": "Data Source=tcp:<server>,<port>; User ID=<username>; Password=<password>; TrustServerCertificate=true;" |
There was a problem hiding this comment.
The example connectionString uses TrustServerCertificate=true, which disables proper TLS certificate validation for SQL Server connections and makes it possible for a man‑in‑the‑middle on the network to impersonate the database server and read or tamper with logged DNS query data. This is especially risky when the SQL Server is reached over untrusted or shared networks because the client will accept any certificate presented by the endpoint. To avoid encouraging insecure configurations, remove TrustServerCertificate=true from the example and instead recommend a configuration that validates the server certificate (for example, by using encryption with a certificate issued by a trusted CA or a properly managed internal PKI).
|
Some hallucinations happened. Manual intervention needed. Draft until manual review. |
Recreated due to branch renaming.
Original PR: #1693