You should check the server that currently has the floating address. What is its configuration? Is it bound to 0.0.0.0? Do you see the traffic coming in using wireshark or tcpdump?
So the phone sends request to 192.168.0.3 but receives response from 192.168.0.1 - that won’t work. The phone is still waiting for a response from 192.168.0.3 - that’s why you see 408 (timeout).
Options you have:
specify on the phone side to “trust” all 3 IPs - that’s not a very good solution and might be impossible, depending on the vendor
force asterisk/heartbeat/iptables to use the floating IP for outgoing connections
remove 192.168.0.1 and 192.168.0.2 from the servers and use another NIC and/or subnet