Un serveur à 210 €

Etant donné que le serveur "familial" (qui stocke les fichiers de la famille !) est en train de mourir, notamment niveau disque dur, j'essaye de trouver une configuration pas trop chère pour le rénover. Voici la configuration actuelle :

  • Carte mère basique (et vieille !) ;
  • Carte graphique en AGP ;
  • Carte réseau 10/100 en PCI ;
  • CPU AMD K7 650 MHz ;
  • Disque dur Maxtor 40 Go ;
  • 128 Mo de RAM, probablement de la SDRAM.

Voici la configuration que j'ai trouvée sur materiel.net (moins cher que LDLC sur ce coup) :

Carte mère Asrock K8Upgrade-NF3Carte mère Asrock K8Upgrade-NF3 : pour 44 €, elle est dotée d'un chipset graphique largement suffisant pour afficher une console (NForce 3), elle peut accueillir deux barrettes de RAM en DDR. Elle permet également de connecter jusqu'à 4 périphériques IDE et 2 périphériques SATA. Enfin, elle embarque un connecteur Ethernet 10/100.

Processeur AMD Sempron 2800+Pour le processeur, un remplacement basique et économique sera largement suffisant : la série Sempron me paraît remplir ces critères. Le 2800+, cadencé à 1,6 GHz, avec 256 Ko de cache L2, semble adapté à une utilisation de type serveur de fichiers - rarement utilisé qui plus est. Les limites financières sont elles aussi respectées, puisqu'on trouve ce processeur à 38 €. On peut également noter qu'il s'agit d'un processeur 64 bits en version boîte (donc avec un ventilateur !).

RAM Kingston 256 Mo DDRNiveau mémoire, une barrette de 256 Mo de RAM en DDR PC 2700 me semble amplement suffisante. Kingston en propose pour 28 € ; on aurait pu chercher à réduire les coûts avec de la No Name, vendue 5 € moins chère, mais je pense qu'une garantie à vie - contre 1 an - vaut bien 5 €. Inversement, pas besoin de PC 3200, même si la carte mère le supporterait bien : c'est un serveur de fichiers et de shell qui sert somme toute assez peu, pas un serveur de calcul de prévisions météo !

Disque dur Seagate BarracudaEnfin, en ce qui concerne le stockage, j'aimerais avoir quelque chose qui me tienne au moins aussi longtemps que mon Maxtor - même si Maxtor n'est pas renommé dans le domaine ! Je me suis donc orienté vers un Seagate en IDE de 80 Go. Etant donné que les besoins en espace ne sont pas énormes, les 80 Go seront suffisants pour l'utilisation prévue... c'est déjà deux fois plus que ce qu'on avait auparavant !

Si on fait la somme : 43,99 (Carte mère) + 37,95 (Processeur) + 27,99 (RAM) + 45,99 (2 disques Seagate) + 9,80 (frais de port) = 211,69 €.

Je suis ouvert à toute remarque par rapport à cette configuration avant de la proposer à l'achat par la famille :)

Reprendre les transferts avec ProFTPd

J'ai passé au moins 5 minutes à googler pour trouver ça :

AllowStoreRestart       on

(à mettre dans les options générales)

C'est quand même con que ce soit pas activé par défaut. Genre quand un bénévole t'envoie un fichier de 118 Mo et que tu vois pas pourquoi FileZilla il veut pas reprendre, tu te sens con. Tu vois ? Be aware.

Et meeeeeerde.

iserv, mon serveur interne, a subit un plantage de X. Résultat : reboot :'( Enfin, un uptime de 117 jours, c'est déjà pas mal ! Surtout par rapport aux 20 jours du Windoze que Debian GNU/Linux remplace sur cette machine :D

Comment balbinus.org est-il construit et maintenu ?

Ceci est la suite des articles précédents.

J'ai modifié aujourd'hui la configuration de iubirea (mon serveur IPv6) pour qu'il utilise Apache. J'ai choisi un serveur Apache 1.3.x, après avoir testé thttpd. J'ai préféré Apache pour plusieurs raisons :

  • Il est plus finement paramétrable.
  • On peut lui ajouter des types MIME en deux coups de cuillère à pot.
  • Je le connais mieux.
  • Les URLs significatives sont ultra-pratiques, et aussi plus belles :)

J'ai pris une série 1.3, mais je vous conseille plutôt la 2.0. Mon choix a été influencé par le seul fait d'avoir déjà trois Apache 2.0 sur mon réseau, et donc le souhait de changer un peu ! J'ai laissé intacte la configuration Debian de base d'Apache. J'ai ajouté à la fin un Include vers mon fichier de configuration :

AddType application/rdf+xml .rdf

<Directory /www>
	AllowOverride all
</Directory>

DirectoryIndex index.xhtml index.html index.shtml

J'ai tout de même dû désactiver l'Alias /images/ (dans le fichier httpd.conf) qui empêchait l'utilisation d'un dossier images/ à la racine du serveur, celui-ci étant by-passé par l'Alias.

Le type MIME ajouté me permet de servir de manière correcte les fichiers RDF (fil RSS par exemple). J'autorise ensuite mes .htaccess à modifier tout ce qu'ils peuvent : cela me permet ensuite de créer des URLs significatives. Enfin, je signale à Apache que mes fichiers d'index peuvent aussi avoir l'extension .xhtml.

J'ai une feuille de style qui me crée automatiquement des règles d'URL Rewriting, comme par exemple :

RewriteRule ^accueil$ index

Une question demeure : j'ai un feed RSS, qui existe en deux versions (RSS pur et XHTML). Les deux sont disponibles à la même URL : /feed-rss. Cette URL n'existe pas sur mon disque dur (les fichiers s'appellent news.rdf et news.xhtml). Il n'y a donc pas de moyen par l'URL seule d'accéder à l'une ou à l'autre des formes. Dois-je supposer que les agents qui pourraient être intéressés par mon feed sont assez intelligents pour envoyer le bon header Accept ?

Un site sur le serveur

Voir les posts précédents sur l'installation d'un serveur minimal sous Debian.

Et bien voilà, un serveur sous Debian qui marche, avec thttpd comme serveur. Comment y mettre un site facile à maintenir, étant donné que thttpd ne supporte pas les langages dynamiques ? (enfin, si, PHP, mais c'est le bazar et c'est pas très "secure".

J'ai donc développé rapidement une feuille de style XSLT pour, à partir d'un fichier XML décrivant les pages, générer celles-ci. Voici un extrait du fichier XML :

<?xml version="1.0" encoding="iso-8859-1"?>
<sito:sito xmlns:sito="http://www.radiopytagor.com/sito" xmlns="http://www.w3.org/1999/xhtml">
 <sito:pagina titolo="Accueil" file="index.html">
  <p>Bienvenue sur mon serveur.</p>
 </sito:pagina>
  ...
</sito:sito>

Et voilà ! Il suffit d'un petit Makefile pour transférer de mon ordinateur (où se trouve le processeur XSLT) vers iubirea (mon serveur) en toute sécurité via SSH :

all: site

site:
       @echo "Transformation XSLT en cours..."
       xsltproc sito.xsl sito.xml

scp: all
       scp ../*.* vincent@www.balbinus.org:/www
       scp ../errors/* vincent@www.balbinus.org:/www/errors

clean:
       rm *~
       rm ../*~

Donc, pour générer mon site, je fais make, pour le générer ET le transférer sur iubirea, je fais make scp. Il me demande deux fois mon mot de passe (une fois pour le site en lui-même, une fois pour les pages d'erreur HTTP personnalisées), et c'est fait ! Les taux de transfert sont très rapides (puisque c'est sur mon LAN), et parfaitement sécurisé !

Note importante pour moi-même

Ne jamais, jamais, jamais laisser un noyau Linux compilé et installé, avec son .tar.bz2 à côté sur un disque dur de 1.4 Go. Ca bouffe tout même 135 Mo.

Quand Trinity hacke, elle utilise nmap

Je découvre de plus en plus la puissance de ce petit outil... Même Trinity l'utilise, c'est dire !

Trinity et son portable

Serveur sous Debian : suite (le firewall)

[Edit] : une grossière erreur empêchait ce script de fonctionner (INPUT bloqué même pour les connexions déjà établies, et OUTPUT trop peu permissif).

Je vous ait expliqué dans mon post précédent comment installer un serveur web sécurisé sous Debian. Voici maintenant comment le sécuriser un minimum : un script de firewall. Il n'a absolument rien de transcendant : il permet juste de fermer tous les ports, sauf les ports HTTP (80) et SSH (22), plus une mention spéciale pour le NTP.

Vérifiez tout d'abord qu'iptables est bien installé : apt-get install iptables.

Voici le script /etc/firewall.sh commenté pas-à-pas :

#!/bin/sh

Indique avec quel programme le script doit être interprété.

# Règles par défaut
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

On rejette par défaut ce qui arrive (INPUT) et ce qui ne fait que traverser (FORWARD), mais on accepte ce qui sort (OUTPUT).

# On accepte les connexions boucle locale (sur lo)
iptables -A INPUT -i lo -j ACCEPT
iptables -A FORWARD -i lo -j ACCEPT
iptables -A FORWARD -o lo -j ACCEPT

Cela permet des tests sur les adresses localhost (127.0.0.1 et ::1).

# On accepte les connexions depuis le LAN
iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD -d 192.168.0.0/24 -j ACCEPT

On accepte tout sur le LAN (les machines du réseau local, qui sont sûres dans mon cas).

# On accepte les connexions HTTP et SSH dans les deux sens
iptables -A INPUT -i eth0 -p tcp --sport www -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport ssh -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

On veut pouvoir se connecter à notre serveur web de l'extérieur, et naviguer depuis notre serveur (en fait, certains scripts en ont besoin) ! On autorise donc les connexions entrantes nouvelles (NEW), déjà établies (ESTABLISHED) ou en relation (RELATED). Comme HTTP possède un port bien défini (80), il est présent dans la liste des ports de /etc/services : on peut donc l'indiquer comme --sport (port source) ou -dport (port de destination) en indiquant son nom dans le fichier /etc/services : www.

Il en va de même pour SSH. SSH est aussi présent dans /etc/services.

# On autorise le ping
iptables -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp -m limit --limit 2/s -j ACCEPT

On autorise enfin le ping, mais avec modération : pas plus de 2 pings par seconde (-- limit 2/s).

# On autorise les connexions TCP et UDP déjà établies à entrer
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p udp -m state --state ESTABLISHED,RELATED -j ACCEPT

Et on n'oublie pas qu'une connexion est dans les deux sens !

Voilà donc un script de lancement de firewall ! On peut également créer un script d'init pour notre firewall :

#!/bin/sh

stop() {
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
}

case $1 in
"start")
/etc/firewall.sh
;;
"stop")
stop
;;
"restart")
stop
/etc/firewall.sh
;;
esac

La fonction stop() arrête le firewall en flushant (vidant) les règles d'INPUT, OUTPUT et FORWARD. On redéfinit les stratégies par défaut à ACCEPT (on accepte tout). L'instruction case permet ensuite de savoir si l'utilisateur veut qu'on lance (start), arrête (stop) ou redémarre (restart) le firewall. Dans le premier cas, on appelle notre script de lancement de firewall que l'on a précédemment créé. Dans le second, on appelle la fonction stop(), et dans le troisième, on combine les deux et dans le bon ordre ! $1 désigne le premier argument passé au script, on lance donc notre firewall en tapant /etc/init.d/firewall start... Vous en déduisez comment on l'arrête ou le redémarre. N'oubliez pas d'ajouter ce script à ceux qui démarrent au lancement de la machine : update-rc.d firewall defaults.

Et voilà ! Pour plus d'informations sur les iptables, outil décidément très puissant, consultez l'article de Léa Linux "Mur de feu pas-à-pas" ou "iptables par l'exemple", beaucoup plus complet.

Installation d'un serveur minimal sous Debian

De quoi a-t-on besoin ?

On va installer Debian de la manière la plus simple : en un seul CD-Rom d'une centaine de Mo, et bootable. Il nous faut donc les ISO de la Net Install (version officielle, c'est plus pratique). Il nous faudra, puisqu'on choisit l'installation par Internet, un lecteur de CD-Rom bootable et une carte réseau en état de marche reliée à un réseau (lui-même relié à Internet sans contrôle d'accès type Novell ou Netware ou équivalent) comportant un serveur DHCP (les modems/routeurs remplissent souvent ce rôle).

Côté logiciels, ils nous faudra un serveur web et un serveur SSH.

On y va !

Les dernières versions de la Net Install prennent en charge elles-mêmes le matériel pour peu que la configuration ne soit pas trop exotique, elle est détectée automatiquement, et les pilotes appropriés sont installés.

Les écrans successifs qui apparaissent après le (re)boot de la machine sur le CD-Rom (pour commencer l'installation) vous informent de l'avancée de l'installation, et vous demandent des renseignements basiques, comme la disposition du clavier. La partie la plus importante est le formatage. Allez au plus simple : une partition pour tout (à la rigueur une pour / et une pour /var). Si vous vous contentez de l'installation minimale décrite ici, 500 Mo suffiront bien pour /. Voyez en fonction de la place disponible, et n'oubliez pas la SWAP. Il est conseillé, pour un serveur (pour une station de travail aussi, d'ailleurs), d'utiliser un système de fichiers "journalisé", de type ext3.

Arrive enfin le reboot. Après celui-ci, l'installation se termine en vous demandant un mot de passe root, un nom d'utilisateur (et son mot de passe), le fuseau horaire, etc. C'est fait ! Vous avez un système Debian qui marche ! Fuyez après cette installation les programmes du style aptitude ou je-sais-plus-quoi, qui vous amènent plus de logiciels que vous n'en voulez.

Les logiciels

On va utiliser ici la puissance de apt-get. Vous pouvez auparavant modifier les sources utilisées en modifiant /etc/apt/sources.list. Utilisez stable ou unstable (ou bien laissez testing).

On va donc commencer par installer un serveur SSH. Tapez en tant que root apt-get update. Une fois les téléchargements terminés, tapez apt-get install ssh. Lors de l'installation, le programme va vous poser des questions : répondez oui à SSH2, et gardez généralement les options par défaut. Testez la connexion à partir d'un autre poste en utilisant SSH (sous Linux) ou Putty (sous Windows).

Vous pouvez réaliser la suite des opérations sans écran, directement par SSH.

Vient ensuite le serveur web. Vu la faiblesse de ma configuration (48 Mo de RAM, 2 Go de disque dur), et mes besoins réduits - et, je l'avoue, ma fainéantise d'avoir à configurer quelque chose de la taille d'Apache - j'ai choisi de ne pas utiliser ce dernier, mais thttpd, qui sert très bien les pages (X)HTML et le reste (images, etc), et peut utiliser l'architecture CGI 1.1. Faites apt-get install thttpd. Une fois le téléchargement terminé ("oui" au chroot()), créez un nouvel utilisateur "thttpd" (useradd thttpd). Créez-lui un répertoire : mkdir /home/thttpd && chown thttpd /home/thttpd. Créez-y un fichier de config qui contiendra quelque chose come (man thttpd pour plus de détails) :

dir=/www
chroot
user=thttpd
logfile=/home/thttpd/log
pidfile=/home/thttpd/pid
charset=utf-8

Créez ensuite un fichier vide de pid dans ce même dossier (/home/thttpd). Modifiez le script d'init /etc/init.d/thttpd pour qu'il puisse démarrer sur cette configuration. Repérez la ligne qui commence par CONFFILE, et modifiez-la en :

CONFFILE=/home/thttpd/config

Pareil pour la ligne commençant par PIDFILE :

PIDFILE=/home/thttpd/pid

Ajoutez ensuite ce script aux scripts exécutés au boot : update-rc.d thttpd defaults.

Et voilà ! un serveur web (HTTP) et un serveur SSH (pour l'admin) en état de marche !

Usage

Le plus simple pour transférer des fichiers sur le serveur est d'utiliser sftp (FTP over SSH). Sous Linux, en mode console (pratique pour automatiser !), vous pouvez utiliser sftp pour accéder à votre serveur pour peu que vous ayez installé SSH sur la machine cliente ; ou bien lftp (en tapant lftp fish://utilisateur@ip). Sous Windows, utilisez le client FTP libre FileZilla, qui possède un mode SFTP.

[Suite] : le firewall

Merci aux geeks de #tavernedulibre (quelles idioties je n'aurais pas écrites s'ils n'avaient été là :) )

IPv6 !

Voilà, ça y est, j'ai une IPv6 ! J'en ai même toute une plage : 2001:7a8:432d:f0::/64 jusqu'à 2001:7a8:432d:ff::/64 :)

La suite plus tard, je suis crevé.