Eureka!. I found the issue. It has something wrong with localphone. I tried with voipcheap and works nicely. Anybody knows how to use stun (or other nat stuff) of voipcheap in asterisk sip.conf to make the connection more stable?
1. Go to the relevant sip account in accounts. 2. Advanced Settings 3. Scroll all the way down. 4. Uncheck Auto-detect STUN 5. Set your preferred STUN server (stun.ekiga.net as an example) 6. Leave the STUN port to default (3478)