I got a freeswitch that is behind nat and got three profiles.

External (all calls are going through a proxy): 
    <param name="rtp-ip" value="$${local_ip_v4}"/>
    <param name="sip-ip" value="$${local_ip_v4}"/>
    <param name="ext-rtp-ip" value="$${external_rtp_ip}"/>
    <param name="ext-sip-ip" value="$${external_sip_ip}"/>
    <param name="local-network-acl" value="localnet.auto"/>

Internal (phones on the same lan as FS)
    <param name="rtp-ip" value="$${local_ip_v4}"/>
    <param name="sip-ip" value="$${local_ip_v4}"/>
    <param name="local-network-acl" value="localnet.auto"/>

Wan (phones that are not in the same LAN, connecting from internet)
    <param name="rtp-ip" value="$${local_ip_v4}"/>
    <param name="sip-ip" value="$${local_ip_v4}"/>
    <param name="ext-rtp-ip" value="$${external_rtp_ip}"/>
    <param name="ext-sip-ip" value="$${external_sip_ip}"/>
    <param name="local-network-acl" value="localnet.auto"/>

The problem is that phones registered on the internal profile gets RECOVERY_ON_TIMER_EXPIRE error after 40-60 seconds. Audio works fine in all profiles.

Log from a call:

I'm running freeswitch with the -nonat option.