I maintain a list of solutions to this problem:
https://github.com/anderspitman/awesome-tunneling.
There are a surprising number of tools that all do essentially the same thing, and it's often hard to tell how they're different from the other 30 options.
Making a really good solution to this problem has been the focus of my free time for the past month since I wrote this comment[0].
The project I'm working on:
* 100% open source and MIT licensed
* Strive for simplicity throughout. Very few dependencies. No config files, and only a single CLI parameter required to run the server.
* Clients can be remote controlled by the server, and each client can open an arbitrary number of tunnels. ie you don't have to start a separate ngrok process for each tunnel. Just set up the client on each machine you want to tunnel out of and forget about it. Everything is controlled
through a simple web UI (or REST api).
* Automate as much as possible. Tunnel creation and Let's Encrypt are already working. Eventually you'll be able to add an API token from your DNS provider and that'll be automated as well.
It's not quite ready (launch planned for 31 Oct 2020), but you can check it out here: https://boringproxy.io/
[0]: https://news.ycombinator.com/item?id=24475946