DISCLAIMER: I'm REALLY new to FreeSwitch, so please take my advice with a grain of salt.
I have a similar setup (and problem) - the wiki documentation refers to it as "double nat". Like you, my FS and client are behind different NATs and I can register my remote endpoint and make calls (in my case, to the the FS demo ivr at 5000).
Since your external endpoint (spa3102) is registering, you've likely setup your sip profile correctly (ext-sip-ip, ext-rtp-ip, nat settings, etc).
1) Setup stun on your remote endpoint (spa3102 in your case)
2) Add <variable name="sip-force-contact" value="NDLB-connectile-dysfunction"/> to the directory xml file that describes your spa3102 endpoint
Option 1 worked for me right away (eyebeam in my case) and, as expected, the remote sdp had the correct (remote) IP address, since the endpoint is using stun to correctly identify its IP address to FS. However, option 2 has not made a difference (for me). Is it just me or is it strange that SIP works without stun, but RTP doesn't?
I guess I've been spoiled by the way Asterisk handles NAT and was hopeful that NDLB-connectile-dysfunction would behave similarly, so I wouldn't have to tell users to setup stun on their clients. Maybe a FS user with some experience with this type of NAT setup and these settings can help. I'd be interested in knowing how to correctly setup remote NATted endpoints without stun - or, at least, hear from someone that this setting works for them without stun.
Anyway, hope this helps you with your SPA3102.