Skip to content

We're upgrading our operations to serve you better. Orders ship as usual from Laval, QC. Questions? Contact us

Bitcoin accepted at checkout  |  Ships from Laval, QC, Canada  |  Expert support since 2016

VPN_STRATUM Warning

VPN Breaks Pool Stratum Handshake

Home VPN tunnel routes ASIC stratum traffic through a remote exit node, breaking long-lived TCP handshakes via MTU shrink, tunnel-key rekeys, NAT-table eviction, latency inflation, or pool-side IP reputation blocks; miner reconnects every 2-15 minutes, pool-side accepted hashrate drops 20-80%.

Warning — Should be addressed soon

Affected Models: All miners on a home VPN — Bitaxe (Supra/Ultra/Hex/Gamma/GT/Max), NerdAxe, NerdQAxe, NerdMiner, NerdNOS, Antminer (S9/S17/S19/S21 series), Whatsminer (M30/M50/M60 series), Avalon (1166/1246/1346/1366), Innosilicon (T2T/T3+), Goldshell, Iceriver. VPN providers commonly involved: PIA, Mullvad, NordVPN, ExpressVPN, ProtonVPN, Surfshark, Windscribe, self-hosted WireGuard, self-hosted OpenVPN.

Symptoms

  • Pool dashboard shows worker `disconnected`/`offline` repeatedly while miner UI claims it's hashing
  • Miner log shows repeated `mining.subscribe` requests and `mining.authorize` retries on a 30-90 second cycle
  • Effective pool-side hashrate is 20-80% below local miner UI's reported hashrate
  • `stratum_v2` connection establishes briefly, exchanges a few messages, then drops with `connection reset by peer` or `EOF`
  • VPN client is installed at the router level (ASUS Merlin, GL.iNet, OPNsense, pfSense, Mikrotik) AND ASICs are on the same network
  • Disabling the VPN tunnel restores stable mining within minutes; re-enabling it brings the symptom back deterministically
  • WireGuard `latest-handshake` is older than 180 seconds when running `wg show`
  • OpenVPN log shows `TLS Error: TLS key negotiation failed` or `Connection reset, restarting [0]`
  • `traceroute pool.example:3333` shows local router → VPN endpoint → public internet (extra hop = extra latency)
  • Pool latency `>250 ms` via `tcping` / `mtr` even though bare-internet latency to same pool is `<60 ms`
  • Stratum reconnect loops cluster at VPN provider tunnel-rekey intervals (some providers rekey every 30-60 minutes)
  • Bitaxe / NerdAxe AxeOS log shows `WS connection lost` or `pool socket EOF` synchronized with VPN tunnel resets

Step-by-Step Fix

1

Open your VPN client's settings and find the split-tunnel toggle. Exclude the miners' subnet (typically `192.168.1.0/24`, `192.168.0.0/24`, or `10.0.0.0/24`). Mullvad: Settings → Split Tunneling → Add IP Range. ProtonVPN: Settings → Split Tunneling → Custom Bypass. NordVPN desktop: Settings → Split Tunneling (app-level only — limited). Restart the VPN client. Verify with `curl ifconfig.me` from a miner-subnet device — should return your real ISP public IP, not the VPN exit IP.

2

Or take the VPN off your router entirely. Reset router config to factory or remove the VPN client / WireGuard config. Install the VPN per-device on the laptops, phones, tablets that actually need privacy. Miners go back to bare-LAN-to-internet routing. This works on every VPN provider, regardless of how garbage their split-tunnel implementation is.

3

Switch to a VPN that handles split-tunneling correctly. Mullvad and ProtonVPN are the gold standards (proper subnet exclusion). Windscribe's R.O.B.E.R.T. firewall-rule system also works. Avoid PIA, NordVPN, Surfshark, and ExpressVPN for router-level installs that need to coexist with mining traffic — their split-tunnel implementations are app-based on desktop only and unavailable on router firmware.

4

Restart every miner after changing VPN configuration. Stratum sockets are stateful — a miner that established its connection through the old broken path keeps trying to use that route until forced to renegotiate. Power-cycle (not soft reboot) or use the miner UI's `Restart cgminer` / `Restart bmminer` button. Bitaxe / NerdAxe: AxeOS UI → System → Restart.

5

Watch pool dashboard for 60 minutes minimum. Three numbers tell you if the fix took: accepted-share rate matching miner-UI hashrate within ±2%, worker uptime greater than 50 minutes, stale-share rate below 1%. If the worker disconnects more than once in 60 minutes, the fix didn't take — proceed to Tier 2.

6

On OpenWrt / ASUS Merlin / GL.iNet routers, configure policy-based routing. Create a routing rule: traffic from the miner subnet, regardless of destination, uses the WAN gateway (not the VPN gateway). On OpenWrt: Network → Routing → Static IPv4 Routes plus a custom mark in `firewall.user`. Search `[your router model] policy based routing exclude subnet` for brand-specific tutorials.

7

On OPNsense or pfSense, use gateway-based outbound NAT exclusion. Gateways → Single, then Firewall → Rules → LAN → Add with source = miner subnet, destination = any, gateway = WAN_GW (not VPN_GW). Save, apply changes, verify with `traceroute pool.example` from the miner subnet — first hop should be your router's WAN, not the VPN gateway.

8

WireGuard self-host: pin `AllowedIPs` to the destinations that actually need the tunnel. Default `AllowedIPs = 0.0.0.0/0` routes everything through WireGuard. Replace with explicit subnets — e.g. `AllowedIPs = 10.10.10.0/24, 192.168.50.0/24` (your remote networks). Mining subnet stays out. Now mining traffic goes direct, everything else still tunnels.

9

OpenVPN self-host: use `route-nopull` plus selective `route` directives. Add `route-nopull` to client config to ignore server-pushed routes, then add `route 10.10.10.0 255.255.255.0 vpn_gateway` for each subnet you actually want tunneled. Mining subnet stays on the WAN gateway by default. Restart OpenVPN client and verify routing table on miner-side device.

10

Verify the firewall isn't redirecting back into the tunnel. Some default firewall configs `MASQUERADE` all outbound traffic into the tunnel interface. Run `iptables -t nat -L -nv` on the router; any rule sending miner-subnet traffic to `tun0` or `wg0` defeats the routing changes. Remove those rules. On OPNsense/pfSense: Firewall → NAT → Outbound — set to Manual and remove the VPN entry for miner subnet.

11

Pin static routes for pool stratum endpoints on the miner itself. If firmware allows: `ip route add stratum.slushpool.com via 192.168.1.1 dev eth0` where `192.168.1.1` is your router's WAN-gateway IP. Surgical fix — even if the rest of the network tunnels, this connection escapes. Works on Bitaxe (AxeOS shell), Antminer (rooted SSH), Whatsminer (BTminer rooted SSH). Persists until reboot unless saved in startup script.

12

Set up a dedicated mining VLAN. Create VLAN 20 = `192.168.20.0/24` for miners on a managed switch + VLAN-capable router. Configure VLAN 20 to use a routing table without the VPN as default gateway. All miners get tagged onto VLAN 20. Bonus: mining traffic is now isolated from the rest of your home network for security as well as routing.

13

Implement DNS split-horizon for pool hostnames. Run a local DNS resolver (Pi-hole, AdGuard Home, dnsmasq, Unbound) and force pool hostnames to resolve through your ISP's resolver, not the VPN's. Prevents DNS leak issues that show up as `mining.subscribe` failing on a hostname that resolves correctly outside the tunnel and incorrectly inside it.

14

Tune TCP keepalive on the miner if firmware exposes the kernel sysctls: `echo 60 > /proc/sys/net/ipv4/tcp_keepalive_time`, `echo 30 > /proc/sys/net/ipv4/tcp_keepalive_intvl`, `echo 5 > /proc/sys/net/ipv4/tcp_keepalive_probes`. Persists only until reboot unless patched into firmware init scripts. Keeps stratum socket warm enough to survive NAT eviction on the VPN exit-node gateway.

15

Move the miners to a separate ISP connection — second cable modem, Starlink, LTE failover, any second uplink that bypasses the VPN entirely. Mining lives there; your privacy stack lives on the primary uplink. Cost is a second internet bill, but for a serious home-mining operation the redundancy alone justifies it. Configure failover so a primary-uplink outage doesn't kill mining either.

16

Stop solo-debugging. You've completed split-tunnel, A/B tested, added static routes, and the pool still shows reconnect storms. You're now chasing one of: (a) ISP-level CGNAT interaction with the pool, (b) a pool reputation block on your residential IP, or (c) a deeper firmware bug in the miner's stratum implementation. None of those are VPN problems anymore — you've solved the VPN problem and uncovered something else. Open a D-Central support ticket.

17

What D-Central does on a remote support session: tail miner stratum log live, packet-capture from LAN side, traceroute miner→pool with VPN on/off, validate routing tables, validate firewall rules, validate firmware version, recommend either a firmware change (DCENT_OS on Antminer, AxeOS update on Bitaxe, BTminer rebuild on Whatsminer) or an ISP-level escalation. Typical ticket closure: one business day.

18

Document for the support ticket. Provide: VPN provider + version + install location (router/desktop/per-app), miner model + firmware version, pool URL + port + protocol (stratum / stratum+tcp / stratum+ssl / stratum_v2), `mtr` output with VPN on AND off, miner log excerpt covering one reconnect cycle, and `curl ifconfig.me` output from the miner subnet (proving the split-tunnel did or didn't take effect). With those six things D-Central can usually root-cause within one back-and-forth.

When to Seek Professional Repair

If the steps above do not resolve the issue, or if you are not comfortable performing these repairs yourself, professional service is recommended. Attempting advanced repairs without proper equipment can cause further damage.

Related Error Codes

Still Having Issues?

Our team of Bitcoin Mining Hackers has been repairing ASIC miners since 2016. We have seen it all and fixed it all. Get a professional diagnosis.