Como posso alcançar uma porta aberta e de escuta no Linux?

1

Depois de encaminhar a porta que desejo abrir, não consigo me conectar ou obter dados para essa porta. O software PHP CLI que eu escrevi está escutando a porta ativamente no Ubuntu 14.04 . Parte do código é mostrada abaixo. A porta é aberta como AF_INET, o script não gera erros para cada linha e o / etc / protocols tem o tcp definido como 'tcp 6 TCP'.

// I have tried $host=gethostbyname(gethostname());$port=8399 (host is 127.0.1.1)
// as well as $host = '0.0.0.0'; $port = 8399; and other addresses

$this->wsRead[0] = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)
socket_set_option($this->wsRead[0], SOL_SOCKET, SO_REUSEADDR, 1)
socket_bind($this->wsRead[0], $host, $port) 
socket_listen($this->wsRead[0], 10)
while (isset($this->wsRead[0])) { /* Handshake/Process data, etc. */ }

As portas são encaminhadas e meus iptables estão vazios , embora eu tenha tentado especificamente adicionar uma regra de permissão para a porta. Eu tentei executar o script como super usuário. Quando o servidor está escutando, netstat -tuln lista essa linha (com minha porta 8399), e noto que o apache também está listado, o que funciona bem e é mostrado como uma porta aberta de sites de verificação de porta externa (na porta 8301):

Proto Recv-Q Send-Q Local Address      Foreign Address    State
tcp        0      0 0.0.0.0:8399       0.0.0.0:*          LISTEN
tcp6       0      0 :::8301            :::*               LISTEN
tcp6       0      0 :::80              :::*               LISTEN

Usando o nmap, a porta também está aberta. Eu tentei portas diferentes também. Meu script de conexão do lado do cliente é um script JavaScript websocket que funciona para se conectar ao executar o PHP CLI no Windows. O script é muito longo para incluir aqui e não se conecta a partir da rede externa. Se eu definir scripts JS e PHP para os endereços locais 127.0.0.1 ou 192.168.0. ###, então ele funciona, mas não de um dispositivo fora da minha LAN.

// The JS is basically this, plus some connection events to alert success/fail.
// This external connection request will always time out
Server = new WebSocket('ws://68.215.154.129:8399');

Eu estou sentindo falta de algum firewall no Linux além do iptables que eu não estou ignorando? O Apache está recebendo as portas abertas corretamente e outros softwares no PC, mas parece que meu script está faltando uma etapa necessária para abrir totalmente a porta para uso externo.

tl, dr; Conectando usando endereço IP externo usando o cliente JavaScript para o servidor PHP trabalhando no Windows, mas não no Ubuntu. Porta encaminhada, ouvindo, não bloqueada pelo iptables , o que resta?

    
por Daryll Chandler 02.11.2015 / 00:17

2 respostas

0

Acontece que o problema foi várias coisas, principalmente decorrentes do meu modem / roteador. Eu uso um Motorola SB6580 , que recentemente teve uma atualização de firmware, e não foi reiniciado por 10 dias, fazendo com que ficasse muito lento, me impedindo de querer fazer muitas alterações nele.

A atualização de firmware alterou a página de encaminhamento de porta para incluir uma seção de endereço de host remoto externo (padrão 0.0.0.0) sem problemas, mas outra coisa que eles fizeram quebrou as regras de encaminhamento de porta existentes conjunto.

Eu estava usando um intervalo de portas a ser encaminhado que não estava funcionando e, alterando esse intervalo para 8399 - 8399, ele começou a funcionar novamente. A reinicialização não afetou, além de aumentar a velocidade dos modems, nem alterar o protocolo de ambos para TCP.

IP Addr|Start Port|End Port|Remote Host Addr|Start Port|End Port|Protocol|Enabled
192.168.0.101|8340|    8399|         0.0.0.0|      8340|    8399|    Both|Checked
192.168.0.101|8399|    8399|         0.0.0.0|      8399|    8399|     TCP|Checked

Além disso, ao usar o comando gethostbyname (gethostname ()) do PHP no Linux, o endereço retornado é um endereço local de 127.0.1.1, a segunda entrada no arquivo / etc / hosts, que não funciona para ligar um soquete. $ _SERVER ['REMOTE_ADDR'] também retorna um aviso: não é possível procurar o host. Ao alterar manualmente para o endereço de casa (sub-rede?) (O meu é 192.168.0.101) ou o curinga do IPv4 0.0.0.0 , o ouvinte do soquete é ligado corretamente e aceita conexões externas.

Minha experiência com o roteador e a inexperiência com o Linux me fez inclinar-se para o caminho errado da solução de problemas do Linux. Depois de perceber que as coisas não estavam funcionando no Windows 7, eu fiz as duas alterações acima e tudo agora funciona como deveria.

    
por 02.11.2015 / 01:25
0

Você está perdendo algo conceitualmente e no código. Você tem o código PHP escutando conexões, mas você precisa aceitar uma conexão antes de usá-la.

$ns = socket_accept($this->wsRead[0]);
$some_string = socket_read($ns, 128);

A chamada para socket_accept() bloqueia. Ele não retornará até que algum programa cliente se conecte ao programa now-waiting-for-connection.

Uma chamada para socket_accept() retorna o soquete real que você usa para se comunicar com o programa remoto. Eu não acho que isset() é realmente o que você quer, você deve olhar para socket_select() ou algo assim. Quando você terminar de se comunicar com o controle remoto, chame socket_close($ns) e, em seguida, dê um loop de volta para chamar socket_accept($this->wsRead[0]) para esperar que outro programa remoto se conecte ao seu programa.

Quando o seu programa PHP é feito para manipular conexões, ele deve chamar socket_close($this->wsRead[0]) para fechar o socket, que basicamente diz ao kernel do SO para parar de escutar os pacotes TCP SYN recebidos pela porta que você especificar.

    
por 02.11.2015 / 01:16