# sish installation sish is an open source serveo/ngrok alternative that can be used to open a tunnel to localhost that is accessible to the open internet using only SSH. sish implements an SSH server that can handle multiplexing of HTTP(S), TCP, and TCP Aliasing ([more about this can be found in the README](https://github.com/antoniomika/sish/blob/main/README.md)) This tutorial will teach you how to: - Setup an instance in Google Cloud using the [free tier](https://cloud.google.com/free) - Add and modify authentication for users - Access sish from a remote computer ## Project selection You first need to select a project to host the resources created in this tutorial. I'd suggest creating a new project at this time where your sish instance will live. ## Access Google Cloud Shell ## Create the instance running the container Here is a command to create the instance running the sish container. This will start the container on a hardened [Container Optimized OS](https://cloud.google.com/container-optimized-os/docs) and start the service. This is just a starting command that runs sish on port `2222`, `80`, and `443`. If you accept the [Let's Encrypt TOS](https://letsencrypt.org/repository/), you can enable automatic SSL cert loading. This command does _NOT_ include authentication and it is up to you to properly tune these parameters based on the documentation [here](https://github.com/antoniomika/sish#cli-flags). Make sure to update `YOURDOMAIN` to the actual domain you own. You will also need to setup the DNS records as described below. Also feel free to change the `--zone` used for these commands. ```bash gcloud compute instances create-with-container sish \ --zone="us-central1-a" \ --tags="sish" \ --container-mount-host-path="host-path=/mnt/stateful_partition/sish/ssl,mount-path=/ssl" \ --container-mount-host-path="host-path=/mnt/stateful_partition/sish/keys,mount-path=/keys" \ --container-mount-host-path="host-path=/mnt/stateful_partition/sish/pubkeys,mount-path=/pubkeys" \ --container-image="antoniomika/sish:latest" \ --machine-type="e2-micro" \ --container-arg="--domain=YOURDOMAIN" \ --container-arg="--ssh-address=:2222" \ --container-arg="--http-address=:80" \ --container-arg="--https-address=:443" \ --container-arg="--https=true" \ --container-arg="--https-certificate-directory=/ssl" \ --container-arg="--authentication-keys-directory=/pubkeys" \ --container-arg="--private-keys-directory=/keys" \ --container-arg="--bind-random-ports=false" \ --container-arg="--bind-random-subdomains=false" \ --container-arg="--bind-random-aliases=false" \ --container-arg="--tcp-aliases=true" \ --container-arg="--service-console=true" \ --container-arg="--log-to-client=true" \ --container-arg="--admin-console=true" \ --container-arg="--verify-ssl=false" \ --container-arg="--https-ondemand-certificate=false" \ --container-arg="--https-ondemand-certificate-accept-terms=false" \ --container-arg="--https-ondemand-certificate-email=certs@YOURDOMAIN" \ --container-arg="--idle-connection=false" \ --container-arg="--ping-client-timeout=2m" ``` ## Network Setup ### Open the firewall to allow access to all instance ports ```bash gcloud compute firewall-rules create allow-all-tcp-sish \ --action="allow" \ --direction="ingress" \ --rules="tcp" \ --source-ranges="0.0.0.0/0" \ --priority="1000" \ --target-tags="sish" ``` ### Adding a DNS record Get the external IP address of your machine and create two DNS records - An `A` record for YOURDOMAIN pointing it to the output below - An `A` record for *.YOURDOMAIN pointing it to the output below ```bash gcloud compute instances describe sish \ --zone="us-central1-a" \ --format='get(networkInterfaces[0].accessConfigs[0].natIP)' ``` To confirm that the DNS records were created appropriately, you can run:\ `dig @1.1.1.1 abcxyz.YOURDOMAIN` and `dig @1.1.1.1 YOURDOMAIN`. Both should get an answer with `status: NOERROR`. ## Using sish ### Try using SSH to connect to the sish service ```bash ssh -p 2222 -R foo:80:httpbin.org:80 YOURDOMAIN ``` ### Access the address sish gave you ```bash curl -vvv http://foo.YOURDOMAIN/anything ``` ## Advanced usage ### Login into your new machine ```bash gcloud compute ssh sish --zone="us-central1-a" ``` ### Adding SSH keys for when you enable auth ```bash echo "ssh_public_key_here" >> /mnt/stateful_partition/sish/pubkeys/your_user.keys ``` ## Tear it down ### First the instance ```bash gcloud compute instances delete sish \ --zone="us-central1-a" ``` ### Then the firewall rule ```bash gcloud compute firewall-rules delete allow-all-tcp-sish ```