There seem to be a plethora of websites offering free DNS services nowadays... ZoneEdit, Granite Canyon, and FreeDNS just to name a few. Just do a google search on "free DNS services". These services offer web based administration of your DNS, and most offer free dynamic DNS, which is nice if you are a home user.
I ended up going with EveryDNS. They provide a dynamic DNS perl client (eDNS.pl) you can use to keep their nameservers up to date with your IP address. If you are behind a firewall (and you probably are), you first need to figure out what your real IP address is, and then use this with their perl script. To do this I simply use wget in conjunction with the very useful site www.showmyip.com. This site will offer up your IP address in xml, html, rss, or simply plain ole text format. I then use head and cut to grab my IP and pass it off to eDNS. Sed would probably be easier. My crontab entry looks like this:
55 */6 * * * /usr/local/bin/eDNS.pl -u USER -p PASS -ip $(wget -q -O - http://www.showmyip.com/simple/ | head -1 | cut -d ' ' -f 1) -d DOMAIN
This updates my IP address every 6 hours.