TCP i UDP fungují vždy na principu client-server. Client se pripojuje k serveru (i u UDP zpravidla client pošle serveru dotaz a čeká na odpověď)
NAT zase funguje tak, ze kdyz je client na lokalni siti a iniciuje spojeni ven k nejakem serveru, tak si to router na nejakou dobu zapamatuje, aby vedel, jakemu lokalnimu pocitaci ma odpoved serveru preposlat.
Takže řešení je prosté - všechno, k čemu se mají programy připojovat (posílat data, atd.), musí mít server přímo dostupný na inetrnetu. To jsou ty herní servery všemožných společností, ale třeba i webové servery, poštovní servery, atd.
Přesměrování portů pak potřebuješ jen tehdy, pokud bys chtěl nějaký takový server provozovat u sebe na lokální síti za NAT.
Podmínkou správného fungování je nemít zmatek ve zdrojových a cílovýh portech UDP komunikace. UDP musí od klienta vyrazit k serveru, a tím se na NAT otevře kanál klient_port <-> server_port. Server pak může zes právného portu zpět ke klientovi posílat odpovědi, třeba s tím stavem hry. A klient opačným směrem posílá na server svůj stav. To musí dělat tak často, aby se ta rezervace na NAT nezrušila pro nečinnost.
Takže když čtu tvuj popis fungování multiplayeru, tak si tipnu, že jsi ze serveru ke klientu neposila na port, ze ktereho se ti klient ozval, ale na nejaky pevne dany port. Proto bylo potreba nastavit presmerovani. A to byla ta chyba - pevne dany port maji mit jen servery - uz i proto, že na jednom IP muze bezet jen jeden. kleinti pouzivaji zpravidla nahodne zvolene volne porty, a proto muze na jednom pocitaci bezet i vice kleintu vedle sebe, aniz by se pohadali.