Não há nada óbvio para mim errado com suas regras. Eu ia postar isso como um comentário, mas é muito longo.
Eu abordaria isso de forma diferente - tente usar o wireshark na NIC que se conecta ao telefone.
Encerre todos os dispositivos usando a rede e envie / receba a partir de pacotes únicos. Eu sugiro um ping com payload usando o sinalizador -s no linux; Não me lembro da bandeira do Windows. Envie um pacote conhecido, receba o pacote de volta e verifique seu script e wireshark procurando por discrepâncias. Se houver algum, você poderá ver em wireshark se estiver transmitindo 2x, recebendo 2x ou seu script php tem problemas. Se necessário, aumente o tamanho da transferência para um valor maior, mas conhecido. Se necessário, alterne do ping para o ftp ou http, pois o problema pode depender do protocolo. Por exemplo, o ICMP e o UDP são sem conexão, o TCP não é - o TCP poderia solicitar retransmissões no nível do protocolo, os outros dois não (o UDP pode, mas no nível do aplicativo)
O Wireshark deve ter a resposta 'verdadeira', a menos que haja um problema com o próprio telefone fazendo retransmissões. Você provavelmente tem uma ferramenta de medição de dados no telefone, redefina isso antes deste teste para ver se ele começa a se separar significativamente de suas contagens de wireshark e php.
Basicamente, estou sugerindo que você confirme que é um problema real e comece a caracterizar o problema antes de mergulhar na depuração de baixo nível. Pode de fato ser iptables, mas eu não começaria lá. Depois de fazer esses testes, tente executá-los novamente sem as regras personalizadas do iptables e verifique se há uma mudança no comportamento.Se você coletar esses dados, provavelmente a resposta será apresentada, mas, caso não seja publicada, os resultados.
Se for o telefone, você pode fazer um teste de loopback (transferir algo para um servidor externo e redirecioná-lo para você), mas a configuração seria um pouco dolorosa.