Como posso enviar bytes para o computador distante de um amigo sem servidor de terceiros?

0

Digamos que meu IP seja 198.51.100.27 e o IP de meu amigo seja 203.0.113.11. Nós dois estamos conectados à internet por trás de um roteador padrão do consumidor.

Como podemos enviar alguns bytes uns aos outros sem usar um servidor de terceiros? (e sem ter que fazer a configuração de encaminhamento de porta do roteador)

Ouvi falar sobre netcat ou ncat , mas não sei como posso usá-lo para enviar "olá mundo" para meu amigo e como ele veria essa mensagem em seu terminal

Ele deve fazer:

ncat -C 198.51.100.27 80     # this IP is mine

e eu:

ncat -l 203.0.113.11 80 < echo "hello world"      # this IP is my friend's IP

?

Eu nem tenho certeza se netcat / ncat é a ferramenta certa para isso. Eu também olhei para chownat / pwnat mas não consegui descobrir como usá-lo em um exemplo tão simples: apenas enviar / receber "hello world".

Notas:

  • Não quero me conectar ao computador do meu amigo via SSH ou SFTP. Eu só quero enviar-lhe "hello world" ou enviar mensagens de texto curtas uns aos outros.

  • Não tenho um objetivo preciso além de entender como os bytes podem ser enviados diretamente ponto a ponto sem um servidor centralizado. Então, se eu puder enviar apenas um ou dois bytes, de modo que ele os veja em seu console, tudo ficará bem!

por Basj 28.01.2018 / 17:41

3 respostas

0

Basicamente, executar nc -l -p $port em um host e nc $ipaddr $port para um valor apropriado de $ipaddr e algum valor de $port seria suficiente. Mas isso requer que qualquer firewall entre as máquinas não bloqueie a conexão.

Você mencionou que "está atrás de um roteador ISP de consumidor padrão", o que geralmente implica algum tipo de NAT, o que significa que as máquinas por trás dos roteadores não têm endereços IP públicos e, portanto, você não pode se conectar diretamente a os hosts, mas teria que configurar o encaminhamento de porta no roteador.

Além disso, há a questão do seu ISP permitir a conexão também. Dependendo de várias coisas, talvez você não consiga receber conexões TCP em uma conexão comum ao consumidor.

Quanto ao redirecionamento e echo , você precisa de echo "message" | nc ... para enviar a saída de outro comando para nc ou nc ... <<< "message" para direcionar uma string diretamente para nc . (Isso não é um recurso do padrão sh )

    
por 28.01.2018 / 18:07
0

O "cliente" precisa usar o IP público de "servidores" (encontrar um site whatismyip) e concordar com um número de porta a ser "encaminhado por porta" pelo roteador de quem está jogando "servidor". O servidor não precisa conhecer o IP público dos clientes, a menos que ele queira se proteger e aceitar conexões apenas desse cliente específico.

    
por 28.01.2018 / 19:16
0

O que você provavelmente está procurando é chamado de TCP Hole Punching .

Você pode fazer isso quando não tem nenhum controle sobre o roteador NAT (nem mesmo a porta) na condição que você usa um intermediário de terceiros para sincronizar a comunicação e seu NAT é um NAT simples, não um "Operador" Grau NAT ", incluindo, portanto, não alterando portas vistas, apenas IPs (tudo se torna mais difícil mais). O corretor pode ser qualquer coisa, até mesmo um telefonema real, mas é claro que a automação exigiria algo especializado. A função do intermediário é sincronizar as ações, além de permitir que os dois pares conheçam seus IPs públicos. Um servidor STUN pode ser parte de uma solução automática.

O princípio básico é que o TCP, como inicialmente definido no RFC 793 , permite que o SYN, SYN, seja o usual / ACK, ACK handcheck triplo, ou também para fazer SYN + SYN simultâneos, SYN + ACK e ACK simultâneos (veja link anterior , figura 8). Ao fazer isso, os dois roteadores NAT abrirão o "fluxo de retorno" da conexão TCP.

Ressalva: as comunicações devem ser sincronizadas (possivelmente com NTP), ou um RST será enviado pelo roteador NAT do par mais lento e pode fechar o "buraco" no outro roteador NAT. Isso não é um problema se o roteador descartar pacotes em vez de enviar um RST. Muitos roteadores NAT domésticos simplesmente descartam esses pacotes, então não há problema.

Assim, um exemplo a ser feito: o dono do 198.51.100.27 A telefonou para o proprietário B do 203.0.113.11 e eles concordam que em um determinado momento, depois de ter verificado seus IPs usando sites on-line ("Qual é o meu IP"? ...) e usando a versão tradicional do netcat,

A digitará:

nc -p 7777 203.0.113.11 8888

B irá simultaneamente digitar:

nc -p 8888 198.51.100.27 7777

O que acontecerá é que cada usuário verá uma única conexão TCP estabelecida, a conexão mesma .

A agora está livre para digitar "hello world", que será lido por B.

Na verdade, eu fiz uma resposta semelhante em stackoverflow, com talvez mais detalhes, mas ela nunca foi verificada como uma solução: link

Em vez de usar o netcat, o socat deve ser preferido porque pode se integrar mais facilmente a qualquer outra coisa para automação.

    
por 28.01.2018 / 21:26