mirror of
https://github.com/amnezia-vpn/amnezia-client.git
synced 2026-10-13 21:33:09 +00:00
[GH-ISSUE #3090] Linux 5.0.1.5: exclusion routes never installed — netlink route dump overflows the fixed 8 KiB buffer #1431
Open
opened 2026-10-13 20:42:20 +00:00 by bsakaguchi
·
8 comments
No Branch/Tag specified
dev
feat/api-tests
feat/gateway-service-import-test
fix/serialize-log-record-writes-and-pin-log-date-format-locale
fix/libagw-review-fixes
feat/otp-login
fix/ios-xray-ipv6-leak
fix/macos-xray-ipv6-leak
feat/add-support-include-split-tunnel
fix/win-xray-app-split-tunneling
fix/bug-when-saving-after-canceling
fix/xray-reconnect-crash
fix/share-empty-config-on-ssh-timeout
fix/ssh-credentials-input
fix/updater-verify-signature
fix/async-ssh-threading
fix/xray-check-inet-and-liveness-monitor
fix/selfhosted-server-installations
feat/add-support-ikev2-macos
fix/icons-different-color-themes
feat/add_support_arm_windows
feat/add-deep-link
feat/fixed-push-notifications-on-VPN-connect-disconnect-2
feat/implement-QR-code-generation-and-scanning
feat/file-password-protection
feature/add-local-proxy
feat/add-support-split-tunnel-macos
feat/tests
fix/android-register-unacknowledged-purchase
fix/share_on_linux
mirroring-to-outside
feat_copy_docker_configs
feat/self-diagnostics-log
feat/amnezia-free-vless-switch
fix/conan_build_android_on_win
fix/linux-reconnect-dns-reliability
fix/windows-connection-stability
fix/linux-reconnect-refactoring
fix/ios-groupidentifier-order
feat/xray-subscription-link
fix/minor-fixes
fix/xray-config-inplace-edit
feat/amnezia-sdk-typed-api
feat/amnezia-sdk-integration
feat/force-update-native
refactor/marketplace-update-popup
feat/force-update
fix/valnurability_dev
chore-xcode-version
fix/empty-i1-i5
build_qt_6_10_1
master
feat/protocol-selection
fix/openvpn_install
feat/locations_change
feat/locations_change_rework
feature/local-proxy-integration
fix/filepicker_atv
fix_valnurability
fix/macos-ne-codesign-4.8.19.0
temp-branch-for-testing
fix/rebased_4_8_19_linux_fix_error
feat/proxy-storage-cache
fix/zeroed-params
fix/killswitch-blocknets-linux
update/translation_RU
fix/self_hosted_reinstall_error
feat/selfhosted-dns
fix/agp_version_up
feat/switch_to_alive_protocol
feat/support_multipeer
server_scripts_update
fix/extended-vless-configuration
chore/apple-ci-cd-macos-versions
feat/add-telemt
fix/android_keystore_read_error
feat/add-mtproxy
chore/bump-qt-version
fix/make_dbus_async
feature/dns
rebase/apple-tv-target-on-conan
fix/outbound_freedom_xray_with_dns_fix
feat/apk_support
feat/fallback-proxy
feat/apple-tv-target
fix/dns_reconnection_issue
feat/fixed-push-notifications-on-VPN-connect-disconnect
fix/linux-firewall
docker-regional-locks
appstore-review-popup
feat/storekit2
fix/uninstall-split-tunnelling-driver
revert-2376-chore/license-file
support_16kb_android
bump_version
feat_add_review_android
bugfix/translation-absence-on-subscription-key-page
feat/location-separation-by-region
bugfix/text-moving-when-resing-window
fix_backup
feature/add-purchase-android
bugfix/moved-text-while-resizing-window
bugfix/incorrect-killswitch-restore-from-backup
fix/backup-exclude-secondary-api-configs
feat/proxy-fields-for-dev-console
bugfix/ovpn-ios-fix
bugfix/linux-bundle-libraries
fix/xray-app-split-win
fix/upload-to-s3
chore/add-release-date-upload
feat_add_webview_support
feature/configuration-transfer-through-qr
feat/bot-key-unlink-device
fix/ad-link-lang-support
fix/qsecuresettings-with-android
feat/add-support-arm64-win
spanish-translations
fix/context-menu
feat/add-system-dns-support
fix/qt6-9-support
fix/qt6_9_support
bugfix/strict-killswitch-ui
android-7
chore/minor-bugfixes
feature/awg-net-fix-macos-wakeup
fixbug/ios18
bugfix/ios-ne-crash
fix/linux-tray-quit-button
cryptpad-support
bugfix/disable-linux-killswitch
fix/minor-ui-fixes
feature/setup-guid-tun2socks
feature/linux-ipsec
feature/ipsec-linux
refactoring/server-config-in-classes
feature/macos-ipsec
fix/ui-fixes-after-merge-with-d20ed4a
chore/focus_control_after_qt_6.9_migration
feature/integrate-xray-as-a-library
maxos-awg-fix
feature/add-new-awg-docker-image
chore/update-3rd-prebuild
feature/test-news
fix/api-conf-files
bugfix/split-tunneling-with-api-config
bugfix/ios-awg-new-fields
feature/special-handshake-2
feat/xray-api-support
fix/desktop-entry
bugfix/shadowsocks-cipher-setting-not-changing
feature/update-tap
bugfix/openvpn_import_fix
feature/ability-to-change-port-after-installing-xray
bugfix/strict-mode-ovpn
bugfix/win-ipv6-ovpn
bugfix/subnet-adress-setting
exception-podman-docker
bugfix/fix-listviewtype-scrolling
bugfix/win-disabled-ipv6
bugfix/win-ipv6-disabled-ovpn
feature/killswitch-strict-mode
feature/awg-network-check
feature/empty-split-tunneling-list
feature/support-info
chore/update-go-version
checking-Linux-version
update_server_scripts
bugfix/button-selection-easy-setup-page
feature/old-api-proxy
patch/user-checking
fix/correcting-version
support-podman
support_podman
user-checking-patch
feature/check-docker-version
feature/allowed-dns-list
without_lsof
chore/error-body
Update-amneziavpn_ru_RU
shiroow-patch-8
shiroow-patch-7
shiroow-patch-6
shiroow-patch-5
shiroow-patch-4
shiroow-patch-3
shiroow-patch-2
shiroow-patch-1
check_sudo_permissions
feature/euphoria
add_next_octet_to_ip_settings
bugfix/mobile-controllers-init
euphoria
bugfix/android-crush
feature/macox-network-extension
bugfix/pre-release-hotfixes
bugfix/ipsec-pfs
chore/ios-site-links
checking_sudo_permissions
feature/android-tv
improve_navigation_cpp
bugfix/linux-firewall-install
fixbug/wireguard-handshake-time
ReadmeRu_full
feature/xray-user-management
feature/subscription-end-date
chore/clang-format
feature/ru-in-readme
chore/increased-api-timeout
chore/deploy-workflow
bugfix/services-list-scroll
wheel_group_suppor
chore/bump-xcode-version
fixbug/mac-network-extension
feature/android-gpb
feature/page-home-drawer-country-selection
checking-sudo-users
bugfix/service-info-from-response
fixbug/build-macos-ne-2
android-qt-6.7.3
fixbug/build-macos-ne
bugfix/wg-windows-log-folder
feature/psk-key-api-request
bugfix/user-management-qml-warnings
fix/macos-network-extension
fixbug/macos-NE-build
bugfix/fixed-isDevEnv-initialization
bugfix/revert-ios-ovpn
feature/tun2socksSrv
fix/disable_singleapp
feature/awg-wg-name-resolving
feature/disable-dhcp
bugfix/allowed-ips-old-configs
feature/goodbyedpi
feature/add-exception-log
refactoring/remove-ipv6-from-default-routes
refactoring/singleapplication-submodule
macos-dirty-build
test/gateway
Update-amneziavpn_fa_IR.ts
bugfix/ipsec-win
fix/xray-custom-port
improve-tab-navigation
test-win-11
feature/android-tv-remote-control-support
KsZnak-patch-1
feature/awg-wg-qr
bugfix/fix-loopback-splittunel
fix/setup_host_firewall
feature/android-xray
feature/openvpn-pass
feature/connection-string
fix/clickable-errors
bugfix/api_1100_fix
feature/graphview
testsvg
feature/update-win-awg
feature/open-as-amnezia
feature/update-mozilla-upstream
bugfix/qr-code-cutting
feature/native-wg-psk
test/awg-centos
bugfix/hide_error
feature/add-uninstaller-checkbox
bugfix/cancel-button-on-install-page
bugfix/anchors-page-home-warning
awg-udptlspipe
button-focus-fix
revert-677-fix/logger
bugfix/Revert_PR_596
bugfix/allowed-ips-api-configs
bugfix/on-escape-pressed
feature/auto-scroll-for-server-selection-list
fix/ui-fixes
translations/update_fa_IR.ts
feature/new-awg-docker-container
bugfix/awg_ipv6_fix
feature/tab-navigation
fix/username-no-autocapitalization
sure
refactoring/servers-model-cleanup
feature/wg-mtu-setup-ios
3rd_adaptation_to_diff_OS
sudo_not_found
test/docker-ce
bugfix/double_clear_server_from_amnezia
fix/android
client/3rd-prebuilt
revert-559-KsZnak-translation-ru-ex
KsZnak-translation-ru-ex
KsZnak-br1
KsZnak-text-change
feature/api-awg
feature/error-code-output
feature/win_x32_builds
text/debug-output
feature/ovpn3-desktop-cli
bugfix/secureqsettings-deadlock
refactoring/change-settings-when-connected
files_check
ArchLinux-support
second_adaptation_to_diff_os
sudo
refactoring/android-build
adaptation_to_different_os
feature/online_installer_for_v4
update_to_r2
bugfix/return-after-installation
feature/custom_drawer_component
bugfix/split-tunneling
bugfix/existing-awg-container
revert-370-feature/custom_drawer_component
bugfix/adapted_awg_questiondrawer
bugfix/updated_drawer_height_pageserverdata
bugfix/translated_new_source_strings_to_chinese
feature/split-tunneling-config
feature/accessibility-support
branch_connectivity_change_fix
feature/ikev2_android
android_ss_transport
bugfix/macos_fixes
feature/nextcloud-support
feature/macos_network_extension
android_pt_transport_source
feature/ios-openvpn3-pluggable-transport-Cloak
bugfix/cloak_for_desktops_fix
arm-build-macos
fix-macos-build-brew
bugfix/ios-build-openvpnadapter-from-source
feature/download-native-wireguard-config-on-connect
feature/v2ray-container
bugfix/dpkg-busy-checking-stuck
feature/online-installer
dev-killswitch
dev-netadapters
5.0.3.0
5.0.2.1
5.0.2.0
5.0.1.5
5.0.0.5
5.0.0.2
4.8.21.0
4.8.19.0
4.8.18.0
4.8.17.0
4.8.16.0
4.8.15.4
4.8.15.0
4.8.14.5
4.8.14.1
4.8.12.9
4.8.12.8
4.8.12.7
4.8.12.6
4.8.11.4
4.8.11.3
4.8.11.2
4.8.11.1
4.8.11.0
4.8.10.0
4.8.9.2
4.8.9.1
4.8.9.0
4.8.8.3
4.8.8.2
4.8.8.1
4.8.7.2
4.8.7.1
4.8.7.0
4.8.6.0
4.8.5.0
4.8.4.5
4.8.4.4
4.8.4.3
4.8.4.2
4.8.4.1
4.8.4.0
4.8.3.2
4.8.3.1
4.8.2.3
4.8.1.9
4.8.1.0
4.8.0.5
4.7.0.0
4.6.0.3
4.6.0.1
4.5.3.0
4.5.0.0
4.4.0.0
4.3.0.0
4.2.1.0
4.2.0.1
4.1.2.0_cloak_pt_experimental
4.1.0.1
4.0.8
3.1.0
3.0.8
3.0.7
3.0.5
2.1.2
2.1.0
2.0.10
2.0.9
2.0.8
2.0.7
2.0.6
2.0.5
2.0.1
2.0
1.9.1
1.9
1.8
1.7
1.6
1.5
1.4
1.3
1.2
1.1
1.0
No labels
pull-request
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set.
Reference
amnezia-vpn/amnezia-client#1431
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @pers1307 on GitHub (Aug 29, 2026).
Original GitHub issue: https://github.com/amnezia-vpn/amnezia-client/issues/3090
Describe the bug
On Linux, client 5.0.1.5 fails to read the routing table and never installs
exclusion routes for the VPN endpoint. With
0.0.0.0/1and128.0.0.0/1pointing at the tunnel, WireGuard packets addressed to the server are routed
back into the tunnel itself, creating a routing loop. Packets grow with each
iteration until the socket rejects them with
sendmmsg: message too long.Client 4.8.21 on the very same machine installs the routes correctly and works.
The issue is protocol-independent — reproduced with both AmneziaWG 2.0 and 3.1
servers.
To Reproduce
Steps to reproduce the behavior:
ip route get <server-ip>— it points at the tunnel (dev amn0) insteadof the physical gateway
sendmmsg: message too longin the daemon log; no traffic passesExpected behavior
The daemon should add an exclusion route for the server endpoint through the
physical default gateway, as 4.8.21 does:
Log files
Same 15-second window, two client versions on one machine:
Error in received packet: Numerical argument out of domainNo default gateway available, skipping exclusion route5.0.1.5:
4.8.21, same step:
(no warning, route present in
ip route)Other errors present in both versions, possibly related:
Screenshots
N/A — the client reports "Connected".
Desktop (please complete the following information):
Smartphone (please complete the following information):
Server (please complete the following information):
Additional context
Workaround — add the exclusion route manually before connecting:
The loop disappears and
sendmmsg: message too longstops.Possibly related: #1498, #1357, #2048 — all report "connected but no internet"
on Linux with the same
amnvpnrt/Invalid destination prefixlog noise.@pers1307 commented on GitHub (Aug 30, 2026):
Confirmed — this is exactly my case.
230 entries combined, roughly 2.4× over the ~94 threshold you mention
(230 × ~87 bytes ≈ 19.5 KiB against the 8 KiB buffer).
The bulk comes from Docker — 15 networks and 36 running containers on this
machine, accounting for 162 of the IPv6 routes and 39 of the IPv4 ones. The
tunnel itself contributes only 3 entries, so the overflow is there before the
VPN even starts.
That also explains the inconsistent
perrortext I saw: the daemon loggedNumerical argument out of domainon one connection attempt andNo such file or directoryon another, within the same session — which nevermade sense as a real error.
And it matches the version split I observed: on 4.8.21 the exclusion route is
installed correctly and everything works, while 5.0.1.5 logs
No default gateway available, skipping exclusion route10 times per attemptand ends with
sendmmsg: message too long. Same machine, same server, minutesapart.
Happy to test #3052 against this setup if a build is available — the route
table here reproduces the overflow reliably.
@HeisLuka commented on GitHub (Sep 9, 2026):
I rechecked this against current
dev.The reported root cause is still present, and I think there are several additional failure boundaries worth fixing together with #3052.
1. The fixed 8 KiB netlink dump buffer is still in current dev
NetworkUtilities::getGatewayAndIface()currently allocates:and accumulates the entire multipart
RTM_GETROUTEdump into that one buffer:After each datagram:
So once:
the next call effectively becomes:
which returns
0.The code only treats:
as a receive error.
It then executes:
with:
which fails and reaches:
So the varying:
messages are indeed unrelated stale
errnotext.The actual invariant failure is:
The reporter's measured:
makes this deterministic rather than timing-dependent.
2. The request unnecessarily asks for both IPv4 and IPv6 routes
The
rtmsgrequest buffer is zero-initialized, but current code never assigns:for the request.
So:
and the dump includes both IPv4 and IPv6.
That makes the overflow substantially easier to reach on Docker/libvirt/container hosts.
It is especially inconsistent because the parser later interprets every
RTA_GATEWAYusing:So the function is semantically an IPv4 gateway lookup while requesting an IPv4+IPv6 route dump.
#3052correctly narrows the request to:3. The current parser does not actually require a default route
After receiving the dump, current code accepts the first
RT_TABLE_MAINroute containing both:There is no check for:
and route metric is not considered.
Therefore:
but
getGatewayAndIface()currently treats them as equivalent.A host with multiple gateways or more-specific routes can therefore return the wrong underlay even when the dump fits into 8192 bytes.
For a VPN client the intended lookup is specifically:
not:
The
rtm_dst_len == 0and lowest-metric selection in #3052 address this correctly.4. More importantly: failure to install the endpoint exclusion is ignored
This is the part I would treat as the critical lifecycle bug.
During
Daemon::activate()current code does:The return value is ignored.
So:
does not stop activation.
The peer is then configured:
and finally the full-tunnel routes are installed.
For IPv4
/0, Linux intentionally converts:into:
pointing to
amn0.Therefore the actual sequence can be:
At that point the client has knowingly committed a full-tunnel route while its control-plane escape route is absent.
That should be a forbidden state.
5.
updatePeer()repeats the same failed operation and also ignores itWireguardUtilsLinux::updatePeer()contains another endpoint-exclusion attempt:Again the return values are ignored.
So there are currently two independent best-effort layers:
Neither establishes:
before installing full-tunnel routes.
I would consolidate ownership of this operation rather than attempting it twice.
6. This explains the recursive WireGuard packet growth
If the server is, for example:
and its physical
/32exclusion route is missing, one of:wins.
The userspace WireGuard process attempts to send its outer UDP packet to:
but the kernel routes that packet into:
The packet presented to the tunnel is then treated as traffic that itself needs tunnelling.
Conceptually:
until packet size limits are reached.
That makes:
a very plausible downstream consequence of the missing endpoint escape route, rather than an independent MTU problem.
The user's manual workaround:
breaking the loop is a strong runtime confirmation of the same path.
7. The error path also leaks a netlink socket
getGatewayAndIface()creates:but
close(sock)only occurs on the normal path near the end of the function.For example the overflow path reaches:
without closing
sock.The same happens for several other early returns.
Therefore every failed gateway lookup can leak one netlink FD.
The reporter sees approximately ten gateway lookup failures per connection attempt.
So repeated reconnects can additionally produce:
This should probably use an RAII/scoped FD rather than manually trying to cover every return path.
8. #2862 explains the apparent 4.8.x -> 5.0.x regression
PR #2862 changed this code from:
to:
and changed parsing from approximately the first receive block to the accumulated dump.
So older releases could accidentally succeed because they effectively parsed only an early route message.
Once multipart reception was corrected, large route tables started exposing the fixed 8192-byte ceiling.
So I would not treat:
as evidence that the previous implementation was correct.
It happened to avoid this failure mode.
9. #3052 fixes the main parser bug, but activation should also enforce the endpoint-route invariant
I think #3052 is the right direction for the route parser:
But even with the parser fixed, I would separately harden the activation transaction.
For a single-hop/full-tunnel connection:
is not optional configuration.
It is a prerequisite for making tunnel routes authoritative.
The ordering should be approximately:
If the exclusion cannot be established:
rather than:
10. Distinguish parser failure from "no default route yet"
There is also an important distinction with cases such as boot-time autoconnect.
These are different states:
Both currently collapse into:
and then:
But the recovery policy is different.
For A:
For B:
It would be useful for
getGatewayAndIface()to return a typed result instead of encoding all failure classes as an emptyQPair.11. IPv6 endpoint exclusion is another adjacent problem
updatePeer()attempts both:but Linux
rtmSendRoute()obtains the gateway through the IPv4-only:and always creates the gateway attribute from:
So the current exclusion construction is not genuinely family-aware.
That should probably be separated from #3090, but a future route lookup API should return something like:
rather than a QString IPv4 gateway plus
QNetworkInterface.Suggested invariants
The most important one is:
And for route discovery:
Regression tests
Expected:
The fix should not merely move the hard ceiling.
must not process unrelated IPv6 routes.
Expected:
Expected:
Forbidden:
Expected:
rather than either an infinite retry or committing a broken tunnel.
Expected:
must return the physical underlay interface.
At the same time:
must return
amn0.The connection-health logic should detect loss of the control-plane route rather than silently entering recursive encapsulation.
So I would classify #3090 as confirmed and still present in current dev.
The fixed 8 KiB netlink buffer is the immediate regression trigger on the reported host, but the more important lifecycle problem is broader:
failure to establish the VPN endpoint's underlay route is treated as best-effort, and full-tunnel routes are committed anyway.
That turns a recoverable route-discovery failure into a self-capturing VPN endpoint and complete loss of connectivity.
@Plasmoid77 commented on GitHub (Sep 23, 2026):
Another data point, from 4.8.19 (Arch Linux,
amneziavpn-bin4.8.19.0, AmneziaWG). The same log sequence appears there, so this is not only a 5.x regression — it depends on the size of the route table, and an ordinary desktop crosses the 8 KiB limit:RTM_GETROUTEdump (AF_UNSPEC, all tables)[3768, 3712, 20][3676, 6264, 20]No default gateway available, skipping exclusion route→sendmmsg: message too longip -4 route show table all | wc -l= 24 andip -6 route show table all | wc -l= 73 in the failing state — a few Docker bridges/veths and libvirt, plus a LAN that advertises three IPv6 prefixes (native, ULA and an overlay /64) with DHCPv6/128s and theirlocalentries. Measured with a small Python replica of the request and the fixed-buffer read loop.One consequence worth handling together with #3052: the app still reports Connected while the endpoint exclusion route is missing, so the user sees a working VPN that passes no traffic. Moving the uplink from wired back to Wi-Fi "fixes" it only because the dump fits again.
Happy to test a build with #3052 on this machine.
@vami7ir commented on GitHub (Sep 23, 2026):
Still reproduces on 5.0.3 (Ubuntu, kernel 6.8, ~34 Docker containers). Route dump ≈ 26.6 KB, of which IPv6 ≈ 25.4 KB comes
from veth* interfaces; without them ≈ 1.1 KB.
A workaround that doesn't need a per-server static route: disable IPv6 on the Docker veth interfaces, so the dump fits
into 8 KiB again and the client installs the exclusion route itself (any server, any network):
for i in $(ls /sys/class/net | grep ^veth); do sudo sysctl -qw net.ipv6.conf.$i.disable_ipv6=1; done
To cover new containers, a udev rule /etc/udev/rules.d/90-veth-noipv6.rules:
ACTION=="add", SUBSYSTEM=="net", KERNEL=="veth*", RUN+="/usr/sbin/sysctl -qw net.ipv6.conf.%k.disable_ipv6=1"
Only helps when the extra IPv6 routes come from Docker, not from the LAN itself. Proper fix is still #3170 / #3052.
@Plasmoid77 commented on GitHub (Sep 23, 2026):
Thanks — you're right. I checked
client/core/networkUtilities.cppat tag4.8.19.0:BUFFER_SIZE = 100, a singlerecv()(the loop testsNLM_F_MULTIon the request header, so it stops after the first datagram), and then only the firstRT_TABLE_MAINroute carrying bothRTA_GATEWAYandRTA_OIFcounts. So my 7500 / 9960-byte numbers model the 5.x read loop, not 4.8.19 — please take them as a 5.x data point only.The line you asked for, taken while the tunnel is up (wired LAN and Wi-Fi both connected):
A replica of the 4.8.19 logic (one 100-byte
recv(), first main-table route with gateway and oif) accordingly finds no gateway in that state. I haven't isolated the route order at the moment of a reconnect, after the/1routes are removed, so I won't guess at that part.@McSmog commented on GitHub (Sep 24, 2026):
I can confirm this issue also affects AmneziaVPN 5.0.3.0 on Linux. My machine has multiple Docker networks and routes. The system had a valid default route, but connecting through the GUI left me without internet access.
The service logged
Error in received packet: Numerical argument out of domainandNo default gateway available, skipping exclusion route. Disabling split tunneling did not help. I verified that the same AmneziaWG 3.1 server and client profile could pass traffic outside the GUI.I built the 5.0.3.0 background service with PR #3052 applied and used it with the existing GUI installation. Internet access through the GUI now works. This is a confirmed fix on my machine. Please merge and release it — users should not have to rebuild the service to get a working VPN.
@itelmenko commented on GitHub (Oct 8, 2026):
Same bug on Ubuntu 24.04, client 5.0.3.0 (released 2026-09-18 — started failing for me around that date).
Setup
Symptoms
Conclusion Matches this issue: with a large routing table (Docker), gateway detection / exclusion route install fails, so the VPN endpoint is routed into amn0. Manual exclusion route or stopping Docker is a workaround. Happy to provide more logs if useful.
@pers1307 commented on GitHub (Oct 9, 2026):
@pokamest @Nethius @vkamn help us, pls.