RemoteForward and dynamically allocated listen port

Markus Friedl mfriedl at gmail.com
Wed Aug 7 07:13:31 EST 2013


see http://www.openssh.com/txt/release-5.6

 * ssh(1) connection multiplexing now supports remote forwarding with
   dynamic port allocation and can report the allocated port back to
   the user:

     LPORT=`ssh -S muxsocket -R0:localhost:25 -O forward somehost`


-m


Am 05.08.2013 um 21:04 schrieb Andrew Pimlott <andrew at pimlott.net>:

> Specifying a RemoteForward of 0:example.com:1234 dynamically allocates
> the listen port on the server, and then reports it to ... the client!
> Where it is practically useless.  Was this someone's idea of a joke?
> 
> Presumably not--there are some technical obstacles to reporting it to
> the remote process.  I'd like to help solve that problem.
> 
> The natural way to me would be to extend the syntax of RemoteForward to
> allow ENV_VAR:example.com:1234.  This would set $ENV_VAR to the
> dynamically alocated port in the remote process.  However, the protocol
> passes the listen port as a u_int.  A hack might be to pack the env var
> name into the listen address and set the listen port to a special value
> to indicate this, but I don't know if this is playing too fast and
> loose.  A cleaner solution would be to add a new request type.  I
> imagine that ssh protocol changes are made conservatively, so I don't
> know how viable these options are.
> 
> Without changing the protocol, we could at least set an environment
> variable for each dynamically allocated port, numbered by the order of
> the RemoteForward requests, eg. SSH_REMOTE_FORWARD_PORT_1,
> SSH_REMOTE_FORWARD_PORT_2, ....  I was able to wedge a proof of concept
> into session.c:do_setup_env (patch below).  It's a hack because there
> doesn't seem to be an API to iterate channels outside of channels.c.
> Would it be agreeable to export channels and channels_alloc?  Also,
> struct Channel doesn't let you tell which forwards were dynamically
> allocated, so an environment variable is set for all RemoteForwards.
> This could be changed by extending struct Channel, though it isn't a
> show-stopper for me.
> 
> Last thought: if a new protocol request type were added, it should make
> it easy to add support for forwarding unix sockets, which I have missed
> for a long time.
> 
> Would any of these approaches be acceptable?  Any other ideas?
> 
> Thanks,
> Andrew
> 
> --- session.c.orig	2013-08-03 13:22:10.354171156 -0700
> +++ session.c	2013-08-05 09:58:00.017397667 -0700
> @@ -1307,6 +1307,17 @@
> 		child_set_env(&env, &envsize, SSH_AUTHSOCKET_ENV_NAME,
> 		    auth_sock_name);
> 
> +	char name[256];
> +	u_int n = 0;
> +	for (i = 0; i < 100; i++) {
> +		Channel *c = channel_by_id(i);
> +		if (c == NULL || c->type != SSH_CHANNEL_RPORT_LISTENER)
> +			continue;
> +		snprintf(name, sizeof name, "SSH_REMOTE_FORWARD_PORT_%d", n);
> +		snprintf(buf, sizeof buf, "%d", c->listening_port);
> +		child_set_env(&env, &envsize, name, buf);
> +	}
> +
> 	/* read $HOME/.ssh/environment. */
> 	if (options.permit_user_env && !options.use_login) {
> 		snprintf(buf, sizeof buf, "%.200s/.ssh/environment",
> _______________________________________________
> openssh-unix-dev mailing list
> openssh-unix-dev at mindrot.org
> https://lists.mindrot.org/mailman/listinfo/openssh-unix-dev



More information about the openssh-unix-dev mailing list