Let's say we have two peers - A & B - trying to establish a WebRTC peer connection through Symmetric NAT. They exchanged the ICE candidates via signalling.
A's public address: IP_A : Port_A
B's public address: IP_B : Port_B
First, A tries to connect to B
IP_A : Port_A ---> IP_B : Port_B
The request is however rejected by B's NAT. Only B's STUN server can connect B at that address.
Next it's B's turn.
IP_B : Port_B ---> IP_A : Port_A
But here, shouldn't the connection be established? Because, Peer A's NAT table should have registered Peer B's address when A first sent request to B. So, any response from B must be accepted. But of course, it doesn't seem to work. So, where am I wrong?
I think I found the answer myself. Symmetric NAT is even more restrictive than I thought. Look at the Wikipedia explanation,
The problem is, Symmetric NAT will use a different IP : Port combination for Peer A while sending a request to Peer B than the IP_A : Port_A combination provided by the STUN. But Peer B's remote description still points to IP_A : Port_A. So, the addresses don't match and connection never happens. Perhaps a port prediction system could still make this work I assume :D