196 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			196 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # Telebit Relay
 | |
| 
 | |
| Friends don't let friends localhost™
 | |
| 
 | |
| A server that works in combination with [Telebit Remote](https://git.coolaj86.com/coolaj86/telebit.js)
 | |
| to allow you to serve http and https from any computer, anywhere through a secure tunnel.
 | |
| 
 | |
| | Sponsored by [ppl](https://ppl.family) | **Telebit Relay** | [Telebit Remote](https://git.coolaj86.com/coolaj86/telebit.js) |
 | |
| 
 | |
| Features
 | |
| ========
 | |
| 
 | |
| * [x] Expose your bits even in the harshest of network environments
 | |
|   * [x] NAT, Home Routers
 | |
|   * [x] College Dorms, HOAs
 | |
|   * [x] Corporate Firewalls, Public libraries, Airports
 | |
|   * [x] and even Airplanes, yep
 | |
| * [x] Automated HTTPS (Free SSL)
 | |
| 
 | |
| Install
 | |
| =======
 | |
| 
 | |
| Mac & Linux
 | |
| -----------
 | |
| 
 | |
| Open Terminal and run this install script:
 | |
| 
 | |
| ```bash
 | |
| curl -fsSL https://get.telebit.cloud/relay | bash
 | |
| ```
 | |
| 
 | |
| Of course, feel free to inspect the install script before you run it.
 | |
| 
 | |
| This will install Telebit Relay to `/opt/telebit-relay` and
 | |
| put a symlink to `/opt/telebit-relay/bin/telebit-relay` in `/usr/local/bin/telebit-relay`
 | |
| for convenience.
 | |
| 
 | |
| You can customize the installation:
 | |
| 
 | |
| ```bash
 | |
| export NODEJS_VER=v10.2
 | |
| export TELEBIT_RELAY_PATH=/opt/telebit-relay
 | |
| curl -fsSL https://get.telebit.cloud/relay
 | |
| ```
 | |
| 
 | |
| That will change the bundled version of node.js is bundled with Telebit Relay
 | |
| and the path to which Telebit Relay installs.
 | |
| 
 | |
| You can get rid of the tos + email and server domain name prompts by providing them right away:
 | |
| 
 | |
| ```bash
 | |
| curl -fsSL https://get.telebit.cloud/relay | bash -- jon@example.com telebit-relay.example.com
 | |
| ```
 | |
| 
 | |
| Windows & Node.js
 | |
| -----------------
 | |
| 
 | |
| 1. Install [node.js](https://nodejs.org)
 | |
| 2. Open _Node.js_
 | |
| 2. Run the command `npm install -g telebit-relay`
 | |
| 
 | |
| **Note**: Use node.js v8.x or v10.x
 | |
| 
 | |
| There is [a bug](https://github.com/nodejs/node/issues/20241) in node v9.x that causes telebit-relay to crash.
 | |
| 
 | |
| Manually Install
 | |
| -----------
 | |
| 
 | |
| ```bash
 | |
| git clone https://git.coolaj86.com/coolaj86/telebit-relay.js.git telebit-relay
 | |
| 
 | |
| # we're very picky to due to bugs in various versions of v8, v9, and v10
 | |
| export NODEJS_VER="v10.2.1"
 | |
| 
 | |
| # We can keep everything self-contained
 | |
| export NPM_CONFIG_PREFIX=/opt/telebit-relay
 | |
| export NODE_PATH=/opt/telebit-relay/lib/node_modules
 | |
| 
 | |
| curl -fsSL https://bit.ly/node-installer | bash -s -- --no-dev-deps
 | |
| 
 | |
| pushd /opt/telebit-relay
 | |
|   bin/node bin/npm install
 | |
|   rsync -a examples/telebit-relay.yml etc/telebit-relay.yml
 | |
|   rsync -a dist/etc/systemd/system/telebit-relay.service /etc/systemd/system/telebit-relay.service
 | |
| popd
 | |
| 
 | |
| # IMPORTANT: Season the config file to taste
 | |
| # IMPORTANT: change your email address and domain
 | |
| edit /opt/telebit-relay/etc/telebit-relay.yml
 | |
| 
 | |
| adduser --home /opt/telebit-relay --gecos '' --disabled-password telebit >/dev/null 2>&1
 | |
| sudo chown -R telebit:telebit /opt/telebit-relay/
 | |
| 
 | |
| systemctl daemon-reload
 | |
| systemctl restart telebit-relay
 | |
| 
 | |
| systemctl status telebit-relay
 | |
| journalctl -xefu telebit-relay
 | |
| ```
 | |
| 
 | |
| Usage
 | |
| ====
 | |
| 
 | |
| ```bash
 | |
| telebit-relay --config /opt/telebit-relay/etc/telebit-relay.yml
 | |
| ```
 | |
| 
 | |
| Options
 | |
| 
 | |
| `/opt/telebit-relay/etc/telebit-relay.yml:`
 | |
| ```
 | |
| email: 'jon@example.com'       # must be valid (for certificate recovery and security alerts)
 | |
| agree_tos: true                # agree to the Telebit, Greenlock, and Let's Encrypt TOSes
 | |
| community_member: true         # receive infrequent relevant but non-critical updates
 | |
| telemetry: true                # contribute to project telemetric data
 | |
| secret: ''                     # JWT authorization secret. Generate like so:
 | |
|                                # node -e "console.log(crypto.randomBytes(16).toString('hex'))"
 | |
| servernames:                   # hostnames that direct to the Telebit Relay admin console
 | |
|   - telebit-relay.example.com
 | |
|   - telebit-relay.example.net
 | |
| vhost: /srv/www/:hostname      # securely serve local sites from this path (or false)
 | |
|                                # (uses template string, i.e. /var/www/:hostname/public)
 | |
| greenlock:
 | |
|   store: le-store-certbot      # certificate storage plugin
 | |
|   config_dir: /opt/telebit-relay/etc/acme    # directory for ssl certificates
 | |
| ```
 | |
| 
 | |
| Security
 | |
| ========
 | |
| 
 | |
| The bottom line: As with everything in life, there is no such thing as anonymity
 | |
| or absolute security. Only use Telebit Relays that you trust or self-host. :D
 | |
| 
 | |
| Even though the traffic is encrypted end-to-end, you can't just trust any Telebit Relay
 | |
| willy-nilly.
 | |
| 
 | |
| A man-in-the-middle attack is possible using Let's Encrypt since an evil Telebit Relay
 | |
| would be able to complete the http-01 challenges without a problem
 | |
| (since that's where your DNS is pointed when you use the service).
 | |
| 
 | |
| Also, the traffic could still be copied and stored for decryption is some era when quantum
 | |
| computers exist (probably never).
 | |
| 
 | |
| Why?
 | |
| ====
 | |
| 
 | |
| We created this for anyone to use on their own server or VPS,
 | |
| but those generally cost $5 - $20 / month and so it's probably
 | |
| cheaper to purchase data transfer, which is only $1/month for
 | |
| most people.
 | |
| 
 | |
| In keeping with our no lock-in policy, we release a version of
 | |
| the server for anyone to use independently.
 | |
| 
 | |
| TODO show how to do on
 | |
| 
 | |
| 	* Node WS Tunnel (zero setup)
 | |
| 	* Heroku (zero cost)
 | |
| 	* Chunk Host (best deal per TB/month)
 | |
| 
 | |
| Useful Tidbits
 | |
| ===
 | |
| 
 | |
| ## As a systemd service
 | |
| 
 | |
| `./dist/etc/systemd/system/telebit-relay.service` should be copied to `/etc/systemd/system/telebit-relay.service`.
 | |
| 
 | |
| The user and group `telebit` should be created.
 | |
| 
 | |
| ## Use privileged ports without sudo
 | |
| 
 | |
| ```bash
 | |
| # Linux
 | |
| sudo setcap 'cap_net_bind_service=+ep' $(which node)
 | |
| ```
 | |
| 
 | |
| API
 | |
| ===
 | |
| 
 | |
| The authentication method is abstract so that it can easily be implemented for various users and use cases.
 | |
| 
 | |
| ```
 | |
| // bin/telebit-relay.js
 | |
| state.authenticate()                  // calls either state.extensions.authenticate or state.defaults.authenticate
 | |
|                                       // which, in turn, calls Server.onAuth()
 | |
| 
 | |
| state.extensions = require('../lib/extensions');
 | |
| state.extensions.authenticate({
 | |
|   state: state                        // lib/relay.js in-memory state
 | |
| , auth: 'xyz.abc.123'                 // arbitrary token, typically a JWT (default handler)
 | |
| })
 | |
| 
 | |
| // lib/relay.js
 | |
| Server.onAuth(state, srv, rawAuth, validatedTokenData);
 | |
| ```
 |