why do my ssh sessions freeze after some time?

Your NAT is dropping your TCP socket after a period of inactivity.

Your ssh client can optionally send periodic noops to the server, thereby eliminating this problem. To do this, add this to your ~/.ssh/config:

Host *
  ServerAliveInterval 60

Alternatively, re-configure your NAT to not expire items out of its state table as quickly as it is now.

In addition to the above, you should be using a terminal multiplexer for your sessions - something like GNU Screen or tmux. With either of those, you can recover your session in the event of getting disconnected.