samedi 23 janvier 2016

Créer un seedbox avec un raspberry pi.

Après que Free n'est rendu inutile sa seedbox avec ses DNS menteurs impossibles à changer (je parle de l'utilitaire de téléchargement : voir ici et ), je me suis enfin laissé acheté un raspberry pi 2. Le but était de remplacer la fonction seedbox qu'ils ont gaché, et de faciliter la connection de n'importe quel pc sur mon réseau domestique à mon service vpn.


Premièré étape : Installation du système de base

Je suis un afficionados d'archlinux, mais j'ai voulu revenir sur Debian, en effet je cherche de la stabilité et je n'ai pas besoin des dernières version des logiciels ni d'une quelconque interface graphique.

Je suis habitué à la netinstall, j'aime bien partir d'un système minimaliste j'ai donc récupéré une image de minibian qui à l'avantage d'être petite (je n'ai qu'une carte SD de 2 Go) et d'avoir un serveur ssh activé par défaut.

Ici je suppose que votre carte µSD est désignée par /dev/mmcblk0

wget http://sourceforge.net/projects/minibian/files/2015-11-12-jessie-minibian.tar.gz/download
tar -xvf 2015-11-12-jessie-minibian.tar.gz
cat 2015-11-12-jessie-minibian.img >> /dev/mmcblk0
sync
sync permée de vider les tampons des systèmes de fichiers (si l'écriture n'était pas complète).

Après l'écriture de l'image retirez et reconnectez la carte sd. Deux partition y sont présentent : la partition boot contenant les fichiers de configuration nécéssaires au démarrage. Et la deuxième partition (mmcblockp1 qui est là plus grande) qui contient le système qu'il nous faut redimensionner pour qu'elle complète totalement la carte. J'ai utilisé Gparted  car je suis un flemmard (voir avec resize2fs). Cette opération peur être réalisée après le premier boot avec l'utilitaire raspi-config.

Il ne reste plus qu'a nommer votre raspberry pi sans quoi vous pouvez rencontrer des problèmes de connection sur votre réseau. En utilisant votre gestionnaire de fichier il vous faut accéder à la deuxième partition de la carte et avec votre éditeur préfére :

Changez  /etc/hostname (j'ai choisi comme nom EEPRON à la place du minibian par défaut)
Modifiez /etc/hosts : mettez de nouveau le nom choisi à la place de minibian.
Ça donne quelque chose comme ça:

$cat /etc/hostname
EEPRON
$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 EEPRON

Premier boot:

La raspberry alimenté et connectée au réseau ethernet (compter 15 secondes de démarrage pour minibian), j'ai récupéré l'addrese ip en utilisant l'interface de la freebox, sinon imposez une adresse ip statique.
Pour imposer une adresse ip statique remplacez la ligne "iface eth0 line" dans /etc/network/interfaces par

iface eth0 inet static
address 192.168.0.222
netmask 255.255.255.0
gateway 192.168.0.254

Connection et création d'un utilisateur

Vous n'avez plus qu'a vous connecter sur la raspberry: dans un terminal tapez :

ssh root@192.168.0.xx

Informez le mot de passe "raspberry" et vous pouvez créer un utilisateur et ajoutez le à au groupe sudo pour pouvoir se passer du compte route.

adduser toto
adduser toto sudo

Petite mise à jour du système:

sudo apt-get update
sudo apt-get upgrade

Mettre le système à l'heure:

Pour mettre à jour le firmware il vous faut mettre à l'heure votre système (en effet le raspberry pi n'as pas d'horloge interne). Vous pouvez le faire manuellement avec date ou utiliser un serveur ntp afin que le système se mette à l'heure à chaque démarrage. Pour celà configurez /etc/default/ntpdate.

# The settings in this file are used by the program ntpdate-debian, but not
# by the upstream program ntpdate.

# Set to "yes" to take the server list from /etc/ntp.conf, from package ntp,
# so you only have to keep it in one place.
NTPDATE_USE_NTP_CONF=yes

# List of NTP servers to use  (Separate multiple servers with spaces.)
# Not used if NTPDATE_USE_NTP_CONF is yes.
NTPSERVERS="online.net"

# Additional options to pass to ntpdate
NTPOPTIONS=""

Ensuite pour forcer la synchronisation

systemctl stop ntp
ntpdate-debian online.net
systemctl enable ntp
systemctl start ntp

Personnellement j'utilise le serveur ntp de ma freebox, ici il est intelligent de remplacer directement mafreebox.free.fr par son adresse ip (192.168.0.254 pour moi). Ce sera utile si vous utiliser une connection VPN et faite un routage original.

Mise à jour du firmware du raspberry pi:

Le firmware fait environ 50 Mo

sudo apt-get install rpi-update 
sudo rpi-update

Pensez à redémarrer pour que le nouveau firmware soit chargé.

Autres paquets utiles

Si vous n'avez pas déjà redimmensionnée votre partition installer l'utilitaire:

sudo apt-get install raspi-config
sudo raspi-config

D'autres paramètres sont modifiable avec cette interface ncurses, mais bon rien ne vous empêche de modifier directement les fichiers sur votre partition /boot/config.txt. Toute modification nécessite un redémarrage.

Et puis quelques outils utiles si vous voulez avoir une connexion wifi (n'oubliez pas les firmware de vos dongle)

sudo apt-get install net-tools iw wireless-tools wpa_supplicant dbus aptitude

Finalement, si vous avez cette erreur au boot : cfg80211: Calling CRDA to update world regulatory domain. Alors installez
 
sudo apt-get install crda wireless-regdb

Client VPN avec PPTP

J'utilise le point to point tunelling pour me connecter à mon fournisseur vpn. Pour celà il faut installer:

sudo apt-get install pptp-linux

Voici ma configuration pour purevpn

~# cat /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client    server    secret            IP addresses
purevpn0s******* serveur_vpn "motdepasse" * 

~# cat /etc/ppp/peers/serveur_pptp
pty "pptp adresse.pointtoserver.com --nolaunchpppd"
name purevpn0s*******
remotename serveur_pptp
ipparam serveur_pptp
file /etc/ppp/options.pptp
require-mppe-128
refuse-eap noauth

Vous pouvez également utiliser les paramètres maxfail 0 et persist, ainsi votre connection se reconnectra/essayera de se connecter en boucle.

~# cat /etc/ppp/ip-up.d/serveur_pptp
#!/bin/bash
# This script is called with the following arguments:
# Arg Name
# $1 Interface name
# $2 The tty
# $3 The link speed
# $4 Local IP number
# $5 Peer IP number
# $6 Optional ``ipparam'' value foo

ip route replace default dev $1

Ici toute les connections par défault sont désomais routées par ppp0 (nom de l'interface). Ceci ne pause pas de problème pour le résaux local car par défaut :

~#ip route
default dev eth0 via 192.168.0.254 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.29 

192.168.0.254 est l'adresse de ma box, 192.168.0.29 celui de mon rapberry pi.
192.168.0.0/24 ou 192.168.0.* signifie toutes les adreses de mon réseau local. Ainsi dès que le système souhaite accéder à un périphérique réseau local, il est bien redirigé vers l'interface ethernet.

~# cat /etc/ppp/ip-down.d/serveur_pptp
#!bin/bash
killall rtorrent
ip route del $5
ip route replace default dev eth0 via 192.168.0.254

Ici je stoppe tous process rtorrent lorsque que la connection s'arrète (au cas où). Ce n'est pas élégant du tout, je suis sûre que l'on pourrait utiliser systemd pour rtorrent (cliquez moi). Je supprime ensuite le routage qui se met en place par défaut lorsque la connection pptp est lancée.

N'oubliez pas de rendre executables vous scripts:

sudo chmod+x /etc/ppp/ip-up.d/serveur_pptp
sudo chmod+x /etc/ppp/ip-down.d/serveur_pptp

Désormais vous pouvez vous connecter au serveur pptp avec les commandes:

pppd call serveur_pptp
#Ou avec :
pon serveur_pptp
#et stopper avec
poff serveur_pptp

Vous pouvez utiliser traceroute et route pour vérifier que votre tunnel est bien en place, exemple :

#vérifier que l'interface ppp0 existe bien et que les toutages sont bien en place
ip route
#vérifier que votre adresse sortante est bien celle du serveur pptp
traceroute www.google.fr

Rendre cette connection automatique

Par défault avec pppd et pon c'est le serveur de la configuration /etc/ppp/peers/provider qui est connecté, vous pouvez créer un lien symbolique de votre configuration vers /etc/ppp/peers/provider.
Pour rendre cette configuration automatique j'ai récupéré un un fichier ppp@.service d'archlinux car minibian ne l'a pas. Placez le dans /etc/systemd/system/ :

~# cat /etc/systemd/system/ppp\@.service
[Unit]
Description=PPP link to %I
Before=network.target

[Service]
ExecStart=/usr/sbin/pppd call %I nodetach nolog

[Install]
WantedBy=multi-user.target

Ensuite charger le module ppp_generic et activez le service ppp@votre_serveur :

modprobe ppp_generic
systemctl enable ppp@serveur_pptp.service
systemctl start ppp@serveur_pptp.service

J'ai vu d'autres possibilitées en utilisant le fichir /etc/network/interfaces que j'ai tenté sans grand succés.

Accéder à un partage Windows Freebox

Ma configuration pour la freebox :

~# cat /etc/fstab
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 errors=remount-ro,noatime,nodiratime,commit=120 0 1
//192.168.0.254/Disque\040dur /mnt/freebox cifs auto,user,username=freebox,rw,uid=1000,gid=1000,file_mode=0777,dir_mode=0777,noperm 0 0

Encore une fois 192.168.0.254 est l'adresse de ma freebox. \040 représente un espace, ça peut être pratique pour un chemin avec des espaces sur un partage samba.

Noubliez pas de créer /mnt/freebox avec les bon droits d'accès.

sudo mkdir /mnt/freebox
mount /mnt/freebox
sudo chmod -R a+rw /mnt/freebox

Mon but est d'utiliser le partage pour sauvegarder les torrents de distribution linux que je télécharge sur mininova.

N.B:

Les options gid, uid, file_mode, dir_mode, et noperm permettent à l'utilisateur d'uid et gid correpondant (voir id username) qui accéde le montage samba à avoir tout les droits d'écritures. Sinon l'écriture ne marche seulement que si l'utilisateur correspond et si l'option noperm est utilisée ! (Le partage samba peut être monté par n'importe qui par contre).

rtorrent

Rtorrent est un client torrent avec une interface console, il est léger et plutôt facile à prendre en main. Il gère également les liens magnet.

Installation

sudo apt-get install rtorrent screen

Screen est un utilitaire sympathique qui vous permettra de lancer rtorrent en tache de fond et d'accéder à son interface ulterieurement.

Voici mon fichier de configuration /home/toto/.rtorrent.rc

# Copy to ~/.rtorrent.rc and enable/modify the options as needed. Remember to
# uncomment the options you wish to enable.

# Maximum and minimum number of peers to connect to per torrent.
min_peers = 1
max_peers = 50

# Same as above but for seeding completed torrents (-1 = same as downloading)
min_peers_seed = 1
max_peers_seed = 20

# Maximum number of uploads single torrent may use
max_uploads = 7

# Maximum number of simultaneous downloads
max_downloads_global = 5
# Maximum number of simultaneous uploads
max_uploads_global = 10

# Global upload and download rate in KiB. "0" for unlimited.
download_rate = 0
upload_rate = 100

# Default directory to save the downloaded torrents.
directory = /mnt/freebox/Téléchargements/

# Default session directory. Make sure you don't run multiple instance
# of rtorrent using the same session directory. Perhaps using a
# relative path?
session = ./.rtorrent

# Watch a directory for new torrents, and stop those that have been
# deleted.
schedule = watch_directory,5,5,load_start="/mnt/freebox/Téléchargements/A\ Télécharger/*.torrent"
schedule = tied_directory,6,5,start_tied=
schedule = untied_directory,7,5,stop_untied=

# Close torrents when diskspace is low.
schedule = low_diskspace,5,60,close_low_diskspace=2000M

# Periodically save session data
schedule = session_save,240,300,session_save=

# Enable the default ratio group.
ratio.enable=
# Change the limits, the defaults should be sufficient.
# Upload to a minimum ratio of 4.0
ratio.min.set=400
# Upload to a maximum ratio of 20.0
ratio.max.set=2000
# Upload a minimum of 250 MB
ratio.upload.set=250M

# When seeding ratio is reached close the torrent
system.method.set = group.seeding.ratio.command, d.close=

# Move files to ./unsorted when download completes
system.method.set_key = event.download.finished,move_complete,"execute=mv,-n,$d.get_base_path=,\
/mnt/freebox/Téléchargements/Téléchargés;d.set_directory=/mnt/freebox/Téléchargements/Téléchargés"

# Port range to use for listening.
port_range = 33101-33199

# Start opening ports at a random position within the port range.
port_random = yes

# Encryption options, set to none (default) or any combination of the following:
# allow_incoming, try_outgoing, require, require_RC4, enable_retry, prefer_plaintext
#
# The example value allows incoming encrypted connections, starts unencrypted
# outgoing connections but retries with encryption if they fail, preferring
# plaintext to RC4 encryption after the encrypted handshake
#
encryption = allow_incoming,try_outgoing,enable_retry,prefer_plaintext

# Sort the main view by ratio
view.sort_current = main,greater=d.get_ratio=
view.sort_new = main,less=d.get_ratio=
view.sort = main

# Sort the seeding view by the upload rate and only show torrents with peers
view.sort_current = seeding,greater=d.get_up_rate=
view.filter = seeding,"and=d.get_complete=,d.get_peers_connected="
view.sort_new = seeding,less=d.get_up_rate=
view.sort = seeding

# Sort the leeching view by name
view.sort_current = leeching,greater=d.get_name=
view.sort_new = leeching,greater=d.get_name=
view.sort = leeching

# Filter the active view by connected peers
view.sort_current = active,less=d.get_name=
view.sort_new = leeching,less=d.get_name=
view.filter = active,d.get_peers_connected=
view.sort = active

schedule = sort_main,11,5,view.sort=main
schedule = sort_seeding,12,5,view.sort=seeding
schedule = sort_leeching,13,5,view.sort=leeching
schedule = sort_active,14,5,view.sort=active

# Enable DHT support for trackerless torrents or when all trackers are down.
# May be set to "disable" (completely disable DHT), "off" (do not start DHT),
# "auto" (start and stop DHT as needed), or "on" (start DHT immediately).
# The default is "off". For DHT to work, a session directory must be defined.
# 
#dht = auto

# UDP port to use for DHT. 
# 
#dht_port = 6881

# Enable peer exchange (for torrents not marked private)
#
#peer_exchange = yes

Ici ce qui est important ici :

#Où sont mis les fichiers de téléchargement temporaires
directory = /mnt/freebox/Téléchargements/
#Le répertoire où l'on surveille l'ajour de fichiers .torrent
schedule = watch_directory,5,5,load_start="/mnt/freebox/Téléchargements/A\ Télécharger/*.torrent"
#Le dossier dans lequel les téléchargements terminés sont déplacés
system.method.set_key = event.download.finished,move_complete,"execute=mv,-n,$d.get_base_path=,\
/mnt/freebox/Téléchargements/Téléchargés;d.set_directory=/mnt/freebox/Téléchargements/Téléchargés"

Le lancer au démarrage 

Pour cela j'utilise le script /etc/rc.local (même si je crois que le faire avec cron est plus judicieux). Je lance rtorrent en tant qu'utilisateur toto qui a tous les droits d'écriture dont j'ai parlé plus haut.
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

/usr/bin/printf "         My IP address is\033[0;31m \
`/sbin/ifconfig | grep "inet addr" | grep -v "127.0.0.1" | awk '{ print $2 }' | awk -F: '{ print $2 }'` \033[0m\n" > /dev/console

sleep 5

value=$(/bin/ip route|/bin/grep -c "default dev ppp0")
if [ $value -eq 1 ]
then
    /usr/bin/printf  "PPTP connection seems ok start rtorrent" > /dev/console
    /bin/su - toto -c "screen -d -m -S rtorrent rtorrent"
fi

exit 0

Le sleep est la car le rc.local démarre plus tôt que prévu. Le script rc.local étant exécuter avec l'option -e, ie il s'arrête dès qu'il rencontre une erreur, et pour lui, quand on attribue 0 à une valeur c'est une erreur.

Ainsi, si on n'attends pas que la connectionn pptp ne se lance, ici value=0, et le rc.local échoue !

Pour accéder par la suite a rtorrent (loggé en tant qu'utilisateur toto):
screen -r rtorrent

Utilisation du Raspberry comme un accès au serveur PPTP/VPN.

C'est utile si comme moi vous avez une connection free, vous pouvez alors utiliser la connection si vous souffrez à regarder des vidéos pixelisées sur youtube. Pour celà la raspberry va faire office de proxy qui lui se connecte par le serveur distant pour accéder à internet.

J'utilise squid comme proxy:

sudo apt-get install squid

Dans /etc/squid/squid.conf j'ai modifié ces valeurs.

http_access allow localnet
http_access deny all
icp_access allow localnet
icp_access deny all
http_port 3456

Désormais il me suffit juste d'activer le proxy sur Firefox ou mon network manager.


Petits plus

Si vous voulez surveiller la temperature du raspberry :

cat /sys/class/thermal/thermal_zone0/temp

Si vous voulez voir quelle est la fréquence maximale (sur demande) à laquelle le système tourne :

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq

Par défault le système n'est pas à 1GHz, il est entre 600 et 900 MHz (sans aucun paramètre dans /boot/config.txt). Le fontionnement à 1 GHz est considéré comme un surcadençage de l'horloge, alors que le système est vendu à 1GHz... Il doit êtreprudent de rajouter un dissipateur thermique.

Si vous voulez débloquer les fonctions matérielles pour décoder des flux vidéos vous avez à acheter des codes sur http://www.raspberrypi.com/

SI vous souhaitez une horloge temps réel pour garder l'heure vous pouvez la réaliser vous même, ou bien la commander : lien.

Aucun commentaire:

Enregistrer un commentaire