The external server certainly give options but I'd like to explore direct connections first.
They're faster and generally more reliable. They do however require an IP to connect and the routing at the other end to get your connection from router to server. You say you don't have these but I think you might be overlooking options.
I find it hard (not impossible) to believe that you have no legal IP. Most home connections have one. The router gets it and uses NAT and DHCP to give you private internal IPs. While at home you can ask Google for your IP address and it should tell you.
Lots of home connections use dynamic IP addressing meaning your IP will change on a timetable determined by your ISP. You can work around that by using one of many dynamic DNS options.
The routing is harder. Traditionally I would ask you to forward a port by logging into the router. You say you can't do that... So what about UPNP? A lot of routers have this turned on by default and this essentially allows you to do the same thing. You lease a port from the router. Setting this up in Ubuntu is fairly simple:
sudo apt-get install miniupnpc
upnpc -a <local_ip> 22 22 TCP
Then external machines can access your SSH server through your public IP.
Failing that, you could create a persistent connection from your home computer to the external server that tunnelled back a port to a SSH server running on your home computer. Then people could connect to you home through your server. I've called this reverse port tunnelling.
- From home:
ssh -L 22:0.0.0.0:2200 serveruser@server
to expose your home SSH to the server. You'll probably also need to edit /etc/ssh/sshd_config
and turn on GatewayPorts
(see this)
- Then from anywhere
ssh -D -p2200 homeuser@server
Of course you may find that the connection from home to server stalls or times out. There are various options for working around that.
With either option you are exposing a seriously big door into your system. Please practise safe computing and follow my tutorial on making SSH more secure.