Hello all. I had trouble using KESL in my fedora machine while I was using also a VPN. I tried a lot, but with no luck. Then I run Claude code with fable and thank God, the solution found. After I was ok, I told claude to write a small article in order to post it here for possible any other having the same issue and maybe kaspersky itself to fix this. Here it goes
## Environment
- **OS:** Fedora Linux 43 Workstation, kernel 7.0.12
- **Product:** Kaspersky Endpoint Security for Linux (KESL) 12.4.0.1225
- **VPNs tested:** Mullvad 2026.3 (native app, WireGuard) and ProtonVPN 4.16.5 (flatpak, WireGuard via NetworkManager)
- Other security software present: firewalld, OpenSnitch (default allow), Wazuh agent — all ruled out during diagnosis.
## Symptoms
1. VPN app reports **Connected**, but there is no working internet: HTTPS connections fail immediately with `Connection reset by peer (os error 104)` (visible in the Mullvad daemon log for every API request).
2. Intermittently worse: with the tunnel up and the VPN's kill-switch firewall active, **HTTPS traffic leaked outside the tunnel** — `https://am.i.mullvad.net/connected` returned my real ISP IP address while Mullvad showed "Connected".
3. KVM/libvirt guest VMs kept working while the host had no internet (guest traffic is NAT-forwarded, so it bypasses KESL's per-process interception — a useful diagnostic hint).
## Root cause found
KESL's Web Threat Protection / Network Threat Protection / Mail Monitoring tasks install a transparent interception proxy:
- iptables-nft chains (`kesl_output` in `table ip mangle`) mark outbound TCP to ports 21, 25, 80, 110, 143, 443, 465, 587, 993, 995, 1080, 3128, 8080, etc. with fwmark `0x100`/`0x200`
- policy routing rules `fwmark 0x100/0x500 lookup 101` and `fwmark 0x200/0x600 lookup 101`, where table 101 is `local default dev lo`, divert the marked packets to a local proxy listening on `127.0.0.1:9789` and `127.0.0.1:9879`
- the proxy then **re-originates** the connections itself, plus two nfqueue hooks (queues 4/5) for inspection
When a VPN with a kill-switch firewall (Mullvad, ProtonVPN) is connected, the proxy's re-originated connections conflict with the VPN's nftables policy and mark-based WireGuard routing. Result: either every intercepted connection is reset (no internet), or the re-originated connection escapes via the physical interface — i.e. a **privacy leak: real IP exposed while the VPN reports Connected**.
## Verification
- KESL running, Mullvad connected → HTTPS resets + real-IP leak, DNS answered via WiFi instead of the tunnel, ping latency showed traffic going direct instead of through the VPN exit.
- `systemctl stop kesl`, Mullvad connected → everything perfect (correct exit IP, DNS via tunnel, tunnel-consistent latency).
- KESL running again but with tasks 14 (Web_Threat_Protection), 17 (Network_Threat_Protection) and 35 (Mail_Monitoring) stopped → everything perfect. Note: stopping tasks 14/17 alone at runtime was **not enough** — the interception hooks only disappeared after also stopping Mail_Monitoring and restarting the kesl service.
## Current workaround
`kesl-control --stop-task 14 && kesl-control --stop-task 17 && kesl-control --stop-task 35`, then `systemctl restart kesl`. File Threat Protection, Behavior Detection and Device Control keep working; only network traffic interception is off. The stopped state persists across restarts.
## Questions for Kaspersky
1. Is there a supported way to make KESL's traffic interception coexist with WireGuard VPNs / kill-switch firewalls (e.g. exclude a tunnel interface such as `wg0-mullvad`, or make the proxy honor the VPN's routing)?
2. The silent traffic leak outside an active VPN tunnel seems like a security issue in itself — is this a known problem, and is a fix planned?
3. Why do the interception firewall rules remain active after stopping the Web/Network Threat Protection tasks, until Mail Monitoring is also stopped and the service restarted?
Featured Replies
Please sign in to comment
You will be able to leave a comment after signing in
Hello all. I had trouble using KESL in my fedora machine while I was using also a VPN. I tried a lot, but with no luck. Then I run Claude code with fable and thank God, the solution found. After I was ok, I told claude to write a small article in order to post it here for possible any other having the same issue and maybe kaspersky itself to fix this. Here it goes
## Environment
- **OS:** Fedora Linux 43 Workstation, kernel 7.0.12
- **Product:** Kaspersky Endpoint Security for Linux (KESL) 12.4.0.1225
- **VPNs tested:** Mullvad 2026.3 (native app, WireGuard) and ProtonVPN 4.16.5 (flatpak, WireGuard via NetworkManager)
- Other security software present: firewalld, OpenSnitch (default allow), Wazuh agent — all ruled out during diagnosis.
## Symptoms
1. VPN app reports **Connected**, but there is no working internet: HTTPS connections fail immediately with `Connection reset by peer (os error 104)` (visible in the Mullvad daemon log for every API request).
2. Intermittently worse: with the tunnel up and the VPN's kill-switch firewall active, **HTTPS traffic leaked outside the tunnel** — `https://am.i.mullvad.net/connected` returned my real ISP IP address while Mullvad showed "Connected".
3. KVM/libvirt guest VMs kept working while the host had no internet (guest traffic is NAT-forwarded, so it bypasses KESL's per-process interception — a useful diagnostic hint).
## Root cause found
KESL's Web Threat Protection / Network Threat Protection / Mail Monitoring tasks install a transparent interception proxy:
- iptables-nft chains (`kesl_output` in `table ip mangle`) mark outbound TCP to ports 21, 25, 80, 110, 143, 443, 465, 587, 993, 995, 1080, 3128, 8080, etc. with fwmark `0x100`/`0x200`
- policy routing rules `fwmark 0x100/0x500 lookup 101` and `fwmark 0x200/0x600 lookup 101`, where table 101 is `local default dev lo`, divert the marked packets to a local proxy listening on `127.0.0.1:9789` and `127.0.0.1:9879`
- the proxy then **re-originates** the connections itself, plus two nfqueue hooks (queues 4/5) for inspection
When a VPN with a kill-switch firewall (Mullvad, ProtonVPN) is connected, the proxy's re-originated connections conflict with the VPN's nftables policy and mark-based WireGuard routing. Result: either every intercepted connection is reset (no internet), or the re-originated connection escapes via the physical interface — i.e. a **privacy leak: real IP exposed while the VPN reports Connected**.
## Verification
- KESL running, Mullvad connected → HTTPS resets + real-IP leak, DNS answered via WiFi instead of the tunnel, ping latency showed traffic going direct instead of through the VPN exit.
- `systemctl stop kesl`, Mullvad connected → everything perfect (correct exit IP, DNS via tunnel, tunnel-consistent latency).
- KESL running again but with tasks 14 (Web_Threat_Protection), 17 (Network_Threat_Protection) and 35 (Mail_Monitoring) stopped → everything perfect. Note: stopping tasks 14/17 alone at runtime was **not enough** — the interception hooks only disappeared after also stopping Mail_Monitoring and restarting the kesl service.
## Current workaround
`kesl-control --stop-task 14 && kesl-control --stop-task 17 && kesl-control --stop-task 35`, then `systemctl restart kesl`. File Threat Protection, Behavior Detection and Device Control keep working; only network traffic interception is off. The stopped state persists across restarts.
## Questions for Kaspersky
1. Is there a supported way to make KESL's traffic interception coexist with WireGuard VPNs / kill-switch firewalls (e.g. exclude a tunnel interface such as `wg0-mullvad`, or make the proxy honor the VPN's routing)?
2. The silent traffic leak outside an active VPN tunnel seems like a security issue in itself — is this a known problem, and is a fix planned?
3. Why do the interception firewall rules remain active after stopping the Web/Network Threat Protection tasks, until Mail Monitoring is also stopped and the service restarted?