mirror of
https://github.com/amnezia-vpn/amneziawg-linux-kernel-module.git
synced 2026-10-14 05:41:56 +00:00
[GH-ISSUE #215] Regression after amneziawg-dkms 202608051436+ce16310 → 202608140352+4680320: handshake succeeds but no data transfer (Keenetic client) #124
Labels
No labels
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
amnezia-vpn/amneziawg-linux-kernel-module#124
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 @sefferito on GitHub (Aug 15, 2026).
Original GitHub issue: https://github.com/amnezia-vpn/amneziawg-linux-kernel-module/issues/215
Environment
Summary
After amneziawg-dkms updated from
1.0.0-0~202608051436+ce16310~ubuntu24.04.1to1.0.0-0~202608140352+4680320~ubuntu24.04.1(server reboot to apply), the tunnel to a Keenetic router client stopped passing data. This is a clean regression: the older build (ce16310) had been running without any issue for 9 days prior.Symptom
latest handshaketimestamptransfercounter for that peer stays frozen indefinitely even while sent bytes on the client keep growinghandshake ... did not complete after N seconds, retryingmessages, some with clearly invalid/overflowed N values (this display artifact is a separately-acknowledged Keenetic cosmetic bug, not something I'm claiming is caused by this module — flagging only for context, since it shows up alongside the real symptom)<r 128>,<r 64>, and a QUIC-mimicry CPS packet) made no differenceTiming
ce16310build: installed ~2026-08-05, stable through 2026-08-14 (9 days, no issues)4680320build: installed and activated via reboot at 2026-08-14 23:57 UTCPossibly related
#30 (same garbled-seconds log pattern on a Keenetic client, though that report describes brief hourly drops rather than a sustained regression tied to a specific update)
Not yet tested
Have not been able to obtain the
ce16310build for a clean A/B rollback test (not available via apt-cache policy, not cached locally, and I haven't located it in the PPA's build history). If anyone knows how to pull a specific historical build from the amnezia PPA, that would let me confirm definitively.@bivlked commented on GitHub (Aug 24, 2026):
I maintain the installer this server was deployed with, so I tried to reproduce this on a box that matches yours closely. I could not. But I did find something that changes what the two builds in your title are.
They are different module generations. I installed each one and read what the loaded module reports:
/sys/module/amneziawg/version1.0.0-0~202608051436+ce163103.0.202608051.0.0-0~202608122133+0d5f03c3.0.202608051.0.0-0~202608140352+46803203.1.20260812So the update you bisected to is not a rebuild of the same code, it is the 3.0 to 3.1 transition. I installed the intermediate 12 Aug build as well, expecting the boundary to sit earlier, and it does not: that one is still 3.0. The generation flip lands exactly on
4680320, the build your symptom started on. If anyone here suggests downgrading, note that it rolls the generation back too, and the package version string gives no hint of that.Getting those old builds, since you said you could not. Launchpad keeps superseded binaries downloadable:
The package is architecture independent, so it is
_all.deb;_amd64.debgives 404. Version strings come from the API, no install needed:This may well be what stopped you: those file URLs throw an occasional HTTP 503. I hit it twice today and a plain retry worked both times, so use
curl --retry 5 --retry-all-errors.What I measured. Ubuntu 24.04.4, kernel 6.8.0-138 against your 6.8.0-137, x86_64, same installer, so the server config carries only the 2.0 parameters (Jc/Jmin/Jmax, S1-S4, H1-H4, I1) and none of
HeaderProtectionKey,ContentPaddingAddition,RandomTrailersorDisableCookies. Every pairing below carried traffic both ways with no loss and no stalls: 200 ICMP packets of 1200 bytes at 0% loss, then iperf3 each way, moving 576 MiB to 1.37 GiB per direction depending on the pairing. With the kernel client I also repeated the whole run after an idle gap long enough to force a rekey, and it passed again.3.1.202608123.1.20260812amneziawg-gomaster3.1.20260812amneziawg-goat08d68cda, the last commit before1f50ad73"feat: awg 3.1 features"3.0.20260805That third row was meant to confirm a theory of mine and killed it instead. I expected the 3.1 module to break peers that predate 3.1, which would have fit your Keenetic firmware nicely. It does not: a userspace client built before 3.1 support existed talks to the 3.1 module fine, and the two sides agree on their byte counters. So that branch of the search is closed, at least for reference implementations.
Before anyone reads those green rows as "no bug". I ran the client on the same host in a separate network namespace, so this exercises the module rather than a real network path, and it says nothing about MTU, fragmentation or NAT timeouts. And I have no Keenetic, so the one pairing that matters in your report is the one I cannot test.
I did check that my setup can see your symptom at all. I broke the data path on purpose while keeping the handshake alive, by pointing the peer's
allowed-ipsat a different address. The handshake stayed fresh, ping went to 100% loss and the peer counters stopped moving, which is your description almost word for word. So the green rows are a real result rather than a measurement that cannot fail.The cheapest thing that would split this. Point any reference client at your server while it runs
4680320: a Linux box with the kernel module, oramneziawg-gowith the same config. If that pairing passes traffic, the module's data path is not broken in general and the search narrows to the Keenetic side. And during a failing session,tcpdumpon the server's UDP port separates "the client's data packets never arrive" from "they arrive and get dropped after decryption", which are very different bugs. Post either result and I will help dig.@bivlked commented on GitHub (Oct 7, 2026):
Quick correction to my last comment first. The old
amneziawg-dkmsbuilds can no longer be downloaded from the PPA. On 24 Aug the+files/links still worked. As of 7 Oct they return 404 force16310,4680320,b72bb7aand3c38e16, and only the current4569c4cis there. Going by the Launchpad API, each recent build was removed from the archive about a day after the next one came out. So you can't downgrade from this PPA anymore. If you kept an old.deb, you can still trysudo apt install ./<file>.deb. To keep the package you have installed now, usesudo apt-mark hold amneziawg-dkms. DKMS will still rebuild that same source for new kernels, but you won't get fixes until you unhold it.Also, the module version no longer tells builds apart.
4569c4creports3.1.20260812, the same as4680320. The difference shows insrcversion:/sys/module/amneziawg/version/sys/module/amneziawg/srcversionce163103.0.202608052CAAA0D41116817D097CF1246803203.1.20260812B55FF16F2E5FAADE434191F4569c4c(current)3.1.202608127EB84CCAD4C5015BF2AF6A1The packages for the first two rows are gone, so I rebuilt them from those commits using the current packaging. They should match the originals, but I can't prove that.
cat /sys/module/amneziawg/srcversionshows the loaded module.modinfo -F srcversion amneziawgshows the module file for the running kernel. Until a reboot these two can differ.I also ran a bigger test, and it still didn't reproduce. It was 38 runs on a freshly installed Ubuntu 24.04 VM with a 6.8 kernel, using two configs:
ce16310to4569c4c. That's the same kind of jump as yours.4569c4cto4680320and then upgraded back.The clients were:
amneziawg-gofrom before and after 3.1 support;Not every client ran against both configs. Each run sent traffic both ways for 150 s, which included a rekey. Then it waited 200 s with no traffic and keepalive off, and the server sent first. Traffic got through in every run. When I broke the data path on purpose, the test caught it even with a fresh handshake.
I still have no Keenetic, so your exact setup is untested. With
amneziawg-go, the server's latest handshake usually reset during the 200 s wait. So the "session expired, server sends first" case came up in only 5 of 16 of those runs. With the kernel client it came up in all 22.If it still happens, could you post the
srcversionfrom your server? Atcpdumpon the server's UDP port during a broken session would also help.