PS. I actually ONLY port forward the ssh port (again high number on the Internet side going to port 22 on the Mac).
If I want to allow other protocols, such as AFP, or VNC/Screen Sharing I setup an ssh tunnel. From the remote Mac, I issue:
ssh -p 23456 -L 22548:localhost:548 -L 22590:localhost:5900 <My.Routers.IP.Addr>
This will establish an ssh connection using the 23456 port forwarded port into my Mac at home.
the -L setups an ssh tunnel.
22548:localhost:548 establishes an AFP (Apple FileSharing Protocol) local port 22548 through an ssh tunnel to the Mac in my home and directs the other side of the tunnel into the standard AFP port 548.
To use this tunnel, on the Mac I'm sitting in front of, I just use a Terminal session command:
open afp://localhost:22548
and this will allow me to mount a volume from the Mac in my home onto the Mac I'm sitting in front of.
=L 22590:localhost:5900 creates an ssh tunnel for VNC/Screen Sharing (5900 is the VNC/Screen Sharing port). To use this tunnel, I use the a Terminal session command:
open vnc://localhost:22590
I can create an ssh tunnel for any TCP based protocol as long as I know the port numbers I need to connect with _AND_ if I can tell the service to use my funky localhost:nnnnn connection address, where nnnnn is the port number I'm using on the local system as the entry to the tunnel.