We have been working on hole punching support in libp2p for the last year. It finally landed in the Go and Rust libp2p implementation.

Read all about it on the IPFS blog: https://blog.ipfs.io/2022-01-20-libp2p-hole-punching/