net.Dial("udp", ...) is not enough, as it's a different syscall (sendto vs bind) from net.ListenUDP,
and the kernel filters out packets coming from tuples that we've never sent data to. Works on Windows without it though.
LocalAddr() usually returns 0.0.0.0, because we don't explicitly bind to anything, resulting in a false report of a full-cone nat. Try harder, and even check network interfaces if needed.