VPNSmith
self-host-vpnHOWTO

WireGuard on Android: Complete Setup Guide (2026)

Set up WireGuard on Android in 2026: install the app, import your server config by QR or file, enable always-on + kill switch, per-app split tunneling, and fix handshake/MTU issues. Works with PiVPN, NetBird or a manual server.

By Eric Gerard · Founder · VPNSmith - Self-host VPN & GDPR VPS specialist5 min readPhoto via Unsplash

WireGuard is the fastest, simplest VPN protocol to run on a phone - once it is set up, connecting is a single toggle, and it sips battery compared with older protocols. This guide walks through WireGuard on Android end to end in 2026: installing the app, importing your server config, enabling a kill switch, per-app split tunneling, and fixing the handshake and MTU issues people hit. It works with any WireGuard server - PiVPN, NetBird, or a manual setup.

What you need before you start

  • An Android phone or tablet on Android 10 or later (older versions work, but the always-on/kill-switch toggles are cleanest on recent releases).
  • A running WireGuard server with a reachable public endpoint - a home Raspberry Pi with a forwarded UDP port, or a small VPS. The Android app is only the client.
  • The client config for this device - a QR code on screen or a .conf file. Give each device its own key pair; reusing one config across phones breaks the handshake because two peers then share a public key.

Step 1 - Install the app

Install the official WireGuard app from the Play Store or F-Droid (open-source build). Avoid third-party "WireGuard" clones.

Play Store or F-Droid?

Both ship the same official client. The Play Store build updates automatically and is fine for most people. The F-Droid build is compiled from source by F-Droid, carries no Google dependencies, and suits a de-Googled phone - the trade-off is that updates arrive a little slower. Either is trustworthy; just avoid look-alike apps from unknown publishers, since a VPN client handles all your traffic.

Step 2 - Import your server config

In the app, tap + and choose one of:

  • Scan from QR code - fastest and least error-prone. Your server renders the client config as a QR (pivpn -qr, NetBird's app, or qrencode on a manual setup).
  • Import from file - copy the .conf to the phone and select it.
  • Create from scratch - paste keys and the [Peer] endpoint manually.

WireGuard is the client half; it needs a server endpoint. If you do not have one, a Contabo VPS at €5.50/month runs a personal WireGuard server comfortably.

Lines of source code on a dark screen
Lines of source code on a dark screen

Step 3 - Connect and verify

Toggle the tunnel on. Check the latest handshake updates (not "never") and that your public IP changes. For the protocol background, see WireGuard vs OpenVPN.

Step 4 - Enable a kill switch (always-on)

Android has this built in: Settings > Network & internet > VPN > (gear next to WireGuard) → enable Always-on VPN and Block connections without VPN. Now the phone never leaks traffic outside the tunnel if WireGuard drops - the Android equivalent of a kill switch.

Step 5 - Per-app split tunneling

Edit the tunnel → ApplicationsExclude apps (everything tunnels except those - useful for a banking app) or Include only chosen apps. Built into the client, no extra software.

Network-level routing: Allowed IPs

Per-app split tunneling (Step 5) decides which apps use the tunnel. AllowedIPs in the [Peer] config decides which destinations do - and the two combine:

  • 0.0.0.0/0, ::/0 routes all IPv4 and IPv6 through your server - the full-tunnel default you want for privacy on public Wi-Fi.
  • A narrow range like 10.0.0.0/24 sends only your home/office subnet through the tunnel, leaving the rest of your traffic on the normal connection - perfect for reaching a home NAS or Pi-hole without slowing everything down.

If you run a full tunnel but still want to print or cast at home, the cleanest route is to keep those devices on the LAN and use per-app exclusion for the casting app, since the Android client doesn't have iOS's "exclude private IPs" toggle.

Troubleshooting

  • No handshake (stays "never"): wrong Endpoint IP/port, server UDP port not open in its firewall, or a mismatched public key. Verify the server is listening and reachable.
  • Connects but no internet: lower the MTU (e.g. 1280) in the interface config - fixes many mobile-network MTU issues.
  • Drops on screen-off: disable battery optimisation for the WireGuard app (Settings → Apps → WireGuard → Battery → Unrestricted).
  • DNS leaks: set the tunnel's DNS to your server or a trusted resolver, then test with our DNS-leak guidance.
  • "Always-on" greyed out: Android only allows always-on once a tunnel imports cleanly and connects at least once - connect manually first, then set it.
  • Reconnects slowly after switching Wi-Fi↔mobile: add PersistentKeepalive = 25 to the [Peer] so the tunnel keeps the path alive across network changes and behind NAT.

For reusable client/server templates, see WireGuard config templates.

The bottom line

WireGuard on Android is a five-minute setup: install the official app, import your server config by QR, toggle on, and enable always-on + block-without-VPN for a kill switch. Add per-app split tunneling as needed, and keep the MTU trick in your back pocket for flaky mobile networks. You just need a WireGuard server to point it at - a Contabo VPS or a home Raspberry Pi does the job.

Editorial guide based on the documented behaviour of the official WireGuard Android client and Android's always-on VPN features. Security depends on your server configuration and key hygiene. Commercial links carry the rel="sponsored nofollow" attribute; an affiliate commission may apply at no extra cost to you.

★ Nuremberg GDPR datacenter · ✓ Dedicated IPv4 included · 200+ Mbps guaranteed

Self-host your VPN on your own VPS → ContaboFull root access · public IPv4 · pick your region

Frequently asked questions

How do I set up WireGuard on Android?
Install the official WireGuard app from the Play Store or F-Droid, then add a tunnel. The easiest way is to scan a QR code generated by your server (PiVPN's 'pivpn -qr', NetBird, or a manual setup with qrencode), which imports the whole config in one step. Alternatively import a .conf file. Toggle the tunnel on and you are connected. WireGuard needs a server endpoint to connect to - a Raspberry Pi or a cheap VPS - it is the client half of a self-hosted VPN.
How do I import a WireGuard config on Android?
Three ways in the app's '+' menu: (1) Scan from QR code - fastest; your server can render the client config as a QR. (2) Import from file - copy the .conf to the phone and select it. (3) Create from scratch - paste keys and the [Peer] endpoint manually. QR is by far the least error-prone. After import, check the tunnel's DNS and Endpoint fields are correct before connecting.
Does Android have a kill switch for WireGuard?
Yes, via Android's built-in 'Always-on VPN' and 'Block connections without VPN' in Settings > Network & internet > VPN > (gear icon next to WireGuard). Enable both so the device never sends traffic outside the tunnel if WireGuard drops. The WireGuard app itself also lets you set per-tunnel options. Combining always-on with block-without-VPN is the Android equivalent of a kill switch.
How do I use split tunneling in WireGuard on Android?
Open the tunnel in the WireGuard app, edit it, and under 'Applications' choose to include or exclude specific apps. 'Exclude' routes everything through the tunnel except the apps you pick (handy for a banking app that dislikes VPNs); 'include' routes only the chosen apps. This per-app split tunneling is built into the Android client and needs no extra software.
Why won't my WireGuard tunnel connect on Android (no handshake)?
The most common causes: a wrong Endpoint IP/port or the server's UDP port not open in its firewall; a mismatched public key between client and server; or a large clock skew. Check the latest-handshake field stays at 'never' - if so, verify the server is listening on the right UDP port and reachable. If it connects but pages don't load, lower the MTU (e.g. to 1280) in the interface config, which fixes many mobile-network MTU problems.