#1136459 openssh-server: [regression] stopped accepting connections over the WLAN

Package:
openssh-server
Source:
openssh-server
Description:
secure shell (SSH) server, for secure access from remote machines
Submitter:
Thorsten Glaser
Date:
2026-05-17 17:53:01 UTC
Severity:
normal
#1136459#5
Date:
2026-05-13 22:22:21 UTC
From:
To:
I’ve got this trixie system, updated to latest everything earlier,
and I cannot connect to it over the WLAN from a bullseye system
any more. This worked very recently.

I ran /usr/sbin/sshd -ddddde server-side and ssh -vvvvv client-side
to test, and it hangs at:

[…]
debug1: sshd-auth version OpenSSH_10.0, OpenSSL 3.5.6 7 Apr 2026
debug2: fd 5 is TCP_NODELAY [preauth]
debug3: set_sock_tos: set socket 5 IP_TOS 0xb8 [preauth]
debug3: server_process_channel_timeouts: setting 0 timeouts [preauth]
debug3: channel_clear_timeouts: clearing [preauth]
debug3: fd 5 is O_NONBLOCK [preauth]
debug3: ssh_sandbox_init: preparing seccomp filter sandbox [preauth]
debug3: privsep user:group 995:65534 [preauth]
debug1: permanently_set_uid: 995/65534 [preauth]
debug3: ssh_sandbox_child: setting PR_SET_NO_NEW_PRIVS [preauth]
debug3: ssh_sandbox_child: attaching seccomp filter program [preauth]
debug1: list_hostkey_types: rsa-sha2-512,rsa-sha2-256,ssh-rsa [preauth]
debug3: send packet: type 20 [preauth]
debug1: SSH2_MSG_KEXINIT sent [preauth]

The client hangs after listing all the identity files and showing
the local version string as debug1.

ssh-ing to localhost works.

It’s not an MTU problem, 1500 byte DF ping packets go through.

If I run the sever as /usr/sbin/sshd -ddddde -o IPQoS=throughput
the connection succeeds.

For the sake of completeness:

/usr/sbin/sshd -ddddde -o IPQoS=ef	hangs
/usr/sbin/sshd -ddddde -o IPQoS=le	works
/usr/sbin/sshd -ddddde -o IPQoS=none	works
(do I need to test more?)

Server hangs on a FritzBox 7430 (OS 07.31 up-to-date) which is
meshed with a FritzBox 7330 (OS 06.56 up-to-date). They have
isolation disabled, and as far as I can tell, no filtering.

#1136459#10
Date:
2026-05-13 22:28:29 UTC
From:
To:
/usr/sbin/sshd -ddddde -o IPQoS='lowdelay throughput'
also works (isn’t that the pre-1:10.0p1-7+deb13u3 setting?).

bye,
//Thorsten

#1136459#15
Date:
2026-05-13 23:16:31 UTC
From:
To:
Dixi quod…

ssh’ing out also fails unless -o IPQoS='lowdelay throughput'
so it also affects the client.

I then ran a test which TC octets pass through, by cloning
https://github.com/mirabilos/ECN-Bits (an earlier project),
'cd c && make', then:

$ ./server/server 11111

and:

$ i=-1; while (( ++i < 256 )); do ./client/client 192.168.1.5 11111 $i; done

The result is that the Fritzboxen do not generally drop packets
with any TC octet (my first 0x49 didn’t pass, but it’s UDP, and
on retry, it worked).

However, if I start the server as…

$ ./server/server +0xB8 11111

(meaning it will (try to) respond to each incoming packet with
TC 0xB8‥0xBB), then no replies are registred at the client. I’m
not sure whether this is something done by Linux itself or a
device after it.

Reversing the construct from above, i.e. the trixie system sending…
0x00‥0x9F, 0xC0‥0xFF pass, i.e. 0xA0‥0xBF are dropped, which is
bit pattern 001xxx.xx (ToS.ECN), which corresponds to precedence 1
in the old model, or in DSCP, decimal 8‥15, which Wikipedia’s list
shows as CS1, ?, AF11, ?, AF12, ?, AF13, ?.

Unfortunately, I’m unable to get either of the laptops to switch
APs (sudo iwconfig wlan0 ap …), but I did get an iwlwifi crash on
attempting that… so I cannot test changing Fritzboxen atm.

Gruß
//Thorsten

#1136459#20
Date:
2026-05-13 23:44:04 UTC
From:
To:
That being said, I managed to take a pcap dump on¹ the 7330 (client).

What I see there:

1. c→s TC=00 tcp syn/ecn/cwr
2. c←s TC=00 tcp syn/ack/ecn
3. c→s TC=00 tcp ack
4. c→s TC=02 ssh version+crlf
5. c←s TC=00 tcp ack, no payload
and a few seconds later c→s fin/ack, c←s fin/ack, when I pressed ^C.

When I do a pcap dump on the 7430 (server), I see lots more, with TC=B8.

So it seems like certain network devices default to blocking packets
with the new default traffic class octet, which I think you’ll want
to take upstream.

On my side, I’ll try to contact AVM support, but since they got bought,
unsure whether they will do anything than to tell me to buy a newer
device (it’s not even mine so…).

① https://linuxundich.de/gnu-linux/netzwerk-traffic-direkt-mit-der-fritzbox-aufzeichnen-und-mit-wireshark-auswerten/
  ⇒ 192.168.1.2/html/capture.html (hidden page)

Gruß
//Thorsten

#1136459#25
Date:
2026-05-13 23:58:04 UTC
From:
To:
This is especially important as it can cause lock-out scenarios.

From B to A, I can do ssh -o IPQoS=… and get a working connection.
But in the other direction, I can do nothing, as the SSH client
and server cannot do IPQoS negotiation as even the initial handshake
(server sends its version string to the client) already uses the
problematic traffic class.

Thanks,
//Thorsten

#1136459#30
Date:
2026-05-14 08:58:21 UTC
From:
To:
I think it would work best if you could take this upstream yourself.
Since I have no access to your hardware, when upstream ask for extra
debugging information, I'd end up just acting as a glorified relay,
which I'm not very good at.

Upstream told me that they've had a total of two reports of problems
with the new IPQoS settings, so I expect they'd be interested in
additional reports of regressions.

I've CCed one of the main authors of these changes in case they can spot
anything that would come down to a bad backport on my part; Job, see
https://bugs.debian.org/1136459 for context.  Thorsten, if you could try
the version currently in testing (or perhaps also the version in
unstable), that would help to exclude problems caused by possible bad
backports.

Thanks,

#1136459#37
Date:
2026-05-17 17:45:51 UTC
From:
To:
Hi Colin,

if they let me…

Right.

I believe so, yes.

Thanks, but from my testing with UDP packets, it *seems* that one of
the FritzBox devices is at fault, and OpenSSH only as much in that
they changed the default. Unfortunately, AVM support indeed only wants
to sell me (I’m not even the owner) a newer model.

Meanwhile the other laptop hopped to a different AP MAC by itself,
so it even works now, and it seems to apply to incoming packets only.
I’ve not found an option for that (and no filtering is configured),
so the firmware is likely buggy, but with an uninterested vendor, there
isn’t much we can do.

Job, the problem is that such plastic boxen, doing DSL, access point,
even WLAN repeater, are rather widespread in Europe, and if some of
these block IP packets with a traffic class of 0xA0‥0xBF, in which
the new default QoS falls, then the users have a serious lock-out
problem, in situations where they cannot override anything (if the
SSH server uses the new QoS bits so a response does not even arrive).

This *could* be mitigated by something like:
- do the SSH handshake without setting the new IPQoS
- then negotiate somehow, perhaps with a new protocol extension,
  that you’ll be trying to set QoS to a certain value, send a
  packet in both directions with that set and another immediately
  after without it set (so you don’t have to do long timeouts),
  and fall back to a different QoS marker if they don’t arrive

(at least in the case when it is not explicitly given)

I also noticed that the new default sends out with 0xB8, not
0xBA, which I would have expected given I set this system to
use ECN by default (the DSCP is the same but 0xBA has ECT(0)
set). There’s also some 0x00 in the trace where I’d expect
0x02 for the same reason.

Getting that to work with both old and new clients… will be
interesting. Perhaps, if it’s going to need an extension anyway,
it could even test a bunch of them (ideally, both the interactive
and bulk DSCP codepoints with all four ECN variants, or at least
no ECN, ECT(0) and ECN CE; ECT(1) is likely to be L4S at some
point and needs explicit enabling).

bye,
//Thorsten