Hello Owais,
I have All the CSCFs on the same IP using different ports. P-CSCF advertises a public IP. Rest of the nodes including I-CSCF and S-CSCF listen local only.
What is the reason that the rest of the nodes including I-CSCF and S-CSCF listen local only? I am not familiar with such an arrangement. I-CSCF and S-CSCF must have addresses which can be used in routing?
Why do you do that? Why do you think NAT can solve that issue. In my view this will make things much more complicated. To analyse what happens in your case you should add tracefile from the core (tcpdump -i any -s 3000 -w /var/tmp/trace.pcap).
BR Franz