Privacy Tools Guide

Private DNS provides a method to encrypt Domain Name System (DNS) queries originating from your Android device. When configured correctly, this encrypts DNS resolution for every application on your phone—not just browsers—preventing your internet service provider and network observers from seeing which domains you access.

Android’s Private DNS feature, introduced in Android 9 (Pie), implements DNS-over-TLS (DoT) at the system level. This means applications that use standard Android networking APIs automatically benefit from encrypted DNS resolution without any code modifications.

Understanding DNS Privacy on Android

By default, DNS queries travel over UDP or TCP in plaintext. Anyone monitoring your network traffic can intercept these queries and build a log of every website you visit. While HTTPS encrypts the contents of your communication, the DNS resolution still reveals the domain names you connect to.

Private DNS solves this problem by establishing a TLS-encrypted connection between your device and a DNS resolver. Android supports this through the “Private DNS” setting, which handles certificate validation automatically when you specify a provider hostname.

The key advantage for developers and power users is that this works at the operating system level. Unlike browser extensions or app-specific solutions, Private DNS protects all applications simultaneously.

Configuring Private DNS on Android

The configuration process involves navigating to your device’s network settings and specifying a Private DNS provider hostname. Android accepts three modes:

Step-by-Step Configuration

  1. Open Settings on your Android device
  2. Navigate to Network & Internet (or Connections on Samsung devices)
  3. Tap Internet or Mobile Network
  4. Select Private DNS (may appear under Advanced or DNS)
  5. Choose the Hostname option
  6. Enter the provider hostname

Several organizations operate free, privacy-respecting DNS-over-TLS services:

Provider Hostname
Cloudflare one.one.one.one
Google dns.google
Quad9 dns.quad9.net
NextDNS dns.nextdns.io
AdGuard dns.adguard-dns.com

For users wanting to avoid major technology companies, Quad9 provides a solid option with no logging of IP addresses. NextDNS offers customizable blocking lists, though some features require a free account.

Verifying Your Private DNS Configuration

After configuration, you should verify that DNS queries are actually encrypted. Several methods exist depending on your technical preferences.

Using DNS Leak Tests

Websites like dnsleaktest.com display the DNS servers resolving your queries. If configured correctly, you should see your chosen Private DNS provider rather than your ISP’s servers.

Command-Line Verification

For developers wanting programmatic verification, the nslookup or dig commands can confirm DoT functionality:

# Test DNS-over-TLS directly
nslookup -type=TLS _dns.google 2>/dev/null || echo "TLS not available"

Android Developer Options

Android’s hidden developer menu provides additional diagnostics:

# Enable DNS logging via ADB
adb shell settings put global private_dns_specifier "hostname"
adb shell settings put global private_dns_mode "hostname"

The system logcat output shows DNS resolution behavior:

adb logcat | grep -i "dns\|private"

Advanced Configuration for Developers

For developers building applications that need explicit DNS-over-TLS implementation, Android’s InetAddress class handles DoT automatically when the system Private DNS setting is enabled. No additional code is required for apps using standard networking APIs.

Programmatic DNS Configuration

Applications can also specify custom DNS servers using standard Java networking:

// Force DNS resolution through specific servers
System.setProperty("dns.server", "1.1.1.1,1.0.0.1");

For more granular control, Android’s DnsResolver API (API level 34+) allows custom DNS resolution with different protocols:

import android.net.DnsResolver
import android.net.InetAddress
import android.os.Build

fun resolveDnsWithDoT(hostname: String) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
        DnsResolver.getInstance().resolve(
            hostname,
            NetConnection.WriteParameters.TLS,
            emptyList(),
            Runnable::run
        ).addSuccessListener { addresses ->
            addresses.forEach { addr ->
                println("Resolved: ${addr.hostAddress}")
            }
        }
    }
}

Troubleshooting Common Issues

Some applications or networks may experience issues with Private DNS. Common problems include:

Connection Failures: Some captive portal networks interfere with DoT. Temporarily disable Private DNS if you cannot access captive portal login pages.

App Compatibility: Older applications using hardcoded DNS servers (bypassing Android’s DNS API) won’t benefit from Private DNS. This is rare but occurs in some custom applications.

Network Switching: When switching between WiFi and mobile data, re-negotiation of the TLS connection may cause brief delays. This is normal behavior.

Limitations of Private DNS

Understanding what Private DNS does not protect is important for security-conscious users:

For users requiring full traffic encryption alongside DNS privacy, combining Private DNS with a VPN service provides protection.

Threat Model Analysis for DNS Privacy

Different users face different threats. Understanding your specific threat model helps determine appropriate DNS configuration.

ISP Surveillance: Your internet service provider can observe DNS queries without Private DNS. Switching to Private DNS prevents ISP-level tracking.

Network-Level Monitoring: Public WiFi networks capture plaintext DNS. Private DNS encrypts these queries from the network operator.

DNS Hijacking: Some networks redirect DNS to tracking servers. Private DNS prevents this attack by verifying the DNS provider’s TLS certificate.

Geolocation via DNS: Services use DNS resolver location to infer your location. Switching DNS providers may change geo-blocking results.

Provider Comparison: Privacy and Performance

Choosing the right provider involves tradeoffs:

Provider Encryption Logging Speed Jurisdiction Cost
Cloudflare (1.1.1.1) DoT/DoH No logs (claimed) Fastest US Free
Quad9 (9.9.9.9) DoT/DoH IP logs deleted hourly Good Swiss Free
NextDNS DoT/DoH Configurable retention Good US Free - $19.99/year
UncensoredDNS DoT No logs Good Denmark Free
Mullvad (default) DoT No logs Good Sweden Free

Quad9 and Mullvad lean toward privacy-first; Cloudflare prioritizes speed.

Advanced Configuration with DNS Blocking

Some users want Private DNS combined with ad/tracker blocking:

# NextDNS allows configuration via API
# Example: Create a blocking profile

curl -X POST "https://api.nextdns.io/profiles" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "blocking-profile",
    "settings": {
      "block_ads": true,
      "block_malware": true,
      "block_trackers": true
    }
  }'

This profile can then be used in Android’s Private DNS setting.

Bypassing DNS Blocking in Restricted Networks

In environments where DNS blocking prevents access to certain sites:

# Test if specific domain is blocked
nslookup example.com your-private-dns-provider

# If blocked, use alternate resolution paths
# Configure VPN with custom DNS
# Or use DNS-over-HTTPS (DoH) instead of DoT for better obfuscation

DNS-over-HTTPS may evade some network-level blocks because it uses standard HTTPS ports (443) rather than dedicated DNS ports.

Monitoring DNS Configuration with ADB

For power users wanting verification:

# ADB commands to inspect DNS settings
adb shell settings get global private_dns_specifier

# View all DNS-related properties
adb shell getprop | grep dns

This helps confirm Private DNS is active and reveals fallback behavior.

Integration with VPN Services

When using Private DNS alongside a VPN:

# Ensure DNS doesn't leak outside VPN tunnel
# Configure on Linux with systemd-resolved

[Resolve]
DNS=1.1.1.1 1.0.0.1
FallbackDNS=
Domains=
DNSSEC=yes
DNSSECNegativeTrustAnchors=

This configuration forces DNS through only specified servers, preventing leaks.

DNS Privacy in Development and Testing

For developers testing applications:

// Example: Detecting DNS-over-TLS in Android
fun isDnsEncrypted(context: Context): Boolean {
    val connectivityManager =
        context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

    val network = connectivityManager.activeNetwork ?: return false
    val linkProperties = connectivityManager.getLinkProperties(network) ?: return false

    return linkProperties.dnsServers.any {
        it.hostAddress == "one.one.one.one" // Cloudflare DoT
    }
}

This helps applications verify DNS configuration meets security requirements.

Troubleshooting Unresponsive DNS Providers

If Private DNS stops working:

# Test connectivity to DNS provider
adb shell ping one.one.one.one

# Check for connectivity timeouts
adb logcat | grep -i dns

# Temporarily disable for network access
# Then re-enable once network stabilizes

Network instability sometimes breaks DoT connections. Temporarily disabling helps identify the root cause.

Built by theluckystrike — More at zovo.one