Пробивание UDP - сложная тема, и было предпринято много попыток найти решение, которое работает. Проблема в том, что существует так много разных маршрутизаторов NAT, и не существует стандартного способа реализации NAT, поэтому все маршрутизаторы ведут себя немного по-разному.
Некоторые попытки были стандартизированы, например, STUN , ЛЕД . Они по-прежнему работают только в большинстве случаев, но не во всех, но они накапливают много знаний и решают многие проблемы - больше, чем ваша попытка когда-либо сможет, просто потому, что вы не можете протестировать свое решение с каждым маршрутизатором NAT под солнцем , Например, Skype потратил годы на совершенствование своего механизма обхода NAT.
Я рекомендую вам взглянуть на STUN или предпочтительно ICE . Попробуйте реализовать одну из них или поищите существующие реализации.
Другим вариантом может быть простое создание порта переадресации на маршрутизаторе, например используя UPnP или NAT-PMP .
Тем не менее, я не удивлюсь, если одноранговые классы .NET будут оснащены механизмом обхода NAT, но я не знаком с ними.