I'm testing a P2P node running on Android/Termux behind CGNAT.
For testing, I used a temporary Pinggy tunnel to expose one node.
The remote node discovered the peer and successfully synced the chain. The "/chain" response from the public endpoint matched both local nodes (3 blocks).
POST /add_peer → 200
GET /peers → 200
GET /chain → 200
Public endpoint → 3 blocks
127.0.0.1:5000 → 3 blocks
127.0.0.1:8080 → 3 blocks
Is this a reasonable approach for testing P2P connectivity behind CGNAT, or is there a better approach?
Yeah - for a smoke test that is a success.
Tunneling the termux node through Pinggy only provides an ephemeral public address with which an other peer can reach out to your node - pairing on 3 blocks both locally and the public exposed connection indicates that your app-layer connection between the nodes has been established (peer add, discover and sync).
This not in fact a real CGNAT setup yet (the connection with pinggy is simply routing inbound traffic over your own, outbound connection), so not "punching trough" the carrier's CGNAT - but it works for the purpose of testing the network path. You more normally see a fixed public seed(later on maybe STUN/TURN/relay) so that the phone just establishes the outer dial.
But for what your were trying it out seems like good result!