Skip to content

suutaku/sshx

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SSHX

Build Status Go Report Card

SSH P2P tunneling service. An enhanced version of https://github.com/nobonobo/ssh-p2p.git.

Connection sequence

.-----------.         .------.                  .----------------.                    .------.    .--------------.
|Impl Dialer|         |Node A|                  |Signaling server|                    |Node B|    |Impl Responser|
'-----------'         '------'                  '----------------'                    '------'    '--------------'
      |                  |                              |                                |               |        
      |connection request|                              |                                |               |        
      |----------------->|                              |                                |               |        
      |                  |                              |                                |               |        
      |                  |send signaling request (OFFER)|                                |               |        
      |                  |----------------------------->|                                |               |        
      |                  |                              |                                |               |        
      |                  |                              |         dispatch OFFER         |               |        
      |                  |                              |------------------------------->|               |        
      |                  |                              |                                |               |        
      |                  |                              |send signaling response (ANWSER)|               |        
      |                  |                              |<-------------------------------|               |        
      |                  |                              |                                |               |        
      |                  |       dispatch ANWSER        |                                |               |        
      |                  |<-----------------------------|                                |               |        
      |                  |                              |                                |               |        
      | wrap connection  |                              |                                |               |        
      |<-----------------|                              |                                |               |        
      |                  |                              |                                |               |        
      |                  |              establish connection (DATA CHANNEL)              |               |        
      |                  |-------------------------------------------------------------->|               |        
      |                  |                              |                                |               |        
      |                  |                              |                                |wrap connection|        
      |                  |                              |                                |-------------->|        
      |                  |                              |                                |               |        
      |                  |                        do response                            |               |        
      |<-------------------------------------------------------------------------------------------------|        
.-----------.         .------.                  .----------------.                    .------.    .--------------.
|Impl Dialer|         |Node A|                  |Signaling server|                    |Node B|    |Impl Responser|
'-----------'         '------'                  '----------------'                    '------'    '--------------'

Backend protocol

The server is not stable and just for testing. Please use your own signaling server on production.

Install

Requirements

https://github.com/go-vgo/robotgo #Requirements

Signaling server

go get -u github.com/suutaku/sshx/cmd/signaling

SSHX

go get -u github.com/suutaku/sshx/cmd/sshx

Install as a system daemon

Mac OSX & Linux

git clone https://github.com/suutaku/sshx
cd sshx
sudo ./build.sh install ## for sshx
sudo ./build.sh install signaling ## both sshx and signaling server

Windows

I don't have a Windows device so I don't know how to create and test install scripts, maybe someone can write a script for Windows users.

Configuration

Configure file will created for the first time at the path: $HOME/.sshx_config.json. You can also set the root path of SSHX with SSHX_HOME environment value. Default configure as below:

{
  "id": "dd88229c-ad13-4210-a1ad-3d59f12e0655",
  "locallistenaddr": "127.0.0.1:2222",
  "localsshaddr": "127.0.0.1:22",
  "rtcconf": {
    "iceservers": [
      {
        "urls": [
          "stun:stun.l.google.com:19302"
        ]
      }
    ]
  },
  "signalingserveraddr": "http://signalingserver.xxxxx.com:8990"
}
  • locallistenaddr: SSHX listening address.
  • localsshaddr: SSHD listening address of server.
  • rtcconf: STUN server configure.
  • signalingserveraddr: Signaling server address.

Usage

Signaling server

Specify server listening port by environment variable PORT, default 8080.

export SSHX_SIGNALING_PORT=[port you want] #default port is 8080
signaling

SSHX

  • Start sshx:
    Usage: sshx COMMAND [arg...]
    

    a webrtc based ssh remote toolbox

    Commands:
    daemon launch a sshx daemon config list configure informations connect connect to remote host copy-id copy public key to server copy copy files or directory from/to remote host proxy start proxy status get status fs sshfs filesystem

    Run 'sshx COMMAND --help' for more information on a command.

  • Daemon
    sshx daemon

    Note: Before you run any command of sshx, you must run sshx as a daemon first.

  • List configure informations
    sshx list
  • Connect a remote device with ID or IP(domain)
    Usage: sshx connect [ -X ] [ -i ] [ -p ] ADDR
    
    connect to remote host
    
    Arguments:
      ADDR                   remote target address [username]@[host]:[port]
    
    Options:
      -X, --x11              using X11 opton, default false
      -i, --identification   a private path, default empty for ~/.ssh/id_rsa
      -p                     remote host port (default "22")
  • Copy a file or directory just like ssh does
    Usage: sshx copy FROM TO
    
    copy files or directories to remote host
    
    Arguments:
      FROM                   file or directory path which want to coy
      TO                     des path
  • Proxy
    Usage: sshx proxy COMMAND [arg...]
    
    manage proxy
                   
    Commands:      
      start        start a proxy
                   
    Run 'sshx proxy COMMAND --help' for more information on a command.
  • VNC

    sshx contained a noVNC client which write with Javascript. To use client just access http://vnc.sshx.wz (not working with VPN environment) or http://127.0.0.1 and input device ID in setting menu.

  • Copy ID
    Usage: sshx copy-id ADDR
    
    copy public key to server
                   
    Arguments:     
      ADDR         remote target address [username]@[host]:[port]
  • SSHFS
    Usage: sshx fs COMMAND [arg...]
    
    sshfs filesystem
                   
    Commands:      
      mount        mount a remote filesystem
      unmount      unmount a remote filesystem
                   
    Run 'sshx fs COMMAND --help' for more information on a command.
  • Status

    Show current connections

Appliction

Using sshx, you can write your own NAT-Traversal applications by implement Impl at github.com/suutaku/sshx/pkg/impl:

type Impl interface {
	// Set implementation specifiy configure
	Init(ImplParam)

  // Return the application code, see pkg/types/types.go
	Code() int32
	// Writer of dialer
	DialerWriter() io.Writer
	// Writer of responser
	ResponserWriter() io.Writer
	// Reader of dialer
	DialerReader() io.Reader
	// Reader of responser
	ResponserReader() io.Reader
	// Response of remote device call
	Response() error
	// Call remote device
	Dial() error
	// Close Impl connection
	Close()
	// Set pairId dynamiclly
	SetPairId(id string)
}

Basically, Impl can acts as a Dialer or Responser. A Dialer sends a connection request to the local node to tell it which application will used for this connection.

The local node makes a P2P connection to the target device and the Responser at the target device responds to your request. See more at pkg/impl/impl_ssh.go.

Features

  • Connect devices directly like the SSH client does
  • Private key login
  • X11 forwarding
  • Connect devices behind NAT
  • Copy file or directory like scp does
  • Custom device ID
  • Custom signaling server
  • Multiple connection with one remote device
  • A simple signaling server implementation
  • Pure go (due the github.com/go-vgo/robotgo)
  • Lunux system service supporting
  • VS Code SSH remote supporting (use proxy way due the VS Code not being an open source project)
  • VNC supporting (both vnc server and client)
  • SSH-FS supporting