Question About Dynamic Remote Forwarding
Chris Rapier
rapier at psc.edu
Sat Jun 10 13:40:38 AEST 2023
Mostly it's about how we handle loading the parallelized ciphers. We can't
really effectively start them in preauth as that will result in the threads
being lost by main. So after auth happens we rekey and load the parallel
ciphers we developed (aes-ctr and now CC20). Either side can trigger this
because we don't wasn't to be using the serial cipher on both sides if we
don't have to (especially on the receiver sauce as that send to be more
resource intensive). This means that OpenSSH can interact with a parallel
cipher without any issues. However, this breaks down with dynamic remote
forwarding. We can't start the parallel cipher until after the fork.
In terms of the dynamic remote forward the server will end up requesting a
rekey before the client has forked. Which means the client rekeys into the
parallel cipher before the fork and everything goes pear shaped.
We can make it so that the server won't issue a rekey but when an openssh
client interacts with an hpnssh server our server won't load the parallel
cipher until we get a rekey based on the block count. Which isn't awesome
in terms of performance.
So it's mostly about getting an hpnssh server to recognize when an openssh
client is post fork in order to maximize performance.
We think this is worth working out as, for example, the parallel CC20
cipher is roughly 50% faster.
My thinking is that the client is waiting on a signal from the server to
execute the delayed post_authfork() command. If can time it so that the
server doesn't rekey until it sends that signal we can handle our situation
correctly while retaining compatibility.
Dunno, just trying to think this though. If I can figure out something on
the server side that's cool. Otherwise I think I need to prevent the server
from rekeying into the parallel cipher in a tcpip-forward situation. That's
suboptimal but we can make that work
On Fri, Jun 9, 2023, 20:05 Damien Miller <djm at mindrot.org> wrote:
> On Fri, 9 Jun 2023, Chris Rapier wrote:
>
> > Hi all,
> >
> > When a client requests dynamic remote forwarding with -R it delays
> forking
> > into the background. In ssh.c we see
> >
> > if (options.fork_after_authentication) {
> > if (options.exit_on_forward_failure &&
> > options.num_remote_forwards > 0) {
> > debug("deferring postauth fork until remote forward "
> > "confirmation received");
> > } else
> > fork_postauth(ssh);
> > }
> >
> >
> > This seems to depend on forwarding_success() for it to then call
> > fork_postauth.
> >
> > If I'm reading this correctly the client sends out a number of forward
> > requests which is tracked via forward_confirms_pending in ssh.c.
> >
> > Is there any equivalent on the server side to track the number of
> received
> > requests?
> >
> > I ask because I'm trying, for various reasons, to trigger a rekey on the
> > server side *after* the client forks in a dynamic remote forward
> scenario. I
> > know that the server can't actually know for certain if the client has or
> > hasn't forked but if I could track the number of confirmations the
> server has
> > sent I can use that as a reasonable proxy. I could use an ssh control
> message
> > to do this but I'd rather not if I don't have to.
>
> I don't think what you want is possible without a protocol extension. The
> server has no notion of the client's fork-after-auth behaviour and has no
> way of knowing if/when another forwarding request will come.
>
> Why not have the client ask for the rekey? It's in a better position to
> know...
>
> -d
>
More information about the openssh-unix-dev
mailing list