TNet doesn't handle NAT punchthrough. NAT punchthrough is generally for UDP-based communication, while TNet primarily uses TCP.
You can be connected to both the lobby server and a game server at the same time, however I question whether this is what you want... I'd handle it differently, like so:
1. Main game server that everyone connects to, hosted in a public-accessible location, such as an Amazon EC2 cloud.
2. Players connect to this game server -- at this point you can communicate with other players by sending broadcasts.
3. For match-making, I'd do it like this: send a request for channels:
TNManager.BeginSend(Packet.RequestChannelList);
TNManager.EndSend();
assuming you set a listener for this packet like so:
TNManager.client.packetHandlers[(byte)Packet.ResponseChannelList] = UpdateWorldData;
...you will receive a list of all the channels with detailed info such as the number of players, player limit, and custom string data you can use to store other custom information such as the expected level requirement.
4. When you get the list of channels, you should be able to see if any channels are open with fewer than maximum players that have the appropriate level requirement that you can join. If so, join one. If not, create your own channel via TNManager.CreateChannel (be sure to set the expected player limit, such as 2!)
5. At this point the channel's host (the player that created it) will wait for another player to join (OnNetworkPlayerJoin notification). Once one joins, close the channel so no one else can join and start your game, possibly by loading the actual game level (TNManager.LoadLevel) -- make sure to only do this on the host player (TNManager.isHosting).
6. To send messages such as "attack", use RFCs: tno.Send("SomeFunction", TNet.Target.All, ...);
Do not call these functions directly. That's the main difference between making a single player game and a multi-player game. Instead of calling functions, you will be sending messages to call those functions. And that's it.
P.S. if you want to store player information, use TNManager.playerDataNode. It's an XML-like hierarchical structure that you can change at any time to store any info you need, such as what kind of weapon you have equipped. Each player should be managing their own data node. Use TNManager.SyncPlayerData() to sync it with other clients after any changes. Other players always have access to this struct via player.dataNode -- but make sure to only read, not write.
As a nice benefit, DataNode structs are easily save-able to a file (so this becomes your player's save file!). You can read them back in the same exact way. In Windward I simply read the DataNode player file then set it to TNManager.playerDataNode -- so all players have access to each other's full player data at all times. This includes equipment, inventory, talent tree unlocks, achievement unlocks, and more.