--- title: Partager un fichier via BitTorent sous Debian date: 2024-03-28 categories: - Geekeries summary: "J'ai passé une bonne heure à trouver comment faire, avec étonnamment peu de documentation explicite. Je vous livre les quelques commandes magiques 🎉." intro: 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 partager 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 😉. imgExplanation: 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 [Transmission](https://wiki.archlinux.org/title/Transmission), un client [BitTorrent](https://fr.wikipedia.org/wiki/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 : ```bash sudo apt install transmission-daemon transmission-cli ``` Puis on lance le daemon Transmission : ```bash sudo systemctl start transmission-daemon ``` On peut vérifier sur quel port il écoute : ```bash sudo ss --tcp -pn ESTAB [...] REDACTED_IP: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. {{}}Si vous avez un pare-feu restrictif, c'est le moment d'ouvrir le port `51413`.{{}} ## Configurer Transmission Transmission a la fâcheuse habitude d'écraser sa configuration au redémarrage s'il n'est pas arrêté lors de la modification. On commence donc par stopper le daemon : ```bash sudo systemctl stop transmission-daemon ``` Pour nous faciliter la vie, on va changer un paramètre dans le fichier de configuration : ```bash sudo vim /etc/transmission-daemon/settings.json ``` On passe `rpc-authentication-required` à `false`. L'authentification RPC est souvent utilisée pour contrôler Transmission à distance. Ici, on se facilite les commandes. {{}}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 læ plus strict·e niveau sécurité 😇.{{}} On redémarre le daemon : ```bash 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 à partager ; - Une liste de [**trackers**](https://fr.wikipedia.org/wiki/Tracker_BitTorrent). Les « trackers » sont des genre d'annuaires où s'enregistrent les pairs possédant tout ou partie des fichiers d'un torrent. Ces pairs sont appelés **seeders**, ils partagent. Les autres, qui veulent récupérer des fichiers, sont des **leechers**. Grâce aux trackers, les leechers récupèrent la liste des seeders 🌱. On peut être les deux à la fois d'ailleurs : récupérer un morceau de fichier tout en en partageant un autre. Une fois cette liste récupérée, la transmission se fait en 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](https://igm.univ-mlv.fr/~dr/XPOSE2013/bittorrent/ext.html).{{}} 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 ; ils peuvent être suspendus ou surchargés. 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, et pour éviter le côté « centralisation », par vraiment dans la philosophie des torrents. {{}}Sur [ce dépôt](https://github.com/ngosang/trackerslist), tu trouveras une liste très active des trackers publics fonctionnels.{{}} Allez, c'est parti ! Imaginons maintenant que tu aies un dossier `perfectly-legal` que tu souhaites seeder. Voici comment créer le fichier torrent : ```bash # Rajouter plusieurs trackers en répétant l'option -t ; j'en mets 4 ou 5. transmission-create perfectly-legal -t [-t ...] -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 : entre autres, 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. {{}}Utilise la commande `transmission-show perfectly-legal.torrent` pour l'inspecter.{{}} ## 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 peut seeder ! ```bash rsync -av perfectly-legal /var/lib/transmission-daemon/downloads/ ``` {{}}Tu peux modifier le chemin dans le fichier de conf, clé `download-dir` 😉.{{}} Puis tu peux lancer le seed : ```bash transmission-remote -a perfectly-legal.torrent ``` En réalité, cette commande pourrait aussi lancer un leech, si le fichier était hébergé quelque part. C'est le principe même des torrents : tu peux être à la fois seeder et leecher. Ici, 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 : ```bash 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 alors aux différents trackers qu'il a le dossier et peut le seeder. Côté client, j'utilise [qBitTorrent](https://www.qbittorrent.org/) pour gérer les torrents 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 le dossier est 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... ```bash 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](https://transmissionbt.com/), * Et te connecte... Tu as une interface pour contrôler le démon à distance. Et, globalement... ben c'est une seedbox ! 🚀