You should ask the support folks about this, but I doubt your particular usage is intended or allowed per the rules, since what you want to do is basically keep a process running 24/7 and open a tcp port on the server in listening mode. Sporadically this shouldn’t be impossible (though I have a feeling the server’s iptables firewall might have something to say about that).
But just in case you choose to disregard that advice, here’s the steps :
ssh -g -Rportonserver:127.0.0.1:22 email@example.com
on your tower behind the NAT
ssh firstname.lastname@example.org:portonserver from laptop
(this would assume DreamHost missed closing unauthorized ports on the server via iptables, WHICH ANY SANE ADMIN WOULD DO), or
ssh -Lauxiliarylocalport:127.0.0.1:portonserver email@example.com &
(and again locally on your laptop)
the -g parameter in the first SSH opens up the port for external connects (other than localhost), if those are not filtered. Otherwise the socket will only listen on lo no the DH server.
This is all much indirection without any real gain. If at all possible, try to set up a port forward on your NAT to your local server and use dyndns.org or some such for the IP address – in that case no SSH tunneling is necessary. If you do not have administrative access to the NAT box, you could give it a XMPP client (those are easy to whip up in Perl), have it connect to your favourite XMPP/Jabber-Server waiting for commands, and just send it a “hey, connect to the laptop at ip address XXX on port YY please”-command via Jabber, and your tower will call you back through the NAT (this only really applies if you know a bit about coding, but really, a simple XMPP listening client in Perl is quite easy to create). Dreamhost offers you an XMPP server, btw