Setting up a network between machines behind dynamically assigned IPs

I have 3 separate networks with different subnets in different locations, all behind dynamically assigned IPs, with 2 connecting via G5, which means their IP address appears to be that of the network provider. Like this:

  • location A is on 192.168.1.* behind a dynamic address
  • location B is on 192.168.2.* behind a dynamic address and on a private address of the G5 operator
  • location C is on 192.168.2.* behind a dynamic address and on a private address of a different G5 operator

I also have one central machine with a permanent IP address.

How would I go about setting up things so that I can connect to anything from anywhere (like, print in location A when I am in location B)?

SSH tunnels are set up already, and I want to use no external service if possible (like ddns for example)

Is that possible without going nuts and mapping every port to another and tunneling like crazy or similar things?