Let me preface this by saying that I'm not a networking guy. I am outside my element on this project, so any advice, suggestions, or buzzwords are appreciated.
I want to design a network where multiple remote clients can connect to one another over the internet using a cellular connection.
In my scenario, suppose I have 3 remote client PCs: Client001, Client002, and Client003. Each client PC is behind its own 3G cellular router w/ SIM card. I want the PCs to be able to see one another across the internet and at a minimum be able to ping one another by IP address.
Out of the box, I believe each cellular router’s IP address is "private" within the cellular network. In other words, I can’t simply ping the cellular IP address of Client001’s router from a PC behind Client002 and expect a reply. To further complicate matters, each router’s cellular IP address is dynamically assigned – it seems to change every time the router restarts. So even if I could ping it, it’s not static.
I believe I can purchase a public/static IP address from the cellular provider for a nice price, but I wonder if this problem can’t be solved by establishing a VPN between all my clients…
This particular make/model of router supports acting as an OpenVPN client.
At a very high-level, if I stand up an OpenVPN server (e.g. Untangle, Access, etc.), configure my cellular routers to act as OpenVPN clients and point them at the server (thus establishing a VPN), this should solve my connectivity problem, right?
As long as the client PCs are connected to the cellular routers which are connected to the VPN, all of my clients should be able to communicate with one another using some type of internal/local IP address established by the VPN, right?
If all of this holds true, how are the IP addresses of the client PCs (behind the routers on the VPN) determined? Are they static or dynamic? If possible, I would like to be able to reliably access a specific client PC by IP address even across router/client PC restarts. Can this be accomplished?
Here's a preliminary sketch based on my example:
