As an alternative to using @Thomas Pornin's answer (where he suggested to use SSH) you can use the Azure service bus to maintain a transparent connection from a local port to a remote server.
Port Bridge
This project allows several NAT'ed servers to access several NAT'ed clients across the internet over a single service bus connection.
It's a pretty smart implementation that will really get you thinking. Below is the source
http://blogs.msdn.com/b/clemensv/archive/2009/11/18/port-bridge.aspx
... and another explanation of the same.
http://brentdacodemonkey.wordpress.com/2010/05/05/azure-appfabric-%e2%80%93-a-bridge-going-anywhere/
Also, there is a related project called "SocketShifter" on codeplex: http://socketshifter.codeplex.com/ Although the codeplex site advises using portbridge, I do see check ins as of (Aug 2010) and not sure which one is more up-to-date. It may be worth investigating.