Privacy Tools Guide

A VPN kill switch is one of the most misunderstood security features in the privacy toolkit. Marketing teams have diluted the term to the point where many users believe any VPN with a “kill switch” checkbox is protected. The reality is more nuanced. Understanding how kill switches work technically—and which providers implement them properly—can mean the difference between genuine protection and a false sense of security.

What a Kill Switch Actually Does

At its core, a kill switch prevents your real IP address from leaking when the VPN tunnel unexpectedly disconnects. Without a kill switch, your device automatically falls back to your regular internet connection, exposing your actual IP address, location, and potentially sensitive data. This sounds simple, but the implementation details matter significantly.

When your VPN connection drops, your operating system’s default behavior is to continue routing traffic through the default gateway provided by your ISP. The kill switch intercepts this by either:

  1. Blocking all network traffic at the firewall level until the VPN reconnects
  2. Terminating specific applications that should only operate through the VPN tunnel

The key technical difference lies in how this interception happens and whether it covers all traffic or just designated apps.

Technical Implementation Types

Firewall-Based Kill Switch

The most implementation modifies system firewall rules to block all non-VPN traffic. On Linux, this typically involves iptables rules that drop all outgoing packets except those routed through the VPN interface:

# Allow only VPN tunnel traffic
iptables -A OUTPUT -o tun0 -j ACCEPT
iptables -A OUTPUT -o wg0 -j ACCEPT

# Drop everything else when VPN is down
iptables -A OUTPUT -j DROP

This approach works at the kernel level, making it difficult to bypass accidentally. However, it requires root access and careful rule management to avoid locking yourself out of legitimate network access.

Application-Level Kill Switch

Some VPNs offer kill switches at the application level. Instead of blocking all network traffic, these kill switches terminate specific processes when the VPN disconnects. This approach is less invasive but provides weaker protection—you might forget to add an application to the kill switch list.

For developers, implementing an application-level kill switch requires monitoring the VPN status and sending signals to terminate processes:

import psutil
import subprocess
import threading

def monitor_vpn_status(vpn_interface='tun0'):
    """Monitor VPN tunnel status and kill apps if tunnel drops"""
    while True:
        try:
            # Check if VPN interface exists and has traffic
            result = subprocess.run(
                ['ip', 'addr', 'show', vpn_interface],
                capture_output=True
            )
            if result.returncode != 0:
                # VPN is down - terminate sensitive apps
                terminate_sensitive_apps()
        except Exception:
            pass
        time.sleep(1)

def terminate_sensitive_apps():
    apps_to_kill = ['chrome', 'firefox', 'slack']
    for proc in psutil.process_iter(['name']):
        try:
            if any(app in proc.info['name'].lower() for app in apps_to_kill):
                proc.kill()
        except (psutil.NoSuchProcess, psutil.AccessDenied):
            pass

Network-Namespace Isolation

Advanced users can isolate VPN traffic using Linux network namespaces. This creates a completely separate network stack where all traffic must pass through the VPN:

# Create isolated namespace
ip netns add vpn_isolated

# Create virtual interface pair
ip link add veth0 type veth peer name veth1

# Move one end to the namespace
ip link set veth1 netns vpn_isolated

# Configure routing in namespace to force VPN
ip netns exec vpn_isolated ip addr add 10.0.0.2/24 dev veth1
ip netns exec vpn_isolated ip link set veth1 up
ip netns exec vpn_isolated ip link set lo up

# Run applications in namespace
ip netns exec vpn_isolated firefox

This approach provides the strongest isolation but requires significant technical expertise to implement correctly.

The Problem with Marketing Claims

Here’s where things get problematic. Many VPN providers market kill switch functionality without implementing it properly. Common failures include:

Which VPNs Have Genuine Kill Switches

Based on technical analysis and independent testing, several providers implement kill switches that actually work:

Mullvad

Mullvad uses a firewall-based approach on desktop applications. Their Linux client creates persistent iptables rules that persist even if the application crashes. Independent audits have verified their kill switch functionality works as advertised.

IVPN

IVPN offers both a standard firewall kill switch and a “persistent” mode that keeps the kill switch active even when the VPN is disconnected. This prevents accidental exposure during manual connection management.

Proton VPN

Proton VPN implements kill switches at the system level for all paid plans. Their implementation includes DNS leak protection and handles the transition gracefully during network switches.

WireGuard-Based Solutions

Any VPN using WireGuard can use the protocol’s built-in features for kill switch functionality. Providers like AzireVPN and cryptostorm implement WireGuard-native kill switches that work at the tunnel level rather than relying on application-level logic.

Testing Your Kill Switch

Regardless of which provider you choose, you should verify your kill switch works before trusting it. The testing methodology involves:

  1. Connect to your VPN and verify your IP is masked
  2. Start a continuous ping or data transfer
  3. Force-kill the VPN process or disconnect the network
  4. Observe whether traffic continues or stops immediately

A properly functioning kill switch will immediately block all non-VPN traffic. Any continued connectivity indicates a failed implementation.

# Simple test - start continuous ping
ping -i 0.2 8.8.8.8

# In another terminal, kill your VPN process
pkill -f "openvpn|wireguard|mullvad"

# Watch for immediate stop or continued pings

Building Your Own Kill Switch

For maximum control, developers can implement custom kill switches using existing tools. The simplest approach uses a shell script with OpenVPN or WireGuard:

#!/bin/bash
# Custom kill switch script

VPN_IF="tun0"
REAL_IF="eth0"

# Clear existing rules
iptables -F
iptables -X

# Default drop policy
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# Allow loopback
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

# Allow established connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow only VPN tunnel
iptables -A OUTPUT -o "$VPN_IF" -j ACCEPT
iptables -A INPUT -i "$VPN_IF" -j ACCEPT

echo "Kill switch enabled - all traffic blocked except VPN"

Run this before connecting to your VPN, and it will block all traffic if the VPN tunnel disappears.

Built by theluckystrike — More at zovo.one