I think, like me, you have often encountered the problem of having to manage Raspberry Pi devices that are deployed remotely and behind a NAT. In previous articles, I discussed solutions using SSH, SSH tunnels, and port forwarding. It is a solution I like, but it is somewhat complex to set up and not always very stable. I eventually found a tool that I find interesting and that can be deployed, called ShellHub, which makes this a bit easier to do.
ShellHub is a system made up of clients and a server. The server is a web interface that you can connect to, and through this interface you can enroll remote Raspberry Pis and create and open sessions on them.
The tool is fairly simple. It does not have millions of features, at least in its free version, but it has several advantages. First, it does the job well. Second, it is very easy to deploy. In practice, it is simply a Docker container that you deploy with a few make commands that set everything up.
Once that is done, you can add devices one by one using a command line that will be generated and can be executed on each Raspberry Pi. Setup takes a few minutes, and you can access your Raspberry Pi as if you were in SSH through this interface, without any issues.
The system is under an Apache 2.0 license. There is also a cloud version, with paid plans, of course, available on the vendor’s website.
Installation
On the server side, installation is fairly simple and very fast as soon as you have Docker. Of course, other approaches are possible, but a few commands are enough to deploy it on a server and initialize the system. At startup, there is a kind of time form that is a little annoying for an open-source project, but which is completely understandable, and then the system is rather pleasant.
$ make keygen
$ vi .env # modify the env var you want (ports as an exemple)
$ make start
Then, you just need to connect to the port you selected for HTTP and configure the solution.
Add remote raspberry PIs
Via the graphical interface, there is a button to add a device, which displays a screen like the one below. On this screen, there is simply a curl command to copy and paste on your Raspberry Pi. From that point on, the configuration will be performed automatically on it.
Once the commands have been executed, the device will appear among those that are pending. They can then be accepted, and once accepted, they appear in the list of devices. It is then possible to connect to them by clicking on them and then entering the required login information.

Feedbacks
For now, I do not really have enough hindsight on this solution. I discovered it a few hours ago and put it into use. I am very satisfied: it works well and is stable. It was very easy to deploy, it is lightweight on the Raspberry Pi side, so I am fairly satisfied.
There are a few details I missed, for example being able to name the devices. Right now, they have names that are just their MAC addresses, so it is not very easy to identify them. In my case, I use a tagging system that lets me identify them, but once you are in the terminal, it is a bit less visible.
There are many functions listed on GitHub, such as the ability to use file copy over SSH, port tunelling or replay sessions, but these functions are reserved for the Cloud plan, which is free for three devices and then becomes paid at a cost that is still around $3 per device, which is often a bit of a limit.
However, we are very happy that there is a version that can be deployed locally, that is free, and that does not have this type of limit on the number of devices that can be controlled this way.
Compared with the solution I had before, this is really much more efficient, and today it is the best solution I have used. So I am quite happy, and I will keep you updated as I continue using it.


That’s a really common struggle, I’ve spent ages wrestling with those NAT issues. SSH tunnels definitely seem like the most practical approach for a lot of situations.