Privacy Tools Guide

WireGuard offers one of the fastest and most secure VPN protocols available today, and its lightweight design makes it ideal for mobile devices. When configured with always-on functionality on iPhone, your traffic routes through an encrypted tunnel automatically, protecting your data on cellular networks, public WiFi, and anywhere else you connect. This guide walks through the complete setup process for developers and power users who want fine-grained control over their VPN configuration.

Why WireGuard on iPhone

WireGuard provides several advantages over traditional VPN protocols on mobile devices. The protocol’s minimal codebase—around 4,000 lines compared to hundreds of thousands in OpenVPN—reduces the attack surface and results in fewer security vulnerabilities. Connection times are dramatically faster, often completing in milliseconds rather than seconds.

For iPhone users specifically, WireGuard integrates natively with iOS through the WireGuard app, using Apple’s NetworkExtension framework for system-level VPN control. This integration enables always-on functionality that reconnects automatically when your network connection changes, whether you’re switching from WiFi to cellular or moving between cell towers.

The cryptographic foundation uses modern primitives: Curve25519 for key exchange, ChaCha20-Poly1305 for authenticated encryption, and BLAKE2s for hashing. These algorithms provide strong security guarantees while maintaining excellent performance on mobile hardware.

Prerequisites

Before starting, ensure you have:

If you need to set up a WireGuard server first, you can use a VPS with Ubuntu or Debian and follow the standard WireGuard installation process. Many managed VPN services also offer WireGuard configuration files for their servers.

Installing and Configuring the WireGuard App

Search for “WireGuard” in the App Store and install the official application developed by the WireGuard team. The app is free and does not require any account creation or subscription.

Once installed, open the app and tap the blue “+” button to add a new tunnel. You have two options for configuration:

  1. Scan from QR code - Use this if your server provides a QR code containing the configuration
  2. Create from scratch - Manual configuration using your server details

For most use cases, importing a configuration file from your VPN provider or self-hosted server is the simplest approach. If you have a configuration file (typically named wg0.conf on the server), you can transfer it to your iPhone via AirDrop, email, or iCloud Files, then open it with the WireGuard app.

Manual Configuration Parameters

If you need to configure manually, gather these details from your server:

Here’s what a typical peer configuration looks like in the WireGuard app:

[Interface]
PrivateKey = <your-client-private-key>
Address = 10.0.0.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = <server-public-key>
Endpoint = vpn.example.com:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25

The PersistentKeepalive setting sends periodic packets every 25 seconds to maintain the connection through NAT and firewalls. For mobile networks where connection state may change frequently, this parameter ensures your tunnel remains active.

Enabling Always-On VPN

The key feature for privacy-conscious users is the always-on VPN, which encrypts all your traffic by default without manual intervention. To enable this in iOS:

  1. Open the Settings app on your iPhone
  2. Navigate to GeneralVPN & Device Management
  3. Tap VPN
  4. Your WireGuard tunnel should appear under “Configuraion”
  5. Tap the “i” info icon next to your tunnel
  6. Enable Connect On Demand
  7. Configure the rules based on your preferences

Always-On Configuration Options

iOS provides several options for when the VPN should connect automatically:

For maximum privacy, enable both WiFi and Cellular connections and set the VPN to remain connected at all times. This ensures your traffic always routes through the encrypted tunnel regardless of your network type.

The “Disconnected” option maintains the VPN connection even when your iPhone sleeps, which is important for continuous protection. However, this may increase battery consumption slightly.

Optimizing for Battery Life

Always-on VPNs do consume battery, but WireGuard’s efficiency minimizes this impact compared to older protocols. To optimize battery performance:

  1. Reduce PersistentKeepalive - If you primarily use WiFi at home or work, you can increase the keepalive interval to 60 or 120 seconds. This reduces packet overhead while still maintaining NAT traversal.

  2. Use Split Tunneling - If you don’t need all traffic through the VPN, you can configure specific routes. However, iOS doesn’t support split tunneling natively in the same way as desktop platforms.

  3. Disable on Low Power Mode - You may want the VPN to disconnect when your phone enters Low Power Mode, though this creates privacy gaps during critical low-battery situations.

  4. WiFi Scanning - Disable “Ask to Join Networks” and auto-joining for open networks to prevent unexpected disconnections and reconnections that cycle your VPN.

Testing Your Always-On Configuration

After configuration, verify that the VPN activates properly:

  1. Enable airplane mode briefly, then disable it - the VPN should reconnect automatically
  2. Walk away from your WiFi range and switch to cellular - observe if the tunnel persists
  3. Check the WireGuard app status indicator - it should show “Connected” with an uptime counter
  4. Visit a website like ipleak.net to confirm your IP address matches your VPN server rather than your ISP

You can also test DNS leak protection by visiting dnsleaktest.com. A properly configured VPN should show DNS servers from your VPN provider, not your ISP.

Advanced Configuration: On-Demand Rules

For users who want granular control, iOS supports On-Demand rules that determine VPN behavior based on network context. Access these through Settings → General → VPN & Device Management → VPN → Your Tunnel → Connect On Demand → Add Rule.

Common On-Demand configurations include:

An example On-Demand rule configuration would connect automatically when not on your trusted network list:

Rule Type: Disconnect
When: WiFi
SSID: MyHomeNetwork, MyOfficeNetwork

Then add a second rule:

Rule Type: Connect
When: WiFi
SSID: Any other network

This creates a hybrid approach where the VPN engages automatically on untrusted networks while remaining optional on networks you control.

Troubleshooting Common Issues

When always-on VPN doesn’t behave as expected, check these common causes:

  1. Profile Conflicts - Multiple VPN configurations can interfere with each other. Remove old VPN profiles from Settings → General → VPN & Device Management.

  2. Network Extension Issues - Force close the WireGuard app and reopen it. If problems persist, delete and re-import your configuration.

  3. iOS Bugs - Some iOS versions have had VPN reconnection bugs. Ensure you’re running the latest iOS version.

  4. Server Reachability - Verify your server is actually reachable. Test from another device or check server logs.

  5. Cellular Carrier Issues - Some carriers block certain VPN ports. Try changing your server’s UDP port to 443, which typically passes through all firewalls.

Security Considerations

While WireGuard provides strong encryption, remember that VPN protection is only one layer of your overall privacy strategy. A VPN encrypts traffic between your device and the VPN server, but the VPN provider can still see your traffic destination. For maximum privacy, use VPN providers with strict no-logging policies or run your own WireGuard server.

Also ensure your iPhone’s remaining security settings are appropriate for your threat model: enable Face ID or a strong passcode, keep iOS updated, and review app permissions regularly.

Advanced Networking: Dual Tunnels and Chaining

For additional privacy layers, advanced users can run multiple VPNs simultaneously:

Chaining VPNs (VPN over VPN):

Configuration 1: VPN → Tor
- Connect to WireGuard VPN first
- Then connect to Tor Browser on top
- Result: Traffic encrypted twice, routed through VPN then Tor
- Advantage: ISP only sees VPN connection, not Tor
- Disadvantage: Performance penalty from double encryption

Configuration 2: Tor → VPN
- Connect to Tor Browser first
- Then use Tor to connect to VPN provider
- Result: VPN provider doesn't know your real IP
- More complex setup, less common

Implementing dual VPN on iOS: iOS doesn’t natively support multiple simultaneous VPN connections. However:

Workaround: Use split tunneling
- Route web traffic through WireGuard
- Route specific apps through regular connection
- Not true chaining, but privacy for most traffic

Connecting to Self-Hosted WireGuard Servers

If you host your own VPN server, additional configuration is needed:

Home WireGuard server setup (overview):

Home Server Setup:
1. Install WireGuard on Linux server (home NAS, Raspberry Pi, etc.)
2. Generate server keypair
3. Generate client keypair for iPhone
4. Configure firewall to port forward (e.g., 51820 UDP)
5. Share QR code or config with iPhone

iOS Configuration:
1. Import config with server public IP (your home IP)
2. Set persistent keepalive to 25 seconds (NAT traversal)
3. Enable always-on VPN

Result: iOS always routes through your home network
Use case: Access files on home network securely while traveling

Dynamic DNS for mobile compatibility:

Since home IP addresses change, use dynamic DNS:

# On home server running WireGuard
#!/bin/bash
# ddns-update.sh - Update DNS when IP changes

PREV_IP_FILE="/tmp/home_ip_prev"
DDNS_PROVIDER="freedns.afraid.org"  # Or duckdns.org, noip.com
DDNS_TOKEN="your-ddns-token"
DOMAIN="yourhome.freedns.afraid.org"

current_ip=$(curl -s https://api.ipify.org)
previous_ip=$(cat $PREV_IP_FILE 2>/dev/null)

if [ "$current_ip" != "$previous_ip" ]; then
    # IP changed, update DDNS
    curl -s "http://$DDNS_PROVIDER/update?token=$DDNS_TOKEN&address=$current_ip"
    echo $current_ip > $PREV_IP_FILE

    # Update WireGuard clients with new IP
    echo "Home IP updated to $current_ip"
    # Distribute new config to iOS devices
fi

# Add to crontab: */10 * * * * /path/to/ddns-update.sh

DNS and IPv6 Configuration

Proper DNS configuration prevents leaks:

DNS configuration in WireGuard:

[Interface]
PrivateKey = ...
Address = 10.0.0.2/24
DNS = 1.1.1.1, 9.9.9.9  # Cloudflare and Quad9

[Peer]
PublicKey = ...
AllowedIPs = 0.0.0.0/0, ::/0  # Route all traffic (IPv4 and IPv6)
Endpoint = vpn.example.com:51820

IPv6 considerations:

Modern networks have IPv6, but many VPNs only tunnel IPv4:

Problem: All IPv6 traffic bypasses VPN
Solution: Disable IPv6 on iPhone when using VPN

Settings → General → VPN & Device Management → [Your Tunnel]
Look for IPv6 settings and disable if available

Or ensure your VPN provider handles IPv6:
- AllowedIPs should include ::/0 (all IPv6)
- VPN server must have IPv6 support

Testing for DNS leaks:

Within WireGuard tunnel:
1. Open Safari, visit dnsleaktest.com
2. Run Extended Test
3. All DNS servers should show your VPN provider's nameservers
4. Never show your ISP's DNS servers

If ISP DNS shows:
- You have a DNS leak
- Check iPhone's DNS settings
- Verify WireGuard config specifies DNS servers
- Try changing DNS to public (1.1.1.1, 8.8.8.8)

Performance Tuning for Different Network Types

WireGuard adapts well to different networks, but optimization helps:

WiFi-optimized settings:

[Interface]
Address = 10.0.0.2/24
DNS = 1.1.1.1
MTU = 1280  # Smaller packets avoid fragmentation on WiFi

[Peer]
PersistentKeepalive = 30  # More frequent pings through WiFi NAT
AllowedIPs = 0.0.0.0/0, ::/0

Cellular-optimized settings:

[Interface]
Address = 10.0.0.2/24
DNS = 1.1.1.1
MTU = 1280

[Peer]
PersistentKeepalive = 60  # Less frequent pings, saves cellular data
AllowedIPs = 0.0.0.0/0, ::/0

High-latency network settings (satellite, weak signal):

[Interface]
Address = 10.0.0.2/24
DNS = 1.1.1.1
MTU = 576  # Very small packets for unreliable connections

[Peer]
PersistentKeepalive = 15  # More aggressive keepalive
ListenPort = 51820
AllowedIPs = 0.0.0.0/0, ::/0

Troubleshooting Connection Issues

Common problems and solutions:

Issue: “VPN not connecting, stuck on ‘Connecting’

1. Check internet connectivity (WiFi or cellular working?)
2. Verify WireGuard endpoint is correct and reachable
   - In Terminal: nslookup vpn.example.com
   - Should resolve to an IP address

3. Check port is reachable
   - Endpoint should be IP:port format
   - Default: vpn.example.com:51820

4. Reset VPN configuration
   - Delete tunnel in WireGuard app
   - Reimport configuration
   - Try connecting again

5. Restart WireGuard app
   - Close completely (swipe up)
   - Reopen from home screen
   - Attempt connection

Issue: Connected but no internet access

1. Verify AllowedIPs includes all traffic:
   - Should show: 0.0.0.0/0 and ::/0
   - If limited to specific IP ranges, only those route through VPN

2. Check server routing
   - Log into VPS running WireGuard
   - Verify IP forwarding enabled: sysctl net.ipv4.ip_forward
   - Verify NAT configured: iptables -t nat -L

3. Check firewall on server
   - UDP port (default 51820) must be open
   - ufw allow 51820/udp

4. Verify client can reach server
   - From another device, ping server IP
   - If unreachable, firewall or network blocking connection

Issue: High battery drain with always-on VPN

1. Disable VPN on trusted home network
   - Settings → VPN → On Demand
   - Add trusted SSID rule: Disconnect when home

2. Increase PersistentKeepalive interval
   - Change from 25 to 60 or 120 seconds
   - Trade-off: Less frequent reconnection checks

3. Disable location-based features
   - VPN + Location Services = extra GPS polling
   - Settings → Privacy → Location Services

4. Use lower security settings on WiFi
   - Connect On Demand → WiFi only
   - Disable on cellular to save battery

Integration with Privacy Services

Enhance WireGuard with other privacy tools:

Combined with Pi-hole (ad blocker on home network):

Home setup:
- Pi-hole running on home network
- WireGuard tunnels to home
- iPhone requests routed through Pi-hole
- Results: Ads blocked, malware filtered

DNS in WireGuard config should point to Pi-hole:
[Interface]
DNS = 192.168.1.100  # Your Pi-hole IP on home network

Combined with ProtonVPN for additional layer:

Security model:
1. iPhone connects to WireGuard (your server)
2. WireGuard server connects to ProtonVPN
3. All iPhone traffic encrypted 2x
4. ProtonVPN can't see iPhone IP
5. VPN provider can't see your server IP

Drawback: Significant performance impact
Recommended only if high threat model justifies it

Built by theluckystrike — More at zovo.one