Bhè guarda la situazione è semplice.
Innanzitutto saprai (ritengo) quale porta utilizzano i tuoi programmi per comunicare.
Infatti il flusso IP non avviene su indirizzi IP, bensì sulla coppia IP:porta (e protocollo, ovviamente, ma lasciamo stare).
Pertanto se il tuo programma di chat utilizza la porta (poniamo) 12345, dovrai SU ENTRAMBI gli host (cioè i due computer perchè questo saranno alla fine suppongo), e supponendo di utilizzare "banali" router con "banali" collegamenti ADSL caserecci, un instradamento delle porte verso gli indirizzi LAN locali.
E' un argomento banale e trito e ritrito, comunque ti metto un esempio che magari ti sarà utile per risparmiare tempo.
Supponiamo di avere un PC di indirizzo LAN 192.168.1.2 collegato ad un certo router a sua volta collegato ad internet con l'indirizzo LAN 192.168.1.1 e pubblico 80.81.82.83 (quest'ultimo è assegnato dal provider e normalmente non si può cambiare, anzi varia ogni tanto quando si riavvia il router, cade la linea etc)
Supponiamo che il secondo PC abbia sempre l'indirizzo IP 192.168.1.22, collegato ad un router con LAN 192.168.1.240 ed IP pubblico 84.85.86.87
Supponi che la tua applicazione utilizzi la porta 12345 per comunicare (TCP).
Allora nel router #1 (di indirizzo locale 192.168.1.1) dovrai impostare una regola del tipo: la porta 12345 la mandi su 192.168.1.2
Poi, ragionevolmente, attiverai servizi DDNS (DINAMICO-dns) per associare che so
80.81.82.83 a mio.computer.it
Nel router #2 (di indirizzo locale 192.168.1.240) DIPENDE.
Dipende nel senso che se la tua applicazione può essere "invertita" come server-client (cioè i due computer possono cambiare ruolo) metterai che la porta 12345 la mandi su 192.168.1.240
Se invece il computer #2 è solo un client, cioè INIZIA LUI sempre la connessione, utilizzando i routerelli normali (quindi senza tabelle di firewall evolute) avrai un mantenimento delle connessioni aperte e - tipicamente - anche su porte random.
Cioè il computer #2 userà (dipende, vedi te, il programma l'hai scritto te!) una porta "qualsiasi" (*non sto a dire cosa significa "qualsiasi"), tipo 44455 la prima volta, poi 22321 la seconda e così via.
Il router #2 capirà che la connessione è stata aperta da 192.168.1.22:44455 => 80.81.82.83:12345 ed automaticamente reinstraderà i messaggi in arrivo (cioè da 80.81.82.83:12345=> 84.85.86.87:44455 sul secondo computer cioè 192.168.1.22:44455)
----------
La situazione può essere mutata con l'utilizzo di regole asimmetriche (cioè non del tipo 1:1), ma lasciamo stare per ora