Skip to content

Latest commit

 

History

History
268 lines (198 loc) · 9.86 KB

README.md

File metadata and controls

268 lines (198 loc) · 9.86 KB

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