Utiliser I2P sous OpenBSD

Publié le 11/05/2021 et écrit par Vincent Finance

Catégorie : #openbsd

Présentation de I2P

I2P (pour Invisible Internet Project, soit Projet pour un Internet Invisible) est un réseau de type pair-à-pair (P2P) qui construit un réseau par-dessus un autre et qui permet de créer des connexions anonymes entre plusieurs machines. Il repose sur un logiciel qui crée des tunnels et qui permet aux applications de faire transiter des informations via une communication chiffrée de bout en bout.
Lorsqu'une machine souhaite communiquer avec une autre, celle-ci utilise un ensemble de clés (une clé privée et une clé publique) et une adresse en base 32 pour s'identifier sur le réseau et se connecter. Le trafic passe alors par plusieurs machines via des tunnels avant d'atteindre sa destination et d'être déchiffré par la clé privée de la machine destinataire. Les autres machines du réseau ne servent alors qu'à faire passer les paquets sans savoir exactement d'où ils viennent. Ainsi, les paquets sont difficilement traçables pour un tiers et les informations concernant le destinataire ou l'expéditeur sont chiffrées à l'aide d'une clé publique et ne peuvent être déchiffrées que par la clé privée de la machine réceptrice.

I2P fait partie de la même catégorie que Tor, Freenet ou GNUnet, à la différence près qu'il cherche avant tout à fournir une couche de transport et à créer un réseau indépendant du réseau Internet classique, les services I2P n'étant pas accessible depuis l'extérieur. I2P permet non seulement d'échanger des fichiers via le protocole BitTorrent, mais aussi de naviguer sur des sites dédiés (des eepsites) et d'utiliser des services comme IRC, XMPP ou encore des serveurs mail.

Le projet derrière I2P fournit un routeur codé en Java et il peut être installé sur n'importe quel type de machine. Néanmoins, sous OpenBSD, on trouvera i2pd, une alternative plus légère codée en C++ et qui a l'avantage d'être plus simple à utiliser et à configurer. C'est ce que je vais utiliser ici.

=> FAQ d'i2pd pour plus de détails

Pourquoi I2P et pas Tor ?

En plus de la grande différence de fonctionnement par rapport à Tor que j'ai décrite plus haut, d'autres détails sont à prendre en compte si on souhaite comparer I2P et Tor.

Il faut savoir qu'I2P a été conçu, à la base, comme un réseau alternatif et isolé du reste d'Internet. Ainsi, il n'existe pas d'adresse IP sur I2P, puisque le réseau utilise des adresses en base 32 générées aléatoirement pour établir des communications. Il a l'avantage de partager des listes communes contenant une correspondance entre l'adresse en base 32 d'une machine et un nom de domaine facilement mémorisable : on appelle cela des carnets d'adresses. Pour les habitués, c'est l'exact équivalent d'un fichier hosts.txt.
Il faut également noter qu'un routeur I2P va générer un grand nombre de tunnels entrants et sortants et que le trafic d'une même session TCP peut passer par des tunnels différents. Par exemple, les morceaux d'un fichier partagé avec BitTorrent sur I2P ne passeront pas par le même endroit, ce qui renforce l'anonymat de l'utilisateur et l'empêche de se faire tracer facilement.

Schéma d'exemple de communication sous I2P : des lignes vertes et rouges (symboles du trafic entrant et sortant) sont créées aléatoirement entre le client, le serveur et plusieurs machines situées sur le chemin entre les deux
Exemple de communication sous I2P (sur la base d'un schéma de Solène Rapenne) : les lignes vertes représentent le trafic entrant et les lignes rouges le trafic sortant

Tor, quant à lui, permet surtout de sortir vers l'extérieur en étant anonyme : il est possible d'aller nativement sur des sites Internet conventionnels dans un navigateur Tor. De plus, le circuit d'une communication avec Tor va passer toujours passer par le même circuit pendant un espace de temps assez long (jusqu'à fermeture du navigateur ou bien pendant plusieurs dizaines d'heures en fonction de vos préférences), ce qui peut permettre de retrouver l'origine de la requête initiale si on ne fait pas attention. Cela permet pour autant à Tor d'être plus rapide et plus simple à utiliser qu'I2P, d'autant qu'il n'est pas possible en l'état de sortir d'I2P pour aller sur l'Internet conventionnel. S'il existe bien des proxys de sortie, ceux-ci sont fortement déconseillés, car il peut révéler plus facilement l'identité de la machine qui essaye de sortir du réseau I2P.

Pour résumer plus simplement, si Tor permet d'aller sur Internet de manière anonyme, I2P permet d'avoir accès à un réseau alternatif et non dépendant d'un opérateur en particulier (les tunnels étant régénérés si jamais une coupure est détectée entre deux morceaux).

Utilisation de i2pd

Installation

Pour installer i2pd, tapez :

$ doas pkg_add -i i2pd

Une fois l'installation terminée, on doit d'abord effectuer quelques étapes pour pouvoir configurer i2pd et optimiser le logiciel.

Étapes préparatoires

Ajouter une classe de login

Par défaut, les limitations imposées aux démons sous OpenBSD sont trop restrictives pour que i2pd fonctionne correctement. Il est alors recommandé d'ajouter une classe de login dédiée qui permet d'augmenter les limites pour ce logiciel uniquement :

# vi /etc/login.conf
[...]
i2pd:\
    :openfiles-cur=8192:\
    :openfiles-max=8192:\
    :tc=daemon:

# [ -f /etc/login.conf.db ] && cap_mkdb /etc/login.conf 

Ajuster les limites du noyau

Si besoin, il convient également d'augmenter les limites imposées dans le noyau, pour que le processus de i2pd puisse avoir de meilleurs performances. Si vous avez déjà augmenté cette limite pour un autre logiciel comme MariaDB, cette étape est alors facultative.

# sysctl kern.maxfiles=16000
# echo "kern.maxfiles=16000" >> /etc/sysctl.conf

Configuration de i2pd

i2pd.conf

La configuration principale se passe dans le fichier /etc/i2pd/i2pd.conf. Ce fichier sert à changer le comportement d'i2pd et à configurer les tunnels principaux, à savoir le proxy HTTP pour aller sur les eepsites et le proxy SOCKS qui servira à faire transiter tous types de communications vers le réseau I2P (connexion SSH, serveur mail, IRC, XMPP, etc). En plus des options par défaut, j'ai rajouté quelques options utiles pour avoir un routeur pleinement fonctionnel :

## Sert à confirmer l'usage du fichier tunnels.conf
tunconf = /etc/i2pd/tunnels.conf
[...]
## Active les logs et les stocke dans /var/log/daemon
log = syslog
loglevel = warn
logclftime = true
[...]
### Il convient de choisir un port aléatoirement et non utilisé
port = 52470
[...]
## Active IPv6 (si supporté)
ipv6 = true
[...]
## Bandwidth configuration
bandwidth = O  ### Vu que j'ai la fibre, je mets une limite plus élevée
share = 100
[...]
[http]
## Web Console settings
enabled = true
## Address and port service will listen on
address = 192.168.2.1   ### Permet d'accéder à la console depuis mon LAN 
port = 7070
[...]
[httpproxy]
enabled = true
## Address and port service will listen on
address = 192.168.2.1   ### Permet d'aller sur le proxy HTTP depuis mon LAN
port = 4444
[...]
[socksproxy]
enabled = true
## Address and port service will listen on
address = 192.168.2.1   ### Permet d'aller sur le proxy SOCKS depuis mon LAN
port = 4447

Il convient aussi d'ouvrir les ports des proxys, de la console Web et le port principal avec des règles dans votre pare-feu PF.

tunnels.conf

Le deuxième fichier de configuration, /etc/i2pd/tunnels.conf, sert quant à lui à créer d'autres types de tunnels pour faire transiter des informations. Par défaut, ce fichier contient des exemples de tunnels clients, c'est-à-dire des tunnels qui vont renvoyer le trafic de votre routeur vers un serveur présent sur I2P. Les exemples présentés servent à aller sur des serveurs IRC ou un serveur mail, mais libre à vous d'en rajouter d'autres si besoin :

[IRC-IRC2P]
type = client
address = 127.0.0.1
port = 6668
destination = irc.postman.i2p
destinationport = 6667
keys = irc-keys.dat

[IRC-ILITA]
type = client
address = 127.0.0.1
port = 6669
destination = irc.ilita.i2p
destinationport = 6667
keys = irc-keys.dat

Également, il est possible d'ajouter des tunnels serveurs, c'est-à-dire des tunnels qui vont renvoyer le trafic externe vers des serveurs situés derrière votre routeur. Cela permet ainsi de rendre accessible un serveur Web, un serveur XMPP ou tout autre service que vous voulez ouvrir sur I2P. Dans cet exemple, j'ajoute un serveur Web dédié et un accès vers mon serveur gemini :

[GEMINI]
type = server
host = 10.10.0.2
port = 1965
keys = gemini.dat

[HTTP-SERVER]
type = http
host = 10.10.0.2
port = 8080
keys = http-server.dat

Pour d'autres exemples, vous pouvez vous référer à la documentation officielle d'i2pd :

=> https://i2pd.readthedocs.io/en/latest/tutorials/http/

Lancer le service

Enfin, pour activer le démarrage automatique de i2pd et le lancer, il suffit de faire :

# rcctl enable i2pd
# rcctl start i2pd

Après lancement, il vous suffit d'ouvrir un navigateur Web et d'aller sur l'adresse http://127.0.0.1:7070/ pour aller sur la console Web d'i2pd.

Une fois sur la console, vous trouverez quelques statistiques générales et un menu sur la droite qui vous emmènera sur différentes pages de l'interface de votre routeur. Je vais ici surtout décrire les pages les plus importantes.
La page Tunnels sert à indiquer les tunnels existants sur votre routeur et leur état (si la connexion est établie ou non et si le tunnel vient d'expirer).
La page I2P Tunnels vous affichera les adresses en base32 de vos tunnels clients et de vos services, ainsi qu'une petite description (contrairement à la page Local destinations qui n'affiche que les adresses). Ces dernières donnent un accès direct à vos serveurs et sont à communiquer aux registraires I2P pour ajouter un nom de domaine lisible en .i2p. Ainsi, il sera plus facile d'aller sur vos machines depuis n'importe quel endroit du réseau.


Un commentaire à ajouter ?

Pour ajouter votre commentaire, envoyez directement un mail ici