Monter un tracker BitTorrent sur Linux (Fedora Core 3)

Gaël Donat

Cet article va vous expliquer comment monter un tracker PHP pour faire du BitTorrent, ainsi qu'un client BitTorrent en seeding perpétuel.

- Titre : Monter un tracker BitTorrent sur Linux (Fedora Core 3)

- Auteur : Gaël Donat

- Parution : 3 avril 2005

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2013 Gaël DONAT. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Prérequis

- II-A. Prérequis du tracker

- II-B. Prérequis du client BitTorrent

- III. Notions

- IV. Tracker ("Serveur" BitTorrent)

- IV-A. Installation

- IV-B. Configuration

- IV-C. Modification de l'installation

- V. Client BitTorrent

- V-A. Installation du client BitTorrent

- V-B. Utilisation du client BitTorrent

- VI. Mise en route du tracker

- VII. Mise en route du client BitTorrent

- VII-A. Seeder le fichier sur son ordinateur personnel

- VII-B. Seeder sur le serveur

- VII-C. Couplage de screen et du client BitTorrent

- VIII. Remerciements

I - Introduction

Le BitTorrent fait aujourd'hui partie des technologies très en vogue sur Internet pour transmettre des fichiers volumineux à un grand nombre d'individus.
Le BitTorrent est un système de P2P, de PC à PC, les clients sont mis directement en relation entre eux sans intermédiaire, le serveur étant là uniquement pour dresser la liste des clients disponibles.
Je fais un aparté pour préciser que le P2P n'est pas illégal, le P2P sert aujourd'hui à partager de très nombreuses ressources mises à disposition par des personnes n'ayant pas forcément les capacités financières pour supporter un hébergement avec beaucoup de bande passante.
On peut trouver notamment les différents releases de Linux, les musiques de certains auteurs qui veulent diffuser gratuitement leurs œuvres, les versions d'évaluation des logiciels, etc.

Concernant le BitTorrent, le fonctionnement est assez simple, lorsque vous téléchargez un fichier .torrent ce dernier contient deux informations importantes : le HASH File et l'URL du tracker.
Votre client BitTorrent contacte le tracker indiqué dans le fichier .torrent et demande quelles sont les sources disponibles pour le fichier possédant ce HASH File, le tracker vous indique une liste d'IP à contacter, dès lors votre client contacte directement ces adresses et commence le téléchargement.
La liste d'IP est constituée simplement avec les personnes qui téléchargent comme vous le fichier, vous téléchargez chez eux, et eux téléchargent chez vous.

II - Prérequis

Dans cet article nous verrons l'installation du tracker BitTorrent ainsi que d'un client BitTorrent pour faire du seeding sur le serveur.
Les deux points abordés sont totalement indépendants l'un de l'autre.

II-A - Prérequis du tracker

Le tracker que je vous propose d'installer est PhpTracker, c'est donc comme son nom l'indique un tracker developpé en PHP, il faut donc pour le faire tourner un serveur Web avec le support de PHP et une base MySQL. Je vous oriente vers l'excellent blog de c_chatelain pour l'installation de Apache/PHP/Mysql.

Je n'aborderai pas non plus la théorie du BitTorrent ni du P2P, si le fonctionnement vous intéresse, je vous dirige vers l'article de Fabrice Schuler : Étude et utilisation des technologies de Peer to Peer (P2P).
Notez cependant que le BitTorrent fonctionne sur une architecture centralisée à serveurs multiples.

II-B - Prérequis du client BitTorrent

Le client BitTorrent que je vous propose d'installer est le client officiel BitTorrent, ce dernier est developpé en Python et possède un mode graphique ou console, je n'aborderai que le mode console.
Pour pouvoir faire fonctionner le client il faut avoir Python (2.2.1 et supérieur) et éventuellement l'utilitaire Screen qui permet de faire tourner des processus en console dématérialisée.

III - Notions

Nous avons évoqué précédemment quelques notions comme tracker et hash file, je vais dresser ici un petit lexique des termes utilisés dans cet article.

Terme

Description

Hash

Donnée permettant d'identifier un fichier par un ID unique

Tracker

Serveur centralisant les demandes et offres pour un ou plusieurs fichiers

Seeder

Personne qui partage un ou plusieurs fichiers déclarés dans le tracker

Leecher

Personne qui télécharge un ou plusieurs fichiers déclarés dans le tracker

Seeding

Action de partager un fichier

Leeching

Action de télécharger un fichier

Bt

Diminutif de BitTorrent

Peer

Littéralement : Pair

P2P ou Peer To Peer

Définit la façon de se connecter, à opposer à une relation Client-Serveur pour lequel toutes les données passent par un serveur central, les données dans une connexion P2P transitent directement de client à client ayant le même statut (des pairs)

IV - Tracker ("Serveur" BitTorrent)

IV-A - Installation

Je vais utiliser le chemin /www/ comme racine pour mon site web, bien sûr vous devez adapter le chemin quand c'est nécessaire.
Téléchargez le fichier source du tracker PHP sur le site officiel en tapant les commandes suivantes :

wget http://dehacked.2y.net:6969/PHPBTTracker--1.5e.zip         ' Récupère le fichier sur le serveur

unzip PHPBTTracker--1.5e.zip                                    ' Dézippe le fichier Zip

cd PHPBTTracker--1.5e

mkdir /www/tracker/                                             ' Crée le répertoire dans le document-root du serveur Web

cp * /www/tracker/                                              ' Copie les fichiers dans le nouveau répertoire

cd /www/tracker/

cp config-sample.php config.php                                 ' Duplique le fichier de configuration

chmod 755 *                                                     ' Donne les droits sur les fichiers

IV-B - Configuration

À ce stade il vous faut une base MySQL ainsi qu'un compte utilisateur et un mot de passe (l'utilisateur doit avoir des droits de création/suppression de tables).
Ouvrez votre navigateur et connectez-vous à l'adresse : http://votredomaine/tracker/install.php

Cliquez sur l'option 1, car vous avez déjà une base en fonctionnement.

Cliquez sur "Finish" pour terminer la configuration.

À ce stade vous devez effacer le fichier install.php du serveur Web.

Ouvrez ensuite le fichier config.php et modifiez les sections suivantes :

$upload_username = "gael";

$upload_password = "youpi";

$upload_username et $upload_password sont les informations de connexion pour l'utilisateur habilité à déclarer des fichiers Torrent sur le serveur, sans cela n'importe qui peut déclarer n'importe quoi et cela deviendrait rapidement ingérable.

$dbhost = "linux-srv";          ' nom du serveur ou adresse IP

$dbuser = "bt-user";            ' utilisateur

$dbpass = "bt-passwd";          ' mot de passe

$database = "bt-db";            ' nom de la base de données

Là vous retrouvez les informations de connexion à la base de données que vous voulez utiliser.

IV-C - Modification de l'installation

Par défaut Le tracker est installé dans un seul répertoire, pour des soucis de sécurité il peut être intéressant de scinder en deux l'installation pour réaliser une partie utilisateur et une partie administration protégée par un fichier .htaccess.
Je vais mettre la partie admin dans /www/tracker/admin/ soit dans un sous-répertoire du tracker.
Pour cela il suffit de déplacer les fichiers newtorrents.php (qui permet d'ajouter des nouveaux Torrent) et deleter.php (qui permet d'effacer des torrents existants)

mkdir admin

mv deleter.php admin

mv newtorrents.php admin

Il faut ensuite modifier ces deux fichiers pour les includes PHP.
Ouvrez d'abord le fichier deleter.php et modifiez les trois lignes ci-dessous :

<link rel="stylesheet" type="text/css" href="style.css" />

require_once("config.php");

require_once("funcsv2.php");

En les remplaçant par :

<link rel="stylesheet" type="text/css" href="../style.css" />

require_once("../config.php");

require_once("../funcsv2.php");

Ouvrez ensuite le fichier newtorrents.php et recherchez les cinq lignes suivantes :

<link rel="stylesheet" type="text/css" href="style.css" />

require_once ("config.php");

require_once ("funcsv2.php");

require_once ("BDecode.php");

require_once ("BEncode.php");

Et remplacez-les par :

<link rel="stylesheet" type="text/css" href="../style.css" />

require_once ("../config.php");

require_once ("../funcsv2.php");

require_once ("../BDecode.php");

require_once ("../BEncode.php");

Je vous laisse le soin de mettre en place vous-même votre protection par htaccess.

Il nous reste encore une modification à faire, modifier le fichier mystats.php, ce fichier permet d'afficher les statistiques du tracker et peut être public. Le plus simple est d'en faire le fichier index.php du répertoire :

mv mystats.php index.php

Voilà l'installation du tracker est terminée.
Normalement en vous connectant sur http://votredomaine/tracker vous devez arriver sur une page similaire à celle-ci :

V - Client BitTorrent

V-A - Installation du client BitTorrent

Je vais continuer à utiliser /www/ comme répertoire racine pour mes pages web.

Téléchargez BitTorrent sur le site officiel en tapant les commandes suivantes :

wget http://www.bittorrent.com/dl/BitTorrent-4.0.1.tar.gz       ' Recupère le fichier sur le serveur

tar -zxvf BitTorrent-4.0.1.tar.gz                                       ' Dézippe le fichier Zip

mv BitTorrent-4.0.1 /usr/local/bittorrent                       ' déplace le répertoire dans le usr/local

cd /usr/local/bittorrent

chmod 777 *.py                                  ' Donne les droits sur les fichiers

Normalement le client est installé.

V-B - Utilisation du client BitTorrent

Maintenant que le client BitTorrent est installé, on va l'utiliser pour deux choses, la première utilisation est la génération de fichier .torrent à partir de fichiers source, et la seconde utilisation est le seeding des .torrent générés. Pour cela nous devons nous familiariser avec les fichiers du client BitTorrent que nous utiliserons.
Il existe bien d'autres fichiers, mais je ne rentrerai pas dans le détail de leur description étant donné que je ne m'en servirai pas.

Fichier

Fonction

btlaunchmanycurses.py

Permet de lancer plusieurs downloads en 1 seul process

btmaketorrent.py

Permet de générer des fichiers .torrent

Vous pouvez également télécharger la version Windows du client si vous souhaitez générer les fichiers .torrent sur votre ordinateur puis les uploader sur le serveur.

VI - Mise en route du tracker

Imaginons que sur votre serveur vous vouliez partager les quatre fichiers ISO de votre Linux Fedora Core 3, il faut tout d'abord générer les fichiers .torrent grâce à la commande btmaketorrent.py, les arguments sont l'URL du tracker (pour l'annonce), le nom du fichier et éventuellement un commentaire.

./btmaketorrent.py http://votresite/tracker/tracker.php FC3-i386-disc1.iso --comment "CD1 de la distribution Fedora Core 3"

Il suffit de faire la même chose pour chacun des quatre CD et vous obtiendrez quatre fichiers nommés par défaut avec le nom du fichier.torrent « FC3-i386-disc1.iso.torrent » dans notre exemple.

Le fichier .torrent doit être mis à disposition sur un serveur ftp ou un serveur web pour que les utilisateurs puissent télécharger le fichier.
Téléchargez vous-même le fichier .torrent sur votre PC, vous en aurez besoin pour le déclarer dans le tracker.

Passons maintenant à la phase de déclaration du fichier .torrent dans le tracker.
Aller à l'adresse hhttp://votresite/tracker/admin/newtorrents.php, vous obtenez l'image suivante :

Renseignez dans le premier champ le chemin vers le fichier torrent, les autres informations sont facultatives, je vous laisse le soin de les renseigner ou non.
Cliquez maintenant sur Create.

À ce stade le fichier est déclaré dans le tracker et vous pouvez donc commencer à diffuser le fichier .torrent.
Néanmoins il reste un dernier point à régler, le fichier n'a pas de source pour alimenter les téléchargements, il faut donc sourcer (seeder) le fichier. Là deux solutions s'offrent à vous, soit vous le faites faire par le serveur, soit vous le faites depuis votre ordinateur personnel, le problème est que dans le dernier cas, votre bande passante en upload est assez limitée, n'espérez pas atteindre plus de 60 ko/s maximum (cela va surtout dépendre de votre FAI), c'est assez peu face à la bande passante d'un hébergement dédié (généralement plusieurs mégas).

VII - Mise en route du client BitTorrent

VII-A - Seeder le fichier sur son ordinateur personnel

La manipulation pour faire seeder son ordinateur personnel est assez simple.
Ouvrez votre client BitTorrent, désignez le fichier .torrent (FC3-i386-disc1.iso.torrent) et indiquez-lui le fichier iso si vous l'avez déjà (FC3-i386-disc1.iso), le client BitTorrent va s'apercevoir que le fichier est déjà complet, et va se mettre à seeder, vous pouvez vous connecter à votre tracker pour vérifier qu'un client est bien en seeding.

Voilà c'est maintenant fini !

VII-B - Seeder sur le serveur

Pour faire seeder le serveur nous allons donc utiliser l'autre script python nommé btlaunchmanycurses.py, ce dernier prend de nombreux arguments, personnellement je n'en utilise que trois : save_dir, torrent_dir et max_upload.

save_dir permet de spécifier dans quel répertoire sauvegarder les fichiers téléchargés. torrent_dir permet de préciser dans quel répertoire se trouvent les fichiers .torrent. max_upload permet de définir la bande passante maximum en upload.

Imaginons que vos fichiers iso de la Fedora soient dans le répertoire /home/user/src_iso et que vos fichiers torrent soient dans /www/torrents/ alors la ligne de commande à exécuter sera :

./btlaunchmanycurses.py --save_in /home/user/iso/ --torrent_dir /www/torrents/ --max_upload 200

Normalement vous devez avoir sur l'écran de la console ceci :
La capture sera mise à jour plus tard.

Le client va se rendre compte que les fichiers existent déjà et va donc se mettre directement à seeder les fichiers.
Vous pouvez vérifier sur le fichier de statistiques du tracker que vous avez bien un client en seeding.

Malheureusement cette technique pose un problème, si vous coupez votre accès Telnet ou SSH, vous arrêterez automatiquement le client BitTorrent.
Laisser l'accès SSH ouvert en permanence n'est pas vraiment le plus adapté non plus, la solution est d'utiliser un utilitaire nommé screen (Screen), cet utilitaire permet de gérer des consoles virtuelles indépendantes.

VII-C - Couplage de screen et du client BitTorrent

L'utilisation de screen est assez simple, voici les commandes que nous allons utiliser :

- screen -dmS nom_console script_a_lancer

- screen -r nom_console

screen -dmS permet de créer une console virtuelle en mode détaché (d).
screen -r permet de la réattacher.
Pour redétacher la console, il suffit de faire CTRL+A CTRL+D

Créez un fichier client_bt.sh qui contient par exemple :

#!/bin/sh

./python /usr/local/bittorrent/btlaunchmanycurses.py --save_in /home/user/iso/ --torrent_dir /www/torrents/ --max_upload 200

et pour lancer le client en console virtuelle :

screen -dmS torrent /usr/local/bittorrent/client_bt.sh

Vous pouvez vérifier que le client est bien lancé, via la commande

screen -r torrent

Puis faites CTRL+A CTRL+D pour détacher l'écran.

Maintenant vous pouvez fermer votre accès SSH, le client continue à tourner en tâche de fond.

Voilà votre serveur BitTorrent est prêt.

VIII - Remerciements

Je tiens à remercier Beuss et armatatuxa pour la relecture attentive et la correction orthographique.