Estabelecer uma conexão sem encaminhamento de porta

0

Com o encaminhamento de porta, qualquer um pode transformar um computador em um servidor e usá-lo para aceitar conexões diretas de qualquer outro computador na Internet (é claro que há algum código do lado do servidor em execução). Isso é ótimo, mas o que acontece quando alguém não tem acesso a um roteador físico (como é o caso de muitas pessoas em apartamentos), ou talvez não exista nem um (muitos novos tipos de conexões de internet surgiram, como dados do telefone, que operam de forma diferente) ... Eu acho que eles estão sem sorte?

No entanto, existe uma situação simples que ainda acho muito útil, para a qual algo pode ser feito: a conexão está sendo feita entre duas partes que se conhecem e já trocaram endereços IP. É claro que esses IPs podem mudar ocasionalmente, mas não considero isso um grande obstáculo e há muitos serviços gratuitos de DDNS disponíveis, se necessário. Eles também concordaram em números de porta, ou um método para executar através de números de porta até encontrar um que funcione. Nenhuma das partes tem encaminhamento de porta disponível.

Mas veja, o roteador ou o que estiver fornecendo serviço de internet deve ser capaz de encaminhar dados enviados do endereço de uma conexão para qualquer computador local que tenha estabelecido essa conexão, como acontece no uso normal da internet. Então, digamos que o seguinte procedimento ocorra:

  1. Um usuário diz que estabeleceu uma conexão com o endereço do outro usuário, especificando as portas locais e externas a serem usadas, e o roteador (ou seja o que for), portanto, faz a ação apropriada para direcionar dados provenientes desse outro usuário para este. No entanto, como o primeiro usuário sabe (mas não o roteador), ele realmente não se conectou e, em vez disso, está aguardando e aguardando uma solicitação do outro usuário.
  2. Enquanto isso, o outro usuário tenta se conectar ao primeiro como qualquer cliente se conectaria a um servidor, usando as mesmas portas (embora trocadas) conforme escolhido pelo primeiro usuário.
  3. Quando o primeiro recebe a solicitação para formar uma conexão real, ele envia a resposta apropriada para que a solicitação do segundo usuário por uma conexão seja aceita.

É possível que o código real apenas se comporte normalmente, com o primeiro usuário como servidor e o segundo como cliente, mas com a parte crucial sendo que o primeiro roteador do usuário (ou o que quer que execute essas tarefas) pensa que o primeiro user é um cliente que primeiro estabeleceu uma conexão com o outro usuário.

Eu não vejo nada que torne isso impossível, mas também não vejo como isso seria feito. Primeiro, o fato de a tentativa de conexão inicial ter sido rejeitada teria que ser ignorado de alguma forma (pelo menos pelo roteador). Segundo, a tentativa de usar essa porta novamente para escutar e aceitar uma conexão verdadeira teria que ser permitida (de alguma forma, não notifique o roteador que essas etapas estão ocorrendo).

Se isso pudesse ser feito, significaria que qualquer dispositivo com acesso à Internet (em vez de apenas computadores domésticos) poderia se conectar diretamente a qualquer outro dispositivo habilitado, sem a necessidade de quaisquer servidores de terceiros intermediários. Essas conexões podem ser usadas para transferir arquivos de tamanho arbitrário diretamente, por exemplo, novamente sem a necessidade de servidores de terceiros. E a conexão poderia fazer qualquer outra coisa que uma conexão normal faria também.

Então, estou aqui para perguntar, alguém sabe como isso pode ser feito?

    
por user11424 19.01.2014 / 03:03

2 respostas

1

That's great, but what about when someone doesn't have access to a physical router

Geralmente, todo o tráfego da Internet atravessa vários ISPs e roteadores de nível de operadora, e nenhum deles costuma ser fisicamente acessível pelos usuários.

Seu quarto parágrafo é um pouco incerto. Acho que você não entende como o NAT funciona.

A razão pela qual o encaminhamento de porta é necessário é devido ao NAT. O NAT oculta vários sistemas atrás de 1 endereço IP. Você só pode falar com esse endereço IP publicamente visível. Se você deseja obter algo por trás deste IP, você deve passar por este IP. Você não tem escolha. Sem o encaminhamento de porta, o roteador habilitado para NAT não sabe qual máquina por trás dele enviará tráfego de entrada não solicitado e assumirá que você está tentando falar com o próprio roteador.

Se você está falando sobre um programa que aceita solicitações em nome de um cliente por trás dele, o nome para isso é "proxy" e você certamente pode fazer isso. Um roteador é um lugar lógico, mas não necessariamente melhor, para que seja executado e acessível. Existem proxies para muitos protocolos, HTTP, SIP, etc.

When the first one receives the request to form an actual connection, it accepts

Isso nunca aconteceria. O "primeiro" está por trás de um roteador NAT, o roteador NAT recebe a solicitação primeiro, e não qualquer pessoa atrás do roteador.

O IPv6 corrige isso fornecendo um espaço de endereçamento grande o suficiente para que o NAT não seja necessário para preservar os endereços.

Não há protocolo especial envolvido no NAT, é tudo TCP / IP.

O que é diferente de um roteador padrão não-NAT é que, do lado de fora, os nós só vêem e sabem sobre o único IP público. Tanto quanto eles sabem de um nível TCP / IP, há apenas um sistema nesse IP enviando muitas solicitações. Se nada como o Javascript, um proxy ou outro tráfego no nível do aplicativo estiver deletando no IP privado de alguém, o exterior não poderá saber o IP privado.

O recurso NAT deve acompanhar quem iniciou quais conexões (somente atrás) para que ele possa encaminhar o tráfego de entrada destinado a si próprio para o host apropriado. (Isso é possível porque cada conexão de saída possui uma porta de origem aleatória exclusiva, portanto, pode simplesmente mapear as portas de origem para os endereços de destino da LAN).

Eu acho que houve um programa que tentou trabalhar da maneira que você está dizendo, enviando um roteador NAT um pacote TCP fora de seqüência (a seqüência é SYN, ACK, SYN-ACK) que pode enganá-lo. Eu também ouvi falar de roteadores NAT que erroneamente permitem conexões TCP de entrada em portas que o tráfego UDP é enviado.

Mas uma boa implementação de NAT vai verificar suas tabelas internas para conexões mapeadas, e soltar o pacote se ele não corresponder a nada visto de dentro. Você não pode contar com falhas de implementação para fornecer uma solução confiável da maneira que você está pedindo.

    
por 19.01.2014 / 05:29
0

Se você não tiver acesso a um roteador, não poderá executar o programa nele para fazer o esquema de conexão direta, mesmo que tenha dedicado tempo para criar o programa. Se você não tiver um roteador, então:
A. não há necessidade de portar para a frente desde que você tenha uma conexão direta.
B. Não é a sua rede (1/2/3 / 4G), então você precisa fazer uma conexão reversa ou falar com o administrador de sistema.
Eu não quero dizer que sua idéia é ruim, porque isso não é desafiador, mas é impraticável porque se você tiver acesso a um roteador executando o openwrt no qual possa executar seu programa para fazer isso, então é melhor simplesmente encaminhar a porta.

    
por 19.01.2014 / 03:27