The most common cause is when SIP trunk providers send incoming calls from multiple IP addresses. Depending on how they configure things on their end it might only happen intermittently.
The way to see this is to monitor incoming calls from a console.
asterisk -vvvr
When an inbound call comes in with this issue you will see an error message to the effect "A call was received from an unknown IP address". This is due to the host= statement in the trunk configuration not matching the IP address of the incoming call. If the host= statement uses a domain name, resolved IP address may have changed since the last time the trunk registered.
The solution is to create a separate trunk for each possible IP address that inbound calls come in on. Each configured trunk should have a different host= setting. There should still only be one trunk with a registration string for outbound calls.
An alternative solution, available since Asterisk v12, is to configure a PJSIP trunk using the domain name. PJSIP trunks resolve all available IP addresses associated with a domain name.