Como fazer NAT com sockets PHP

Estou tentando fazer um aplicativo peer to peer no php para trabalhar no mesmo tipo de resources do skype. Funciona com endereços internos, mas quando tento enviar dados para o meu endereço externo, a mensagem nunca chega. Obviamente, estou faltando uma tradução de endereços, mas estou sem perda de como fazer isso com sockets PHP. É possível?

Este é o código que eu tenho no momento para receber a mensagem, que eu executo primeiro para aguardar alguma mensagem:

<?php $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) or die("Could not create socket: " . socket_strerror(socket_last_error($socket))); socket_bind($socket, "0.0.0.0", 100) or die("Could not bind socket: " . socket_strerror(socket_last_error($socket))); $ret = ""; $from_ip = ""; $from_port = 0; echo "waiting...\n"; socket_recvfrom($socket, $ret, 6, 0, $from_ip, $from_port); var_dump($ret, $from_ip, $from_port); socket_close($socket); 

E então, quando está esperando, eu executo esse código para enviar uma mensagem:

 <?php $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) or die("Could not create socket: " . socket_strerror(socket_last_error($socket))); $to_ip = "externalip"; //works with internal "127.0.0.1"; $to_port = 100; $message = "hello!"; socket_sendto($socket, $message, strlen($message), 0, $to_ip, $to_port); echo "sent\n"; socket_close($socket); 

Mas ele envia e sai, mas o primeiro script ainda está aguardando … Já foi por algum tempo agora, alguém pode me ajudar?

– Editar –

Ok então eu implementei um servidor stun e configure o encaminhamento de porta para ele, assim:

 <?php echo "-- STUN SERVER --\n"; $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) or die("Could not create socket: " . socket_strerror(socket_last_error($socket))); socket_bind($socket, "0.0.0.0", 5104) or die("Could not bind socket: " . socket_strerror(socket_last_error($socket))); do { $ret = ""; $from = ""; $port = 0; echo "waiting...\n"; socket_recvfrom($socket, $ret, 6, 0, $from, $port); echo "received: $ret\n"; $message = $from.":".$port; socket_sendto($socket, $message, strlen($message), 0, $from, $port); echo "sent: $message\n\n"; } while (true); 

e alterei meu primeiro script para obter seu ip / port do servidor stun:

 <?php $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) or die("Could not create socket: " . socket_strerror(socket_last_error($socket))); socket_bind($socket, "0.0.0.0", 100) or die("Could not bind socket: " . socket_strerror(socket_last_error($socket))); $ret = ""; $from = ""; $port = 0; echo "sending info to stun server...\n"; $to_ip = "stunip"; $to_port = 5104; $message = "get_ip"; socket_sendto($socket, $message, strlen($message), 0, $to_ip, $to_port); echo "waiting for stun...\n"; $stuninfo = ""; socket_recvfrom($socket, $stuninfo, 25, 0, $from, $port); var_dump($stuninfo); // i use this info in my second script echo "waiting...\n"; socket_recvfrom($socket, $ret, 6, 0, $from, $port); var_dump($ret, $from, $port); socket_close($socket); 

Obtém a informação do servidor de atordoamento ok e aguarda outra conexão, mas quando eu uso essas informações no meu segundo script, o primeiro script ainda não recebe nenhuma mensagem. Existe outro passo que estou perdendo?