Received parameter is always added to via, and is part of the core sip RFC. This is how responses are routed.
To get nat traversal on kamailio, you generally need the following in addition:
- Received only handles address masquerading, for port translation you also need to look at rport.
- A way to perform nat traversal for subsequent in dialog requests, and additionally for initial requests involving location lookup. This is where nathelper or similar must be involved.
- Prevent UDP Connection Tracking Timeout on NAT boxes (keeping nat alive). This can be achieved in many ways, including configuration on NATed devices (low registration expiration, keepalives) but it's better to employ keepalive functionality by kamailio modules (nathelper or usrloc ka, for example).
The actual way to perform these tasks is a bit more involved, and I'd suggest looking at the kamailio sample configuration file which should work for most cases.