Isso não é realmente uma coisa de stackoverflow, mas certamente pode ser feito e eu escrevi programas para fazer isso.
Essencialmente você tem um programa, vou descrever a solução de thread. Dois threads aceitam (mesma porta, portas diferentes, o que for). Quando ambos os segmentos têm uma conexão, eles entram em um modo onde eles lêem de seu soquete e escrevem no outro soquete. Quando um recebe EOF, o outro é shutdown () para que conexões semiabertas sejam suportadas.
Simples e fácil.
Karl faz uma boa observação que eu interpretei mal a pergunta. Ele não queria que o tráfego passasse por um terceiro. Bem, isso é um problema solucionável. Se você tiver conectividade UDP de saída sem o mapeamento de porta de origem, poderá solicitar que ambas as partes enviem um pacote UDP que permita a conectividade UDP de um lado para outro. Executar algo como openvpn sobre esse canal UDP e está tudo pronto.
Se você não tiver conectividade UDP, então, realisticamente, só poderá fazê-lo se puder observar o tráfego externo (postar NAT) e tiver acesso a um terceiro que possa forjar pacotes arbitrários. Esse terceiro pode forjar um SYN-ACK em ambas as direções e ambos os lados pensariam que o outro era o servidor. Isso não funciona se a porta de origem for alterada por ambos os sistemas NAT, pois a outra parte não pode determinar deterministicamente a porta de destino adequada a ser usada.