If you have a redhat/centos/fedora based distro the package iftop is available in the EPEL repositories, which gives a per connection breakdown, which will enable you to determine whether its one particular host that is causing the problem.
You probably want the command "iftop -P -N" which displays the ports in addition to the hosts as in the screenshot below.
Some details

Also appears in the deb/ubuntu/gentoo repos somewhere...
sudo aptitude install iftop
yum install iftop
emerge iftop
With regard to your 3 questions;
1) How many TCP connections are active for each listening port
netstat -ant | egrep 'ESTABLISHED' | awk '{print $4}' | \
awk -F: '{print $NF}' | sort -n | uniq -c
5 22
1 389
1 766
1 778
1 812
1 838
1 4369
that is a pretty basic off the top of my head, for chewing the output of netstat, you can change the grep to add or remove various states ...
2) How many UDP packets were received on a particular port in a set intreval
3) Which IP address has made the most connections to my server in the last x hours
In both these cases, you are going to need to collect data, like you suggested the simplest way is some sort of iptables -j LOG rule. The first answer in this question gives some examples of that;
http://stackoverflow.com/questions/349576/linux-retrieve-per-interface-sent-received-packet-counters-ethernet-ipv4-ipv
For more general visualization tools , you might consider iptraf or ntop which generate more comprehensive reports and data.
There is a fairly comprehensive list of network monitoring tools here;
http://www.ubuntugeek.com/bandwidth-monitoring-tools-for-linux.html