Re: PSA: Simple Wi-Fi gateway killswitch that works with OpenVPN config files

Maria Sophia <[email protected]> Fri, 17 Jul 2026 01:05:47 -0400
Newsgroups alt.comp.os.windows-10,alt.comp.os.windows-11,alt.comp.microsoft.windows
Organization BWH Usenet Archive (https://usenet.blueworldhosting.com)
Message-ID <[email protected]>
Below is a well-documented version of the network killswitch which we've
been using for years on the alt.comp.os.windows-10 newsgroup since 2021.

The exquisitely elegant beauty of this killswitch is that it documents
at least a half-dozen intricacies of Windows networking proclivities.

  :: nettoggle.bat
  ::
  :: This nettoggle killswitch toggles the Wi-Fi default gateway on and off. 
  :: If the gateway is on, it turns it off. If it's off, it turns it back on.
  ::
  :: This provides a simple ON/OFF toggle for the network on any given PC.
  ::  a. The toggle checks if the default route exists in the routing table.
  ::  b. If the default route exists, the toggle deletes it.
  ::  c. If the default route does not exist, the toggle adds it.
  :: While this toggle works with a direct Internet connection (e.g., when
  :: installing installing software which might perhaps phone home), the main
  :: use is to protect the user when a VPN is being used which suddenly drops.
  ::
  :: It is called by a Windows scheduled task (elevate permissions with no UAC).
  :: That scheduled task is the target of a pinned taskbar nettoggle shortcut.
  ::
  :: The design of this toggle required a sequence of a half-dozen changes.
  ::
  :: 1. Remove DHCP and gateway in the in the Wi-Fi network adapter setup:
  ::    Instead, set a static IP with no gateway in the network adapter setup.
  ::    Windows will auto-repair the default route if DHCP is enabled or
  ::    if the interface has a gateway configured. Modern Wi-Fi cards are
  ::    "smart" and will silently restore the gateway when it disappears.
  ::    To prevent this, the Wi-Fi interface must use a static IP and the
  ::    gateway must be set to "none". This stops Windows from repairing
  ::    the route after deletion.
  :: C:\> netsh interface ipv4 set address name="Wi-Fi 2" static 192.168.1.20 255.255.255.0 none
  ::
  :: 2. Favor VPN with a high metric for the routing table Wi-Fi interface:
  ::    Windows uses auto-metric logic to prefer certain interfaces.
  ::    If the Wi-Fi metric is low, Windows may inject routes or prefer the
  ::    Wi-Fi path over the VPN. Setting the Wi-Fi metric to a high value 
  ::    (e.g., to 9999) ensures that VPN routes always win. This keeps the
  ::    killswitch stable and prevents unwanted route injection.
  :: C:\> netsh interface ipv4 set interface "Wi-Fi 2" metric=9999 
  ::
  :: 3. Tell the local VPN session to ignore pull-filter "redirect-gateway":
  ::    This directive does NOT modify the VPN server. The server still
  ::    pushes redirect-gateway normally. Only the local OpenVPN client
  ::    session is affected, and only for this connection.
  ::    Modern Wi-Fi cards report a valid ROUTE_GATEWAY to OpenVPN. When
  ::    the server pushes redirect-gateway, the client will normally re-add
  ::    the Wi-Fi default route. This breaks the killswitch.
  ::    Adding the pull-filter directive to the openvpn.conf file tells the
  ::    OpenVPN client: "If the server pushes redirect-gateway, ignore it."
  ::    This prevents the client from adding the Wi-Fi default route back.
  ::    The server is unchanged. The tunnel is unchanged. Only the client
  ::    behavior is modified so the killswitch remains stable.
  :: C:\> type pull-filter ignore "redirect-gateway" >> openvpn.conf
  ::
  :: 4. Create a scheduled task for elevated permissions and to eliminate UAC:
  ::    Win+R > taskschd.msc 
  ::     Name: task nettoggle
  ::     Action: Start a program
  ::     Program/script: %comspec%
  ::     Add arguments: /c start "" c:\data\sys\batch\nettoggle.bat
  :: [x] Run with highest privileges
  ::
  :: 5. Add a taskbar shortcut to run the program with elevated permissions:
  ::    Elevate privileges and eliminate UAC by invoking a scheduled task.
  ::    Route changes require admin rights. Running this batch file from a
  ::    normal CMD window will not modify the routing table. The taskbar
  ::    icon does not run the batch file directly. Instead, it triggers a
  ::    scheduled task configured to run with highest privileges and with
  ::    no UAC prompt. This is why the taskbar shortcut link is required.
  :: Link target C:\Windows\System32\schtasks.exe /run /TN "task nettoggle"
  ::
  :: 6. Use route print instead of WMIC to detect the gateway reliably:
  ::    Earlier versions used WMIC to read the DefaultIPGateway value.
  ::    WMIC reports whatever Windows believes the gateway should be,
  ::    based on interface configuration, DHCP state and NIC metadata.
  ::    This became problematic once modern Wi-Fi hardware was installed.
  ::    Newer Wi-Fi cards support NCSI, auto-metric, DHCP renewal and
  ::    route auto-repair. Because of this, WMIC may report a gateway
  ::    even when the routing table does not contain one.
  ::    The routing table is the actual source of truth. It reflects the
  ::    real routes that OpenVPN adds or removes, and the real routes that
  ::    Windows or other software (such as the Aloha Browser) may inject.
  ::    Using route print ensures the script sees the real default route
  ::    state, not the intended or configured gateway reported by WMIC.
  :: C:\> set defgw=192.168.1.1
  :: C:\> route print | find "0.0.0.0" | find "%defgw%" >nul
  :: --------------------------------------------------------------------
  :: Version history (documented on alt.comp.os.windows-10 over the years)
  :: --------------------------------------------------------------------
  :: v1p4 20260716 Static IP, no gateway, pull-filter, routing-table check
  ::   This version replaces WMIC with routing-table detection, which is
  ::   reliable on modern Windows. The Wi-Fi interface is configured with a
  ::   static IP and no gateway so Windows cannot auto-repair the route.
  ::   The interface metric remains high (9999) to ensure VPN routes win.
  ::   The OpenVPN config uses:
  ::       pull-filter ignore "redirect-gateway"
  ::   so the VPN cannot re-add the Wi-Fi default route. The scheduled task
  ::   remains required because route changes need elevated privileges.
  ::   This version restores the original killswitch behavior on modern
  ::   hardware and modern Windows.
  ::
  :: v1p3 20260715 Metric control and routing-table detection
  ::   This version attempted to stabilize the killswitch by forcing the
  ::   Wi-Fi interface metric to a very high value (9999). This prevented
  ::   Windows from preferring Wi-Fi routes over VPN routes. However, WMIC
  ::   was still used to detect the gateway, and Windows continued to auto-
  ::   repair the default route. OpenVPN also continued to re-add the route
  ::   when redirect-gateway was pushed. The script needed a more reliable
  ::   detection method and a way to stop OpenVPN from restoring the route.
  ::
  :: v1p2 20260714 Drat. Windows hardware change broke the old killswitch!
  ::   The USB Wi-Fi dongle was removed and replaced with a modern internal
  ::   Wi-Fi card. This card behaves like a full Windows network interface.
  ::   It supports NCSI, auto-metric, DHCP renewal, and route auto-repair.
  ::   After this upgrade, Windows began restoring the default route as
  ::   soon as the script deleted it. OpenVPN also began re-adding the
  ::   gateway because the new card reports a valid ROUTE_GATEWAY value.
  ::   WMIC became unreliable because multiple interfaces existed and the
  ::   new hardware changed how Windows exposes gateway information. The
  ::   killswitch failed because both Windows and OpenVPN were "helpful".
  ::
  :: v1p1 20210207 Zaidy036 version from alt.comp.os.windows-10
  ::   This version was functionally identical to v1p0. The main change was
  ::   packaging the script to run through a scheduled task so that route
  ::   changes could occur without a UAC prompt. The logic still used WMIC
  ::   to detect the gateway, which worked fine with USB Wi-Fi hardware.
  ::   The dongle only had one gateway entry, so WMIC always returned the
  ::   correct value. The killswitch continued to work as intended.
  ::
  :: v1p0 20190516 Modified LiquidVPN kill switch downloaded off the net
  ::   This was the first version of the gateway toggle. It relied on the
  ::   behavior of old USB Wi-Fi dongles, which were very simple devices.
  ::   These dongles did not support NCSI, auto-metric, DHCP renewal, or
  ::   gateway injection. Because of this, deleting the default route was
  ::   permanent. Windows never tried to repair the route, and OpenVPN
  ::   could not re-add it because the dongle did not report a gateway.
  ::   The killswitch worked reliably because the hardware was "dumb".
  :: --------------------------------------------------------------------
  @echo off
  setlocal
  
  :: Set to your router IP address
  set defgw=192.168.1.1
  
  :: Check if default route exists
  route print | find "0.0.0.0" | find "%defgw%" >nul
  
  if not errorlevel 1 (
      :: Route to the gateway exists, remove it
      route delete 0.0.0.0 %defgw%
  ) else (
      :: Route to the gateway is missing, add it
      route add 0.0.0.0 mask 0.0.0.0 %defgw%
  )
  
  endlocal
  exit
  
  :: end of nettoggle.bat
-- 
Let's see if, together, we can raise the intellectual level of this ng.