For starters, try installing watchdog (sudo apt-get install watchdog). In /etc/watchdog.conf uncomment the ping and set it up to ping your gateway. That should at least help you not have to go and unplug the machine manually although it does not help with the root cause.
Note on watchdog - I would start watchdog manually using a cron script that sleeps for 30-45 seconds before launching watchdog. This will prevent you from getting into an endless reboot loop.
Here's my watchdog.conf:
interface = wlan0
ping = 192.168.0.1
#ping = 172.26.1.255
#file = /var/log/messages
#change = 1407
watchdog-timeout = 15
# Uncomment to enable test. Setting one of these values to '0' disables it.
# These values will hopefully never reboot your machine during normal use
# (if your machine is really hung, the loadavg will go much higher than 25)
max-load-1 = 24
#max-load-5 = 18
#max-load-15 = 12
# Note that this is the number of pages!
# To get the real size, check how large the pagesize is on your machine.
#min-memory = 1
repair-binary = /home/weather/weather/util/network_repair.sh
repair-timeout = 60
#test-binary =
#test-timeout =
watchdog-device = /dev/watchdog
# Defaults compiled into the binary
#temperature-device =
#max-temperature = 120
# Defaults compiled into the binary
#admin = root
admin =
interval = 10
logtick = 500
log-dir = /var/log/watchdog
# This greatly decreases the chance that watchdog won't be scheduled before
# your machine is really loaded
realtime = yes
priority = 1
# Check if syslogd is still running by enabling the following line
#pidfile = /var/run/syslogd.pid
Here's the script that starts it:
#Launching watchdog
sleep 30
date
echo "Launching watchdog"
sudo modprobe bcm2708_wdog
sudo watchdog -v
The script is called by cron. Use crontab -e to set it up. Add your version of the line below to your crontab file.
@reboot /home/username/yourscript.sh >> /log_file_path/log_file_name.log 2>&1