For my personal opinion I use
IPTables on Linux when I can. It's really powerful and supports QoS as
well as traffic shaping and I can do diagnostics with it.
Similarly, I use pf on OpenBSD (for the same reasons), on a Soekris
(a little PC that "looks like" a router). This is a similar idea to
John's mention
of the Linksys WRT54G-family but IMHO much easier to set up (it
loads from a CF card which you can easily load up on BSD or Linux;
there's even (somebody told me) a Linux+Asterisk distro specifically
for this setup.