-
Notifications
You must be signed in to change notification settings - Fork 736
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Can't use a ProxyCommand-based SSH connection #285
Comments
You're right that you can't use a ProxyCommand, but the reason is even simpler. Mosh doesn't try to resolve your hostnames -- it lets SSH do that. You can have a host alias in your SSH configuration and that will work fine. However, If you can find a way to start up the |
My use case is far more complex than inducer's, but if mosh supported ProxyCommand, it would make mosh a drop in solution. Here's a snippet of my ssh config host home host home-desktop As you can see, I'm using ssh over a https proxy to form a tunnel to my home gateway, and then using that tunnel to connect to my home desktop machine. The https proxy server that we have at my day job is unbelievably unreliable, disconnecting several times an hour, but it's the only way to punch out of the building. I use autossh to keep a psuedo-persistent connection open, but still have to deal with my existing session being interrupted. If mosh could be set up to pass its data through the ssh session used to start it (or a new one created with the same parameters), then mosh would be a viable option for me when at work. Thanks |
+1 on this, I'd greatly appreciate ProxyCommand support. My setup is simpler tho, support for something like this:
would be enough for my needs - and make mosh a drop in solution as well. |
+1 |
If you need ProxyCommand to connect a host but it can be reached from the internet via UDP, you could use a script like this. It starts mosh-server on the remote machine (using SSH and the ProxyCommand from .ssh/config), parses the output and then connects using mosh-client to the machine directly. |
I guess you could use mosh on the hop if that the only place that has access to farside. host hop host farside ProxyCommand mosh -- hop -W farsideaddr:22 (-W is sometimes better option than netcat.) Instead of using ProxyCommand to determine the address mosh could use the LD_PRELOAD environment variable, overwrite/proxy the connect system call method (to the SSH server) and use that resolution result to determine/resume the specific connection of hop. |
@grooverdan: mosh cannot be used as a ProxyCommand. That wouldn’t make any sense. The job of a ProxyCommand is passing on the raw, encrypted SSH stream; mosh doesn’t work that way. You can, however, run |
I make quite heavy use of bastions, where the destination (farside) is not guaranteed to have mosh installed. $ mosh hop ssh farside , seems to provide the benefits of mosh - but in a generic environment. I wondered if anyone has integrated this into their ssh config, to make the process simpler. |
+1 for support of something like this, if its possible. I ssh into a bunch of VMs (farside) unaccessible from the Internet via a login node (hop) which is, but my situation is the opposite of @Daviey's. I have root on the VMs and so I can install mosh there, but I can't install it on the hop. Is there any way to get the benefits of mosh in this situation? |
+1 for this, just figured out I can't use mosh from work to my server due to mosh ignoring ProxyCommand from my .ssh/config. |
I came up with a potential solution that avoids ProxyCommand, but has its own downsides. There is a LocalCommand directive that causes ssh to execute a command on the localhost when the connection is established, with the same substitution rules (e.g. %h => remote hostname) as ProxyCommand. Of course, any existing LocalCommand directive will be clobbered, but I think that one is less likely to be used. The downside is that LocalCommand requires the PermitLocalCommand=true option to be set, too, and that one enables local command execution via the !command escape sequence in ssh(1). So this has security implications -- can an exploit on the remote host use mosh-server to run arbitrary commands on the connecting host? I did a quick search, but couldn't find any history on the LocalCommand and PermitLocalCommand options, but it smells like something that was originally permitted by default, but locked down to avoid "surprise" shell execution vectors. Anyway, my changes to master are master...akalin:avoid-proxy-command , and my changes to the stable version (which I tested and works swimmingly) are mosh-stable...akalin:avoid-proxy-command-stable . |
Oh, and I guess another upside to LocalCommand is that it avoids the need for the "fake proxy" used in ProxyCommand -- one fewer process and one fewer source of buffering to worry about! |
Another possible solution that avoids both LocalCommand and ProxyCommand, but is more brittle -- run ssh with -v, and parse the verbose output to look for the line:
|
@akalin: Your Your |
For some users (such as @akalin) this is a worthwhile tradeoff, obviously. We might want to support both methods. Once OpenSSH has their library API available, using that and then examining the socket it creates may be a cleaner solution to all of this. That partly depends on how elegant that API turns out to be and how much code is needed to make it all go. There are various ssh libraries already, of course, but they vary in support for |
Another thought: if you resolve a hostname and you get a single A or AAAA record with a long TTL, and no intermediate CNAME, you could heuristically decide that LocalCommand is safe, and you might be right most of the time. |
We rely on |
I was looking at this issue because I have the same needs. |
@ekacnet, no, there’s no such risk: when using a |
@andersk I know that ssh_config is not doing the DNS resolution but ssh is doing a DNS resolution from myhost.mydomain.com to IP w.x.y.z. The thing I missed is that when using proxycommand, the ssh command is reading everything from the stdout of the proxycommand. |
@ekacnet I understand your claim, and I’m telling you that it’s incorrect. |
In our corp environment we use a ssh ProxyCommand handler to handle certain security handshake aspects. Would be great if I could just drop that into mosh also. |
Please try Mosh master if you can; I've recently added an experimental change that will help some cases (though if firewalls or NAT are involved, probably not). |
Thanks @cgull . Can you tell us what the experimental change is, and how it works? |
The change is to send a snippet of shell commands to the server that echo the |
I'm using Corkscrew to CNTLM to the web. It's messed up, but that's the nature of corporate workpsaces |
How about providing some new command line behaviour:
All resolving should be done via |
Server-side NAT traversal is tracked as #48, not here. |
This bug pretty much makes Mosh useless for me and my corporate colleagues who are trying to connect out from behind a proxy. |
@craftyguy Do you have an unusual setup that requires proxied SSH connections but allows unproxied UDP connections? If so, you’ve found the right issue and the new If not, then this issue is not what makes Mosh useless for you. This is not a catch-all issue for connecting from behind arbitrary proxy servers. Mosh requires UDP, and there’s no getting around that. (There’s some discussion about TCP support over at #13, but it’s unlikely to be implemented any time soon.) |
Inspired by https://gist.github.com/tribut/5285883, found on mobile-shell/mosh#285.
I use assh, which adds ProxyCommand to every connection, and I got it fully working with the following steps:
#!/usr/bin/env bash
mosh --experimental-remote-ip=remote "$@"
status=$?
if [ $status -eq 5 ] || [ $status -eq 127 ] || [ $status -eq 10 ]; then
ssh "$@"
fi
After that, it worked flawlessly on all my use cases, automatically falling back to ssh when mosh isn't installed on the remote. |
I can use mosh trying to connect my server, however the it says
will it be a problem with my |
I'm getting similar issues when I set RemoteCommand in .ssh/config. Is this the same issue, or should it be tracked elsewhere? |
@smaslennikov It’s similar but even more fundamental. Mosh uses the remote command to launch the remote If you want to specify the command to launch inside the Mosh session, simply provide it after |
@andersk - I have hacked up your --experimental-remote-ip option for my own use case - please see attached patch (sorry, I'm a dinosaur who doesn't understand git) |
looks like you figured it out just fine. If you apply this diff on a fork, you can submit it as a PR to the repo: https://help.github.com/en/github/getting-started-with-github/fork-a-repo |
What happened to this? EDIT: found it ... switch is called Can be closed I guess? Is it still experimental? |
It seems despite the above patch file, seamlessly switching from SSH to mosh by just saying |
The only thing that stops |
The reason Mosh uses "$user$ip" there is to ensure that both ssh and mosh talk to the same address, in the case where the hostname has multiple A/AAAA records or round-robin config or dynamically changing results. So, your proposed fix breaks a significant use case. |
...but Mosh could certainly add another variation on
|
I know I'm late but I'd like to share a small script made recently to use ssh config ProxyCommand with mosh. It relies on socat to relay mosh data via UDP: your computer <-> relay <-> mosh server script is here: https://github.com/oliv5/profile/blob/master/bin/profile/mosh-proxy.sh Requirements:
What is does:
Cons:
|
That's pretty cool and definitely worth a shot on a private server. Thank you for sharing! |
The NAT/firewall-busting problems of issue #48 notwithstanding, mosh also has issues with the "ProxyCommand" style of connecting to machines behind NATs. For specificity, here's an example from my
.ssh/config
:This is convenient, because it lets me type
ssh mauler
, and ssh will connect to linax1.cims.nyu.edu, and the 'outer' ssh run will then run over the tunnel thus set up. I understand this is hard for mosh to imitate, given UDP connections and what not, so let's assume that there's a hole poked into the firewall at port 60000 UDP on linax1.cims.nyu.edu that lets me get to mauler.The main problem then is that mosh tries to resolve
mauler
locally to find the host to connect to, which of course doesn't succeed. I'd argue that it could potentially be smarter about finding the public IP of the target host--when it starts, it is executing codes on both ends of the connection after all. Failing that, I'd like to hhave an option to specify which host is actually meant.The text was updated successfully, but these errors were encountered: