Search code examples
linuxsshportforwardingunison

How to sync when you can't connect directly to the remote computer


I have my home computer A and a work computer C that I want to synchronise using unison. In the middle is a work computer B. A can communicate with B and B can communicate with C directly but A and C can't directly connect to each other. In fact the communication diagram looks like A->B<->C. That is A can connect to B but B can't connect to A.

To give an example how I use this setup, I currently do the following if I want to ssh from A to C

ssh -t -X -C me_B@B ssh -X me_C@C

How can I run unison from A and sync with C, maybe using ssh port forwarding?

To make it a little clearer, C has unfiltered outgoing connectivity to the Internet. B has unfiltered in and outgoing connectivity to both C and the Internet. A is my home computer.


Update

The following command line works for me to at least copy files from A to C

scp -oProxyCommand="ssh me_B@B nc -v %h %p" foo/* me_C@C:foo

Is there some way to use this idea to get unison to work?


Solution

  • Yes, ssh port forwarding can be used for that. Use the following command on A if you want to forward ssh on port 22 at C to the local port 3000 (for example):

    # Create the tunnel
    ssh -L 3000:C:22 userB@B -N
    

    After you have issued the command, you can login into C from A using:

    # Connect using the tunnel
    ssh -p 3000 userC@localhost
    

    Note: During the discussion below it turned out, that in OP's network, the connection trough the tunnel can only be established using the following command:

    ssh -p 3000 -l userC localhost
    

    Note that I'm using -l userC instead of userC@.


    Now you can use unison like this:

    unison directory ssh://userC@localhost:3000 directory