NAT punch is pretty simple thing. It used in 90% for Peer 2 Peer connections. LiteNetLib uses algorithm very similar to STUN (https://en.wikipedia.org/wiki/STUN) but with different protocol. You must have one server(master server) with "white" ip address. This server can be behind NAT but with forwared ports. Server example: https://github.com/RevenantX/LiteNetLib/blob/master/LibSample/HolePunchServerTest.cs Code (CSharp): private NetManager _puncher; - server. Code (CSharp): void INatPunchListener.OnNatIntroductionRequest(NetEndPoint localEndPoint, NetEndPoint remoteEndPoint, string token) NAT punch works almost in all situations but there some exceptions - when 2 clients behind symmetric NAT and in some mobile networks. I will create better and clear example for NAT punch.