Uma ferramenta de linha de comando para encapsular datagramas UDP sobre TCP.
É particularmente útil para encapsular UDP sobre SSH
A ferramenta foi projetada principalmente para o caso de uso em que você tem dois aplicativos que precisam se comunicar por UDP sem um relacionamento cliente-servidor óbvio. Ou seja, qualquer aplicação pode iniciar um pacote e deve ser configurada com o endereço da outra na inicialização (ou seja, as portas não podem ser aleatórias).
Você executa udp-over-tcp
nos hosts de ambos os aplicativos. Cada instância atua como uma espécie de réplica local do aplicativo executado na outra. Se o aplicativo em um host escutar na porta UDP P, então udp-over-tcp
escutará na porta UDP P no outro host e garantirá que o tráfego para a réplica P vá para a porta P do aplicativo real udp-over-tcp
fará isso para as portas de ambos os aplicativos ao mesmo tempo e vinculará as portas. Ele irá efetivamente "fingir" que cada aplicativo está sendo executado localmente para o outro.
Concretamente, se o aplicativo em um host enviar um datagrama de sua porta P para a porta Q (réplica local), o datagrama chegará à porta Q do aplicativo real (remoto) com uma porta de origem P . Isso significa que um aplicativo sempre vê o mesmo endereço único (localhost) e porta (a porta do outro aplicativo), e esse mesmo par endereço-host também pode ser usado na configuração de peer do aplicativo.
Esperamos que o diagrama a seguir possa ajudar a entender as configurações udp-over-tcp
:
O programa vem pré-compilado para diversas plataformas (obrigado cargo-dist!), e deve ser executável imediatamente, sem dependências.
Alternativamente, você pode instalá-lo através do Cargo com
$ cargo install udp-over-tcp
Você tem um aplicativo UDP em execução no host X na porta A. Você deseja que ele se comunique com um aplicativo UDP em execução no host Y na porta B. E também deseja permitir que o aplicativo em Y se comunique com A em X. Ótimo, faça do seguinte modo:
Em qualquer host (aqui X), primeiro crie um túnel TCP para o outro host:
ssh -L 7878:127.0.0.1:7878 $Y
Em seguida, execute udp-over-tcp em ambos os hosts, um com --tcp-listen
e outro com --tcp-connect
. O --tcp-listen
deve ser usado no host ao qual o encaminhamento permite a conexão (aqui Y). Você pode executá-los em qualquer ordem, mas a prática recomendada é ouvir primeiro:
Y $ udp-over-tcp --tcp-listen 7878 --udp-bind $A --udp-sendto $B
X $ udp-over-tcp --tcp-connect 7878 --udp-bind $B --udp-sendto $A
Em Y, isso irá escutar na porta UDP $A, encaminhá-los por TCP para X e, em seguida, entregá-los à porta UDP $A. No X, isso escutará na porta UDP $B, encaminhará aqueles por TCP para Y e, em seguida, os entregará na porta UDP $B.
Agora configure o aplicativo em X para enviar para 127.0.0.1:$B e configure o aplicativo em Y para enviar para 127.0.0.1:$A. Em outras palavras, mesma porta, endereço IP local.
Cada argumento leva um número de porta (como acima) ou addr:port para especificar o endereço. (o endereço padrão é 0.0.0.0 para ouvir/ligar e 127.0.0.1 para conectar/enviar para)
Existem outras ferramentas que podem ajudar com este problema, embora tenham propriedades diferentes desta ferramenta.
Soluções que dependem de nc
ou socat
não preservam os limites do datagrama UDP, o que significa que dois sendmsg
UDP podem fazer com que apenas uma única mensagem (combinada) chegue por meio de recvfrom
. Muitas aplicações UDP não são resilientes a isso, pois dependem do UDP para fornecer enquadramento de mensagens.
O udp-over-tcp do mullvad fornece apenas encaminhamento unidirecional. É possível executar instâncias adicionais da ferramenta para encaminhar na outra direção, embora isso signifique que a porta de origem dos datagramas de entrada não corresponderá à porta de destino dos datagramas de saída. No entanto, isso provavelmente é adequado para aplicativos estilo cliente-servidor onde a porta do cliente não é importante.
Licenciado sob qualquer um dos
a sua opção.
A menos que você declare explicitamente o contrário, qualquer contribuição enviada intencionalmente para inclusão no trabalho por você, conforme definido na licença Apache-2.0, deverá ser licenciada duplamente conforme acima, sem quaisquer termos ou condições adicionais.