Overview
Split tunneling allows you to exclude specific applications from the VPN tunnel. Excluded apps communicate with the internet as if Mullvad VPN were disconnected or not running, while all other apps remain protected by the VPN. This is useful for:- Local network services: Printers, file shares, media servers
- Banking apps: Some require your real IP address
- Performance-critical apps: Gaming, video calls that benefit from direct routing
- Testing: Comparing behavior inside vs. outside the tunnel
Split tunneling is available on Windows, Linux, macOS, and Android. It is not available on iOS due to platform limitations.
How Split Tunneling Works
Normal VPN Connection (No Split Tunneling)
With Split Tunneling Enabled
Key Concepts
- Excluded app: Traffic goes outside the VPN tunnel (uses your real IP)
- Included app: Traffic goes inside the VPN tunnel (default for all apps)
- Split tunneling state: Feature can be enabled/disabled globally
Platform Implementations
Split tunneling works differently on each platform:- Windows
- macOS
- Linux
- Android
Path-Based Exclusion
- Exclude apps by executable path
- Uses split tunnel driver (
mullvad-split-tunnel.sys) - Excludes app and all child processes
Enabling Split Tunneling
Windows & macOS
Using the GUI
Add Applications
- Click Add application
- Browse to the application’s executable or bundle
- Select the app to exclude
Using the CLI (Windows)
Using the CLI (macOS)
Linux
Using the mullvad-exclude Helper
Using the CLI Directly
On Linux, use
mullvad-exclude launcher for simplicity. It handles PID management automatically.Android
Using the App
Enable and Select Apps
- Toggle Split tunneling On
- Tap Apps to see installed applications
- Select apps to exclude from VPN
DNS Behavior
DNS handling with split tunneling is complex:Desktop (Windows, Linux, macOS)
| DNS Setting | Normal Apps | Excluded Apps |
|---|---|---|
| Default DNS (relay) | In tunnel | In tunnel* |
| Public custom DNS (e.g., 8.8.8.8) | In tunnel | In tunnel* |
| Private custom DNS (e.g., 10.0.1.1) | LAN | LAN |
Android
| DNS Setting | Normal Apps | Excluded Apps |
|---|---|---|
| Default DNS | In tunnel (relay) | Outside tunnel (system DNS) |
| Public custom DNS | In tunnel | Outside tunnel (system DNS) |
| Private custom DNS | LAN (with local network sharing) | Outside tunnel (system DNS) |
Process Inheritance
Parent-Child Relationships
Excluded status is inherited by child processes:- Subprocesses automatically excluded
- Browser tabs, helper processes included
- Launched applications may inherit status
Process Tracking (Windows)
On Windows, you can see excluded processes:- No marker: Directly excluded (executable path matches)
- subprocess: Inherited exclusion from parent
Limitations and Known Issues
General Limitations
macOS Specific
- WebKit browsers: Safari, WebKit-based apps cannot be excluded
- Full Disk Access required: Must grant permission in System Preferences
- IPC limitations: Apps using multiple processes may not work correctly
Linux Specific
- PID-based: Must manage process IDs manually
- No persistent list: Excluded PIDs lost on reboot
- Process lifetime: Exclusion removed when process exits
Android Specific
- System apps: Some system apps cannot be excluded
- Split VPN: OS may show “Split VPN” warning
Firewall Behavior
During connection transitions (connecting, error states), excluded apps:- Desktop: May have connectivity issues (firewall blocks non-tunnel traffic)
- Android: Should maintain connectivity (VPN Service API)
Security Considerations
What Split Tunneling Exposes
Use Cases to Avoid
❌ Do NOT exclude:- Privacy-critical applications
- Browsers for anonymous browsing
- Torrent clients (use VPN for safety)
- Apps accessing sensitive data
Safe Use Cases
✅ Safe to exclude:- Local network applications (printer, NAS)
- Banking apps requiring real IP
- Gaming clients for better latency
- Video conferencing for better quality
- Speed test tools
Compatibility
Split tunneling works with:- ✅ WireGuard protocol
- ✅ Quantum-resistant tunnels
- ✅ Multihop
- ✅ DAITA
- ✅ Obfuscation protocols
- ✅ Custom DNS
- ✅ Content blockers
- ✅ Local network access
Troubleshooting
App Still Using VPN
If excluded app appears to use VPN:-
Verify exclusion (Windows/macOS):
-
Check process list:
- Restart application: Close and reopen excluded app
- Check correct path: Ensure exact executable path is excluded
App Not Working When Excluded
If excluded app has connectivity issues:- Check if tunnel is connected: Ensure VPN is active
- Firewall blocking: During connection transitions, firewall may block
- Try including again: Remove from exclusion list
- Check DNS: App may require specific DNS configuration
Linux: mullvad-exclude Not Working
macOS: Permission Denied
If you get permission errors:-
Grant Full Disk Access:
- Open System Preferences → Security & Privacy
- Click Privacy tab
- Select Full Disk Access
- Add Mullvad VPN app
- Restart Mullvad VPN
- Try excluding app again
Windows: Driver Issues
Performance Impact
Split tunneling has minimal performance impact:- Excluded apps: Direct routing (no VPN overhead)
- Normal apps: Standard VPN performance
- System overhead: Negligible (path/PID filtering)
Best Practices
Application Selection
- Only exclude when necessary: Minimize excluded apps for privacy
- Document exclusions: Keep note of why each app is excluded
- Review regularly: Remove apps no longer needed
- Test functionality: Verify apps work as expected
Security Hygiene
- High Privacy
- Balanced
- Convenience
Minimize exclusions:
Testing
Verify split tunneling works correctly:Related Features
- Local Network Access - Allow LAN without split tunneling
- Custom DNS - DNS behavior with split tunneling
- Kill Switch - Firewall behavior during transitions
- WireGuard Protocol - Base VPN protocol
Technical Details
Implementation
Windows: Windows Filtering Platform (WFP) driver- Driver file:
mullvad-split-tunnel.sys - Service:
mullvad-split-tunnel - Path-based filtering at kernel level
- Process-based rules
- Requires Full Disk Access for process inspection
- PID tracking in user space
- Cgroup path:
/sys/fs/cgroup/mullvad-exclusions - PID-based exclusion
- Fallback to v1 net_cls on older systems
disallowApp()method- Per-package exclusion
- Native Android support