I figured out my problem.
Here is the log of a working psql over ssh.
ssh -N -f -L 5430:127.0.0.1:5432 216.38.48.94 psql --host localhost
--port 5430 --username username --dbname template1 Password: Welcome to
psql, the PostgreSQL interactive terminal. ... template1=#
The following attempt failed because 216.38.48.94 is the IP address of
the Cisco DSL modem. The Postgresql server has a private address and
the Cisco is forwarding the ssh port to the Postgresql IP address. The
working ssh tunnel is 5430:127.0.0.1:5432, using the loopback address
to refer to the system on the end of the ssh connection.
ssh -N -f -L 5430:216.38.48.94:5432 username@216.38.48.94 psql --host
localhost --port 5430 --username username --dbname template1 channel 1:
open failed: connect failed: Connection timed out psql: could not
receive server response to SSL negotiation packet: Success