
O projeto Invisible Internet (a seguir simplesmente I2P) fornece aos desenvolvedores uma plataforma para o desenvolvimento de aplicativos com requisitos aprimorados de privacidade do usuário. Essa é uma rede virtual em cima da Internet normal, onde os nós podem trocar dados sem divulgar seu endereço IP real. Em vez de endereços IP dentro da Internet invisível, as conexões ocorrem entre endereços virtuais chamados Destino I2P. Você pode ter qualquer número desses endereços e alterá-los mesmo para cada conexão, pois eles não fornecem ao outro lado nenhuma informação sobre o endereço IP real do cliente.
Este artigo descreve as coisas básicas que você precisa saber para escrever aplicativos I2P. Exemplos de código são fornecidos no Python usando a estrutura assíncrona interna assíncrona.
Ativando a API SAM e instalando o i2plib
O I2P oferece várias APIs para interagir com aplicativos clientes. Para aplicativos Java, o I2CP é usado; para aplicativos cliente-servidor regulares, podem ser usados proxies I2PTunnel, HTTP e Socks. Faremos uma aplicação em Python, então escolha SAM . Por padrão, no cliente Java original, a API do SAM está desativada, portanto, é necessário ativá-la. Vá para o console da web do roteador I2P, página "I2P internals" -> "Clients". Marque a caixa "Executar na inicialização" e clique em "Iniciar" e "Salvar configuração do cliente".

No C ++, o cliente i2pd SAM já está ativado por padrão.
Para facilitar o uso da API SAM, escrevi a biblioteca Python i2plib . Você pode instalá-lo via pip ou baixar o código-fonte do GitHub.
pip install i2plib
Como essa biblioteca trabalha com a estrutura assíncrona assíncrona incorporada , lembre-se de que exemplos de código também são obtidos de funções assíncronas (corotinas) que funcionam no loop de eventos. Exemplos de uso adicionais estão no repositório .
Criação de destino e sessão
Na sua essência, o I2P Destination é um conjunto de chaves de criptografia e assinatura de dados. As chaves públicas desse pacote são publicadas na rede I2P e são usadas no lugar do endereço IP para criar conexões.
Geraremos o i2plib.Destination , que usaremos no futuro:
dest = await i2plib.new_destination() print(dest.base32 + ".b32.i2p")
O endereço base32 é o hash no qual outros pares podem encontrar o seu destino na rede. Se você planeja usar esse destino em seu programa continuamente, salve o conteúdo de dest.private_key.data em um arquivo local.
Agora você pode criar uma sessão SAM, o que significa literalmente tornar on-line este destino on-line:
session_nickname = "test-i2p"
É importante observar que o destino estará online enquanto o soquete session_writer estiver aberto. Se você deseja "desativar" este destino da rede, ligue para session_writer.close ().
Fazendo conexões de saída
Agora que o Destino está online, podemos usá-lo para se comunicar com outros nós. Por exemplo, conecte-se ao nó "udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p", envie uma solicitação GET HTTP e leia a resposta (existe um servidor da web "i2p-projekt.i2p"):
remote_host = "udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p" reader, writer = await i2plib.stream_connect(session_nickname, remote_host) writer.write("GET /en/ HTTP/1.0\nHost: {}\r\n\r\n".format(remote_host).encode()) buflen, resp = 4096, b"" while 1: data = await reader.read(buflen) if len(data) > 0: resp += data else: break writer.close() print(resp.decode())
Aceitar conexões de entrada
Ao conectar-se a outro host, como você pode ver, tudo é simples, mas com a aceitação da entrada, há uma nuance. Quando um novo cliente se conecta a você, o SAM envia ao soquete ASCII uma sequência com o destino desse cliente. Como Destino e dados podem vir em uma única peça, é necessário considerar isso.
É assim que um servidor PING-PONG se parece, que aceita uma conexão de entrada, salva o Destino do cliente na variável remote_destination e envia o PONG de volta:
async def handle_client(incoming, reader, writer): """ """ dest, data = incoming.split(b"\n", 1) remote_destination = i2plib.Destination(dest.decode()) if not data: data = await reader.read(BUFFER_SIZE) if data == b"PING": writer.write(b"PONG") writer.close()
Ele descreve o uso do protocolo Streaming, que executa as funções do TCP / IP em uma rede I2P. A API SAM também fornece a capacidade de enviar e receber datagramas anônimos, semelhantes ao protocolo UDP. Essa funcionalidade ainda não está disponível no i2plib e será adicionada posteriormente.
Essa é apenas a informação mais básica, mas já é suficiente para iniciar seu projeto no I2P. A Internet invisível é adequada para escrever vários aplicativos nos quais é importante, primeiro, manter a privacidade dos usuários. A rede não impõe restrições aos desenvolvedores; pode ser um aplicativo cliente-servidor ou P2P.