Criando redes seguras com Reticulum

Guia para a criação de redes com Reticulum e execução de Nodes na rede.

Quem já estudou o protocolo IP e o protocolo TCP, e outros na mesma camada, deve ter percebido quão inseguro e descriptografado são essas soluções. Sempre a criptografia é deixada para protocolos acima realizarem, como o caso do TLS em cima do TCP.

Nesse mesmo pensamento, alguns desenvolvedores talentosos decidiram tomar para si a tarefa de projetar e criar redes mais seguras, criptografadas e descentralizadas. Dois projetos me vem à mente quando falo disso: I2P e Reticulum. Este post é direcionado para o Reticulum, porém no futuro explicarei como o I2P funciona (por cima) e como se conectar a ela.

Esse é um guia que explica de forma superficial, mas profunda para a maioria das pessoas, o funcionamento do Reticulum e suas tecnologias. Após ler tudo, você entenderá em alguns minutos o que eu levei alguns dias para descobrir.


O que é Reticulum?

Quando falamos de Reticulum podemos acabar confundindo a classe com a instância (para os meus programadores OOP de plantão). Há um stack de protocolos que compõe o Reticulum, chamado de Reticulum Network Stack (RNS). Esse é um grupo de protocolos que regem essa rede. Há também as Reticulum Networks, que são quaisquer redes construídas usando o RNS.

O Reticulum é uma rede como a Internet. Cada dispositivo tem um endereço e tem como enviar pacotes. Além de alguns computadores serem roteadores, isso é, conectarem dois pedaços de uma rede.
Reticulum é desenvolvido com três principais objetivos em mente:

Criptografia

Todo o tráfego é criptografado. Quando um computador se conecta à rede, ele gera um par de chaves pública e privada. A chave pública é utilizada como destino (como um endereço IP é utilizado com o IP, ou um endereço MAC é usado em protocolos como o ARP) e para criptografar mensagens para o destinatário, enquando a privada descriptografa essas mensagens e assina mensagens (para ter certeza que o remetente é realmente quem ele diz ser).

Requerimento de banda baixa

Essa rede é muito recomendada para contextos com baixa banda, isso é, com transferência de informações lenta, como LoRa, uma tecnologia que permite a comunicação digital por longas distâncias, com o trade-off de ser mais lenta. Ela é muito (mais) utilizada em áreas rurais.

Agnosticismo de meio

A rede não deve segregar pelos meios em que certos computadores estão conectados à rede. Um computador pode se conectar a outro via USB, esse outro por uma conexão TCP, que pode utilizar LoRa para se conectar com outro. Nenhuma dessas situações deve trazer um problema para a rede. É como o lema do IP:

O pacote acha um caminho.

Com isso tudo, você tem uma rede segura, anônima (não coloquei como um ponto principal, mas não há necessidade de um remetente para as mensagens), leve e prática.

Conectando-se à rede

O RNS é desenvolvido em Python. Como para todo módulo de Python, para instalar você pode usar o pip:
pip install rns.

Atenção:

  • Não há uma rede universal do Reticulum que pode se comparar com a Internet. Então tudo depende dos Nodes que você conectar (mais sobre Nodes em seguida);
  • O Reticulum toma o papel do TCP/IP, o que quer dizer que na prática você não consegue fazer nada apenas com Reticulum. Você precisa de uma outra camada, como o NomadNet ou LXMF (ou criar o seu próprio protocolo, por que não?)

Após instalar, você deve criar uma configuração e adicionar algumas interfaces (conexões):
mkdir ~/.reticulum
rnsd --exampleconfig > ~/.reticulum/config
Abra o arquivo ~/.reticulum/config e vá até a seção [interfaces]. Você pode ler os comentários de cada uma e utilizar como referência.
Você pode perceber que em cada entrada (interface) há uma opção enabled, que está configurada para no em todas menos a primeira. Isso quer dizer que não há problema em deixar elas ali, já que estão desativadas.

Eu recomendo se conectar a dois Nodes via TCP que são da testnet, ou seja, uma rede meio universal para testes:

  [[RNS Testnet Dublin]]
    type = TCPClientInterface
    enabled = yes
    target_host = dublin.connect.reticulum.network
    target_port = 4965

  [[RNS Sideband Network]]
    type = TCPClientInterface
    enabled = yes
    target_host = sideband.connect.reticulum.network
    target_port = 7822

Após adicionar tudo isso e salvar, simplesmente rode rnsd.
Se tudo ocorreu bem, você está agora conectado ao Reticulum!

Como usar esse novo poder

Há dois protocolos/redes em cima do Reticulum que eu recomendo testar: LXMF e NomadNet.

LXMF

LXMF é um protocolo de mensagens e telemetria para o Reticulum, ou seja, é um equivalente ao protocolo do Whatsapp, ou ao XMPP e Matrix.
Ele também suporta telemetria (localização, dados de um dispositivo, etc...) no aplicativo Sideband, um dos programas utilizados para interagir com LXMF.

NomadNet

Até onde eu entendi, NomadNet é o mais próximo da Web que há dentro do Reticulum. Lá existem páginas que se assemelham a sites.

O que pode criar um pouco de confusão é o fato do programa que se chama nomadnet ser um cliente para a rede NomadNet e um cliente LXMF.

Para instalar: pip install nomadnet.
Rode o daemon do Reticulum primeiro se não rodou (rnsd) e rode nomadnet em outro terminal. Você será apresentado uma interface bonitinha para ver Announces de Nodes e Peers. Você pode então interagir com alguns "sites" e conversar com algumas pessoas. O meu nick é roaccess e a minha chave pública <c472cb17d601ba4ed2564a229c84d8c5> (no dia da escrita desse artigo, talvez tenha mudado). Pode me mandar uma mensagem por lá!

Entendendo Announces, Nodes e Peers

Esses são três termos muito importantes para o Reticulum e super simples.
Nodes são computadores que roteiam mensagens pelas suas interfaces. Lembra das interfaces que você adicionou no arquivo de configuração? Se você rodar um Node do Reticulum, todas elas serão conectadas, e você será um dos, se não o único, elos que conecta esses outros Nodes.
Peers são usuários comuns da rede, que não roteiam mensagens. Se você rodar o daemon com os defaults, você será um Peer.
Um Announce é uma característica mais específica do Reticulum. Ele é uma mensagem que diz que você existe e está em um endereço específico. Todos os dispositivos recebem esse Announce. O Announce é basicamente uma mensagem para o broadcast dizendo seu nome e endereço.

Não confunda os Nodes!

Há três principais tipos de Nodes, mas um para cada camada. Isso é uma crítica minha ao projeto, o termo Node é utilizado para o Reticulum, NomadNet e LXMF. E cada um deles é diferente. Mas não se assuste ou desanime, eu vou salvar você:

  • Node do Reticulum: O que eu expliquei anteriormente. Ele roda na camada do Reticulum, o que quer dizer que ele pode rotear mensagens de protocolos acima da rede, como o LXMF.
  • Node do NomadNet: Esses são os tais sites. Um Node NomadNet vai servir páginas. Ele não roteia mensagens.
  • Node do LXMF: Também conhecido como Nodes de Propagação (Propagation Nodes), eles roteiam mensagens LXMF e salvam. É como se fosse um servidor XMPP que guarda as mensagens enquanto você não synca com ele. O bom é que você pode mudar de Propagation Node a hora que quiser. É literalmente a dois cliques de distância.

Hospedando um Node

O nome do site é Sovereinia, não? Então vamos fazer o nosso próprio para ganharmos soberania! Vou explicar como hospedar cada um dos tipos de Node.

Node do Reticulum

O setup de um Node do Reticulum é feito pelo daemon, rnsd, no arquivo de configuração de antes. Então abra o arquivo ~/.reticulum/config e ative a opção enable_transport embaixo de [reticulum] (mude de False para True, ou de No para Yes).
Por padrão, as interfaces têm um mode = full, o que quer dizer que elas já vão fazer o transporte de mensagens por padrão. Se você quiser desativar o transporte para alguma interface, mude o mode: Explicação dos Modes.
Agora o seu Node já está funcionando. Você pode se conectar à ele por meio das interfaces. Se você quer acessar por TCP, crie uma interface TCP e edite a opção listen_ip e listen_port. Outras interfaces têm outras configurações, então veja a documentação.
Um cliente poderá conectar ao seu Node por meio de uma interface que tem um listener, ou seja, um endereço de entrada, como um IP ou uma porta Serial.

Algumas configurações legais

  1. Autenticação: você pode adicionar uma senha para certas interfaces. Se alguém que não sabe a senha tenta conectar, ele dá erro de autenticação e barra a conexão. A opção é passphrase. Você adiciona ela embaixo de uma entrada de interface.
  2. Responder à probes: se você quiser configurar o Node para responder a pings do Reticulum (probes), a opção respond_to_probes deve estar ativa. O padrão é não responder à probes. Essa opção está na seção [reticulum].
  3. Nome da rede: esse pode ser um pouco complicado de entender, mas você pode configurar um nome de rede para cada interface, e cada interface que tiver um nome de rede especificado só poderá se comunicar por meio daquela rede. Assim, você pode ter, por exemplo, três interfaces em um Node, mas duas delas são de uma rede e a outra é de outra rede. Assim, elas estão separadas. A opção é network_name. Eu mesmo não entendi essa opção 100%.

Node do NomadNet

Esse é o guia para hospedar um "site" na NomadNet. NomadNet usa um tipo de arquivo chamado micron, como se fosse o HTML da Web.
Edite o arquivo ~/.nomadnetwork/config e ache a linha [node]. Tudo para baixo dessa linha é referente a um Node.

O root do Node fica em ~/.nomadnetwork/storage/pages/. Lá você coloca um index.mu que é o equivalente do index.html. Agora experimente e se divirta!

Node de Propagação

Com um Node NomadNet: Abra o arquivo de configuração do nomadnet (~/.nomadnetwork/config) e desative a opção disable_propagation. Isso fará com que ele também seja um Node de Propagação.
Sem um Node NomadNet: Rode o comando lxmd -p. Ele rodará o daemon do LXMF com a opção de propagação. Se você não tiver esse comando, instale via pip o lxmf: pip install lxmf.

Não gosto de TUI! Dá-me um WebApp!

Seu desejo é uma ordem: MeshChat e Sideband.
O MeshChat é um aplicativo que roda um servidor Web e se conecta com o daemon Reticulum. Ele é bem agradável e bonito. Não cobrirei o setup aqui, porém ele vem com defaults que funcionam. Apenas baixe o release e rode o programa em Python.
O Sideband é um programa que tem uma interface própria e funciona em Android, Linux e MacOS.
O meu cliente gráfico preferido é o MeshChat.


Então é isso. Agora você tem o conhecimento e ferramentas para interagir com essa rede fantástica!
Se você me achar lá, mande um oi! Se tiver qualquer dúvida, pode me mandar também!
Eu não cobri aqui, porém há imagens para Docker de Reticulum e NomadNet, o que pode facilitar o deploy de Nodes.

PS: Se você rodar um Node, me mande para eu me conectar diretamente à ele.