blog/content/posts/torrent/index.md

7.1 KiB

title date categories summary intro imgExplanation
Créer et seeder un torrent sous Debian 2024-03-28
Geekeries
J'ai passé une bonne heure à trouver comment faire, avec étonnamment peu de documentation explicite. Je vous livre les quelques commandes magiques 🎉. Récemment, j'ai du transmettre à une personne une archive d'une centaine de Go, dont le téléchargement derrière un `nginx` finissait toujours par échouer. J'ai alors décidé de créer un torrent et de le seeder depuis mon serveur, et j'ai été étonné du peu de documentation clé en main sur le sujet. Voilà ma petite contribution ; je suis preneur·se si vous trouvez quelque chose d'autre 😉. En image d'illustration, un extrait de la délicieuse [pub anti-piratage](https://en.wikipedia.org/wiki/You_Wouldn%27t_Steal_a_Car) maintes fois détournée.

Prérequis

On va utiliser Tranmission, un client BitTorrent libre très utilisé, qui a l'avantage de proposer une CLI simple d'utilisation et de pouvoir gérer la création de torrents.

Pour ce faire, on installe deux paquets :

sudo apt install transmission-daemon transmission-cli

Puis on lance le daemon Transmission :

sudo systemctl start transmission-daemon

On peut vérifier sur quel port il écoute :

sudo ss --tcp -pn
ESTAB [...] 54.38.93.217:51413 [...] users:(("transmission-da",pid=3840919,fd=24))

Le port 51413 est le port TCP par défaut de Transmission. Il existe plusieurs mécanismes pour échanger des fichiers via BitTorrent, et ici on utilisera le plus simple : Transmission annoncera qu'on peut contacter notre serveur sur ce port pour le récupérer.

{{}}Si vous avez un pare-feu type tout sauf whitelist, c'est le moment d'ouvrir le port !{{}}

Configurer Transmission

Transmission a la fâcheuse habitude de ré-écrire sa configuration au redémarrage s'il n'est pas arrêté lors de la modification.

On commence donc par stopper le daemon :

sudo systemctl stop transmission-daemon

On aura besoin de changer un paramètre dans le fichier de configuration :

sudo vim /etc/transmission-daemon/settings.json

On passe rpc-authentication-required à false. Ça facilitera l'usage de la CLI en désactivant l'authentification.

{{}}Pas d'inquiétude, une whitelist par défaut limite l'authentification à localhost, donc si vous avez l'entière maîtrise sur votre serveur, je n'y vois pas d'inconvénient majeur. Après, je ne suis pas le plus strict niveau sécurité 😇.{{}}

On redémarre le daemon :

sudo systemctl start transmission-daemon

Créer un torrent

Pour créer un torrent avec Transmission, on a besoin de deux choses :

  • Un répertoire ou un fichier à seeder ;
  • Une liste de trackers.

Les trackers sont de loin la méthode la plus utilisée pour trouver des pairs possédant une copie des fichiers d'un torrent. Les clients BitTorrent communiquent aux trackers quelles parties des fichiers ils peuvent seeder et comment les contacter, puis switchent sur le pair-à-pair.

{{}}Pour les plus curieux·se d'entre vous, il existe aussi une méthode entièrement décentralisée qui repose sur les tables de hachage distribuée.{{}}

Il existe des trackers publics et privés. Les trackers publics sont maintenus parfois par des associations, parfois par des individus, mais ils sont loin d'être stables. L'idéal est donc d'associer plusieurs trackers public à un torrent pour être sûr·e qu'au moins un des trackers soit accessible lors du leech.

{{}}Sur ce dépôt, tu trouveras une liste très active des trackers publics fonctionnels.{{}}

On a tout ce qu'il nous faut ! Imaginons maintenant que tu aies un dossier perfectly_legal que tu souhaites seeder. Voici comment créer le fichier torrent :

# Rajouter plusieurs trackers en répétant l'option -t ; j'en mets 4 ou 5.
transmission-create perfectly_legal -t <tracker_1> [-t <tracker_2> ...] -o perfectly_legal.torrent

{{}}Plus le dossier est gros, plus la création du torrent est longue ; plusieurs minutes pour 100Go.{{}}

Le torrent ne contient finalement pas grand chose : le nom du dossier, la liste des trackers et le hash du torrent, indispensable pour l'identifier sur les trackers. Ce hash dépend bien sûr du dossier et de son contenu.

Seeder le torrent

Avant de se mettre à seeder, il faut copier notre dossier perfectly_legal dans le dossier de téléchargement de Transmission, sinon le daemon ne se rendra pas compte qu'il a déjà une copie du fichier !

rsync -av perfectly_legal /var/lib/transmission-daemon/downloads/

{{}}Tu peux modifier le chemin dans le fichier de conf, clé download-dir. N'oubliez pas d'arrêter le daemon avant la modification, cf partie configuration 😉.{{}}

Puis on lance le seed (mais qui pourrait être un leech, c'est le même client !):

transmission-remote -a perfectly_legal.torrent

Transmission commence par se rendre compte qu'il possède le fichier et en vérifie l'intégrité. Tu peux suivre cette évolution comme ceci :

watch -n .1 transmission-remote -l
    ID   Done       Have  ETA           Up    Down  Ratio  Status       Name
     1   100%   502.4 MB  Done         0.0     0.0    0.0  Idle         perfectly_legal

Dès que tu es à 100%, c'est bon. Transmission annonce aux différents trackers qu'il peut seeder le dossier que tu veux partager.

J'utilise qBitTorrent pour gérer les torrent que je télécharge. Quand j'ouvre perfectly_legal.torrent et que je commence le téléchargement, chaque tracker m'indique un pair. Logique, c'est le serveur depuis lequel je seed. Quand je regarde ses informations, je vois :

{{

}}

Pas de surprise, c'est le port sur lequel écoute Transmission, comme on l'a vu lors de l'installation.

{{}}Pour être sûr·e que tout est cohérent, si tu attends la fin du téléchargement et que tu relances la commande suivante...

transmission-remote -l
    ID   Done       Have  ETA           Up    Down  Ratio  Status       Name
     1   100%   502.4 MB  Done         0.0     0.0    1.0  Idle         perfectly_legal

Tu vois maintenant que le ratio est à 1.0, c'est-à-dire que tu as seedé l'intégralité du dossier ! 🥳 {{}}

Conclusion

Ce billet montre juste comment partager un torrent. Le cas d'usage classique est un fichier très lourd à partager.

Mais on peut faire des merveilles avec Transmission, et très simplement ! Par exemple, si tu...

  • Ré-active l'authentification RPC (port 9091 par défaut, à ouvrir),
  • Élargit la liste blanche pour l'authentification (limitée à localhost par défaut),
  • Télécharge sur ton ordinateur le client Transmission,
  • Et te connecte...

Tu as une interface pour contrôler le démon à distance. Et, globalement... ben c'est une seedbox ! 🚀