Thanks Jim,

That really clears things up for me.

So but you're saying that Keith's idea of having the outgoing
datagram's source IP remapped is not possible?

I totally agree about the traditional approach of the "bastion host",
it's basically like having SSH act as the "load balancer" - as I'll
have some shell script open up a connection to a random server on the
bastion's CLI. The only problem there is that it doesn't take
advantage of traditional cluster architecture so well. For instance
I'll need to come up with a custom method of keeping a live list of
the available internal IP addresses to which I can forward the
session. Any idea how many connections an average 512MB VM could
handle like this? I suspect so many that you'd only ever need one VM?

Tom

On 13 July 2018 at 12:54, Jim Cheetham <jim.cheet...@otago.ac.nz> wrote:
> Excerpts from Thomas Buckley-Houston's message of July 13, 2018 3:58 pm:
>> So
>> because UDP is a connectionless protocol, every datagram has to
>> contain the source IP in order for the receiver to send responses?
>
> Every packet does have the source IP address in it, but not because it's a 
> UDP packet, it's because that's what all *IP* packets have. UDP is a protocol 
> built on top of IP, as is TCP - we're used to the "full name" of TCP being 
> TCP/IP, but it's unusual to say "UDP/IP" :-)
>
>> It's not enough for either end to assume an IP based on the *initial*
>> datagram's IP?
>
> Because UDP is connectionless, there's no concept of an initial packet in the 
> first place; all packets that arrive are completely self-contained entities 
> with no relation to any other packets that might arrive before or after. It's 
> a bit like HTTP in that respect.
>
> The *application* that's using UDP may have a concept of a long-term session 
> that involved multiple packets, but UDP itself doesn't. Again looking at 
> HTTP, that's like using cookies to describe a session.
>
>> So based on that assumption, the best way for a
>> datagram to get its IP:port is to query the OS. Which in our scenario
>> is a privately networked container and so will be unreachable from the
>> outside.
>
> You have a middle layer load balancer, which will be keeping track of the 
> state of sessions going through; this is easy for TCP because the session 
> identifiers are basically in every packet. However, in UDP they are not 
> present at all - you have to be aware of the actual application using UDP; 
> you have to be explicitly aware of mosh itself in order to be able to 
> load-balance/proxy it correctly.
>
> A simple assumption for most protocols that want to have cheap lightweight 
> sessions is to assume that the source IP address stays the same throughout. 
> This happens to have been true for most of the network's history, but has 
> never been guaranteed.
>
> In the case of mosh, this is explicitly not true; the protocol *expects* that 
> the source IP address will change unannounced throughout the application's 
> session.
>
> It is this issue that you need to be looking in to. You need a proxy/LB layer 
> that looks at a UDP packet coming through, recognises that it is using SSP 
> (State Synchronization Protocol), and keeps track of which backend system the 
> packet should be forwarded to.
>
> Unfortunately, this will be very difficult; datagrams are encrypted, and your 
> proxy will not be aware of the key in use. The only way I can see to make 
> this happen will be to alter the mosh server to inform the proxy directly, 
> and that's a lot of engineering that will introduce a number of security 
> tradeoffs that might not be worthwhile.
>
> Overall, your better approach is to have a traditional "bastion host" in the 
> middle, use mosh to connect to that, and from there make inbound ssh 
> connections to your service hosts (because you can get away with ssh on an 
> internal "reliable" network, and because you're using TCP for this, you can 
> go through a load balancer if required).
>
> -jim
>
> --
> Jim Cheetham, Information Security, University of Otago, Dunedin, N.Z.
> ✉ jim.cheet...@otago.ac.nz    ☏ +64 3 470 4670    ☏ m +64 21 279 4670
> ⚷ OpenPGP: B50F BE3B D49B 3A8A 9CC3 8966 9374 82CD C982 0605

_______________________________________________
mosh-devel mailing list
mosh-devel@mit.edu
http://mailman.mit.edu/mailman/listinfo/mosh-devel

Reply via email to