Why not just use a dynamic DNS service like no-ip?
It works like this. You sign up with a service (some are free if you don't have heavy traffic) and they give you a domain name; for example, reapersoul.zapto.org. Then you run in your server a program that they give you that periodically checks the current IP and, when it changes, connects to the DDNS service and they update the IP associated with your domain name.
Your client then, rather than specifying the IP it connects to, just specifies the domain name.
A DDNS doesn't route traffic through itself, it only performs the exact same function a normal DNS performs. That is, it resolves domain names to IP addresses. Once the client has resolved the IP address, it can connect directly to the server, just as if you had specified the IP address.