Tag - informatique

Entries feed

Tuesday, August 11 2015

Déployer silencieusement TightVNC Server sur un parc de machines

TightVNC Server se déploie assez facilement sur un parc de machines Windows à l'aide de la commande :

msiexec /i tightvnc-2.7.10-setup-64bit.msi /quiet /norestart ADDLOCAL="Server" VIEWER_ASSOCIATE_VNC_EXTENSION=1 SERVER_REGISTER_AS_SERVICE=1 SERVER_ADD_FIREWALL_EXCEPTION=1 VIEWER_ADD_FIREWALL_EXCEPTION=1 SERVER_ALLOW_SAS=1 SET_USEVNCAUTHENTICATION=1 VALUE_OF_USEVNCAUTHENTICATION=1 SET_PASSWORD=1 VALUE_OF_PASSWORD=unmotdepasse SET_USECONTROLAUTHENTICATION=1 VALUE_OF_USECONTROLAUTHENTICATION=1 SET_CONTROLPASSWORD=1 VALUE_OF_CONTROLPASSWORD=autremotdepasse

Les paramètres fournis à l'installateur sont assez explicites : on demande au serveur de s'enregistrer comme un service, on paramètre les mots de passe d'accès pour le client mais aussi pour le changement de configuration du serveur...

Le déploiement se passe à merveille avec Updatengine dont nous avons déjà parlé ici :

20150811-tightvnc.png

Friday, July 10 2015

Routeur avec Tomato, Fibre Orange, VLAN 835

Comme déjà exposé ici, il est possible de se passer de la Livebox d'Orange et d'avantageusement la remplacer par un routeur "évolué" muni du micrologiciel Tomato.

Dans le précédent article, je détaillais le mode opératoire avec le routeur Asus RT-N16. J'ai eu l'occasion dernièrement de répéter l'opération avec l'Asus RT-N18U. Le nouveau mode opératoire est très similaire sauf qu'il ne faut pas utiliser de VID offset pour que cela fonctionne :

Paramétrage PPPoE pour le WAN

Dans l'onglet principal de Tomato, on choisit une connexion PPPoE pour le WAN et on saisit le nom d'utilisateur 'fti/xxxxx' et le mot de passe pour la connexion.

Puis on bascule le WAN dans le VLAN 835

Il faut alors se rendre dans les options avancées, catégorie VLAN.

  • On sélectionne la ligne correspondant au VLAN du WAN et on on saisit 835 comme VID.
  • Il ne faut pas oublier également de cocher la case 'Tagged' pour demander au retour de bien prendre en compte le trafic 'marqué' comme appartenant au VLAN 835.

vlan835-asus-rt-n18u.png

Et voilà le tour est joué. On sauvegarde, le routeur inscrit ces paramètres dans sa nvram et redémarre. On voit que le WAN PPPoE parvient à se connecter à internet et le routeur distribue internet à tous les postes du réseau qui le référencent comme passerelle.

Firmware Tomato (by Shibby) sur Asus RT-N18U

J'ai déjà parlé à plusieurs reprises dans ces pages du micrologiciel Tomato pour les routeurs. J'ai récemment acquis un routeur Asus RT-N18U et me suis empressé d'installer Tomato dessus.

Pour ce faire,

  • on télécharge d'abord la version ARM du firmware ici : http://tomato.groov.pl/download/K26ARM/
  • on extrait le fichier .trx de l'archive
  • on allume le routeur Asus RT-N18U (encore équipé de son micrologiciel natif) et on se rend dans "Administration", "Mise à jour du firmware". On sélectionne alors le fichier .trx de Tomato et on laisse le processus de mise à jour se faire
  • une fois le routeur redémarré, on effectue un "factory reset" avec le bouton dédié pour vider la mémoire des paramètres non adéquats (liés au micrologiciel natif)
  • et hop le tour est joué, on peut alors se connecter au micrologiciel Tomato et enfin profiter de toute la puissance du routeur

Tomato semble fonctionner sans difficulté sur ce matériel - qui, dans mes tests initiaux, a été très performant. A recommander donc !

Sunday, June 7 2015

Beau-frère, entropie et établissement de connexion SSH lente

La connexion via SSH (échange de clés) à l'une de mes machines (Debian Jessie 64 bits) mettait un temps certain à s'établir : une petite dizaine de secondes. Mon beau-frère (celui fort en ordinateur, on en a tous un) m'a sauvé, il m'a annoncé doctement que la machine manquait sans doute d'entropie.

Et il avait raison !

Pour vérifier le stock d'entropie sur la machine :

cat /proc/sys/kernel/random/entropy_avail

me retournait des valeurs proches de 700 sur la machine à laquelle je me connectais.

Nous installâmes alors un démon pour récolter l'entropie :

apt install haveged

et dès lors

cat /proc/sys/kernel/random/entropy_avail

retournait des valeurs proches de 2000.

Et la connexion SSH s'établissait en un clin d'oeil.

Trop fort mon beau-frère.

Friday, January 2 2015

Sauvetage boot EFI sur portable Asus

Patatra, un Kernel Panic sur son Asus X301A et le voilà qui refuse de booter sans donner d'explications : à chaque démarrage, seul le BIOS du système s'affiche... Ennuyeux.

Pour essayer de comprendre, on boote sur une clé USB contenant SystemRescueCD et rapidement on découvre que la partition /dev/sda1 (utilisée pour stocker les éléments nécessaires pour le boot EFI), 1 Mo formatée en FAT32, est corrompue ("dirty bit", sûrement à cause de l'extinction subite lors du Kernel Panic.

On essaye déjà de réparer le système de fichiers par :

fsck.vfat -a /dev/sda1

Puis on re-démarre mais rien ne change.

Il semble que le BIOS ne parvienne pas à détecter tout seul la présence de l'amorceur Grub sur la partition EFI - et qu'il ne soit possible de modifier la séquençage d'amorçage EFI que depuis un système lui-même lancé par EFI.

Qu'à cela ne tienne : on reboote sur le disque de sauvetage SystemRescueCD et on effectue alors les opérations suivantes :

  • on monte la partition EFI dans /boot/efi
mkdir /boot/efi
mount /dev/sda1 /boot/efi
  • on trouve le fichier grubx64.efi dans EFI/debian/ et on le copie dans EFI/boot/ en le renommant bootx64.efi
mkdir /boot/efi/EFI/boot
cp /boot/efi/EFI/debian/grubx64.efi /boot/efi/EFI/boot/bootx64.efi

Et hop, on reboote. Normalement, le bios EFI cherche par défaut le fichier bootx64.efi donc Grub devrait apparaître à l'écran. On peut alors booter normalement dans le système d'exploitation, puis, pour ramener la situation à la normale, réinstaller Grub proprement. En effet, quand il s'installe, Grub paramètre intelligement les paramètres EFI donc il va pouvoir ré-apprendre au BIOS à aller chercher EFI/debian/grubx64.efi.

grub-install /dev/sda1

Saturday, November 1 2014

Xournal, génial pour annoter des PDFs

Xournal est un très simple et très pratique outil pour annoter des PDFs. Indispensable aujourd'hui quand nous recevons des formulaires par dizaines sous format PDF ou qu'il est habituel de collaborer sur des documents PDF.

L'emploi est fort simple : on ouvre le PDF avec Xournal, on utilise l'un des outils d'écriture ou de dessin (crayon, surligneurs, règle...) pour annoter puis on exporte le nouveau PDF.

Xournal.png

Xournal est disponible au téléchargement ici : http://xournal.sourceforge.net/. Sur Linux, vous le trouverez sans doute dans votre système de paquets, sur Windows, vous pourrez télécharger la petite archive contenant l'exécutable et ses dépendances.

Souhaitant déployer l'outil sur tous les postes informatiques (Windows) de mon entreprise, j'ai fabriqué un installateur simple pour l'outil à l'aide de NSIS. Par défaut, les installateurs de NSIS acceptent d'être appelés en mode silencieux à l'aide du paramètre "/S" et l'installateur généré peut être utilisé pour un déploiement en masse avec un outil comme Updatengine.

Télécharger l'installateur

Testé fonctionnel sur Windows 7 32 bits et 64 bits. xournal-0.4.8-win32-installer.exe

Le code de génération de l'installateur avec NSIS :

!define APPNAME "Xournal"
!define DESCRIPTION "Annotate PDF"
# These three must be integers
!define VERSIONMAJOR 0
!define VERSIONMINOR 4
!define VERSIONBUILD 8
!define INSTALLSIZE 7233
 
RequestExecutionLevel admin ;Require admin rights on NT6+ (When UAC is turned on)
 
InstallDir "$PROGRAMFILES\${APPNAME}"
 
# This will be in the installer/uninstaller's title bar
Name "${APPNAME}"
Icon "xournal.ico"
outFile "xournal-0.4.8-win32-installer.exe"
 
!include LogicLib.nsh
 
# Just 2 pages - install location and installation
page directory
Page instfiles
 
!macro VerifyUserIsAdmin
UserInfo::GetAccountType
pop $0
${If} $0 != "admin" ;Require admin rights on NT4+
        messageBox mb_iconstop "Administrator rights required!"
        setErrorLevel 740 ;ERROR_ELEVATION_REQUIRED
        quit
${EndIf}
!macroend
 
function .onInit
	setShellVarContext all
	!insertmacro VerifyUserIsAdmin
functionEnd
 
section "install"
	# Files for the install directory - to build the installer, these should be in the same directory as the install script (this file)
	setOutPath $INSTDIR
	# Files added here should be removed by the uninstaller (see section "uninstall")
	file "xournal.exe"
	file "xournal.ico"
	file "README.txt"
	file "*.dll"
	file /r "etc"
	file /r "html-doc"
	file /r "lib"
	file /r "pixmaps"
	file /r "share"
	# Add any other files for the install directory (license files, app data, etc) here
 
	# Uninstaller - See function un.onInit and section "uninstall" for configuration
	writeUninstaller "$INSTDIR\uninstall.exe"
 
	# Start Menu
	createDirectory "$SMPROGRAMS\${APPNAME}"
	createShortCut "$SMPROGRAMS\${APPNAME}\${APPNAME}.lnk" "$INSTDIR\xournal.exe" "" "$INSTDIR\xournal.ico"
	createShortCut "$SMPROGRAMS\${APPNAME}\Uninstall ${APPNAME}.lnk" "$INSTDIR\uninstall.exe" "" ""
 
	# Registry information for add/remove programs
	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayName" "${APPNAME} - ${DESCRIPTION}"
	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "UninstallString" "$"$INSTDIR\uninstall.exe$""
	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "QuietUninstallString" "$"$INSTDIR\uninstall.exe$" /S"
	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "InstallLocation" "$"$INSTDIR$""
	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayIcon" "$"$INSTDIR\xournal.ico$""
	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayVersion" "${VERSIONMAJOR}.${VERSIONMINOR}.${VERSIONBUILD}"
	WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "VersionMajor" ${VERSIONMAJOR}
	WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "VersionMinor" ${VERSIONMINOR}
	# There is no option for modifying or repairing the install
	WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "NoModify" 1
	WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "NoRepair" 1
	# Set the INSTALLSIZE constant (!defined at the top of this script) so Add/Remove Programs can accurately report the size
	WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "EstimatedSize" ${INSTALLSIZE}
sectionEnd
 
 
# Uninstaller
function un.onInit
	SetShellVarContext all
 
	#Verify the uninstaller - last chance to back out
	MessageBox MB_OKCANCEL "Permanantly remove ${APPNAME}?" IDOK next
		Abort
	next:
	!insertmacro VerifyUserIsAdmin
functionEnd
 
section "uninstall"
	# Remove Start Menu launcher
	delete "$SMPROGRAMS\${APPNAME}\${APPNAME}.lnk"
	delete "$SMPROGRAMS\${APPNAME}\Uninstall ${APPNAME}.lnk"
	# Try to remove the Start Menu folder - this will only happen if it is empty
	rmDir "$SMPROGRAMS\${APPNAME}"
 
	# Remove files
	delete $INSTDIR\xournal.exe
	delete $INSTDIR\xournal.ico
	delete $INSTDIR\README.txt
	delete $INSTDIR\*.dll
	rmDir /r $INSTDIR\etc
	rmDir /r $INSTDIR\html-doc
	rmDir /r $INSTDIR\lib
	rmDir /r $INSTDIR\pixmaps
	rmDir /r $INSTDIR\share
 
	# Always delete uninstaller as the last action
	delete $INSTDIR\uninstall.exe
 
	# Try to remove the install directory - this will only happen if it is empty
	rmDir $INSTDIR
 
	# Remove uninstaller information from the registry
	DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}"
sectionEnd

Sunday, November 10 2013

Installation et paramétrage d'un serveur avec conteneurs LXC chez Online.net/Dedibox

Nous allons décrire ici l'installation et la paramétrage d'un serveur dédié chez Online.net (offres Dedibox). La description de l'installation ne sera peut-être pas exhaustive et se concentrera sur les points clés, ceux qui par exemple ont été bloquants lors de notre déploiement.

Au niveau des technologies utilisées...

Nous allons déployer une version Debian stable (7.x à l'écriture de ces lignes) avec LVM2 (pour le découpage de l'espace disque) étant entendu que le RAID est géré matériellement et ne demande pas de paramétrage au niveau du système. La technologie LXC (LinuX Containers) sera utilisée pour séparer les servicse dans plusieurs conteneurs indépendants.

Pour le réseau, chaque conteneur disposera de sa propre IPv6 et sera donc accessible directement. En IPv4 en revanche, on déploiera un réseau local IPv4 avec un NAT pour répartir le trafic sur les différents conteneurs.

Paramétrage du réseau IPv6 chez Online.net

Chez Online.net, un bloc /48 est attribué avec chaque serveur dédié. Pour gérer l'IPv6 sur le serveur, il faudra installer le client Dibbler (un client DHCPv6) :

aptitude install dibbler-client

puis modifier la clé DUID dans le fichier /var/lib/dibbler/client-duid pour insérer celle attribuée par Online.net dans l'interface d'administration du système. Enfin, on modifiera le fichier de configuration /etc/dibbler/client.conf tel que suit :

log-level 7
iface br0 {
    pd
    option dns-server
    option domain
}

On modifie alors le fichier /etc/network/interfaces pour contenir les éléments suivants :

auto br0
iface br0 inet static
    address 88.123.123.123
    netmask 255.255.255.0
    gateway 88.123.123.1
    bridge_ports eth0

iface br0 inet6 static
    address 2001:abcd:abcd:abcd::
    gateway fe80::123:1234:1234:1234
    netmask 56

Vous aurez bien sûr pris le soin de remplacer 2001:abcd:abcd:abcd:: par l'adresse IPv6 correspondant au bloc /56 que vous avez décidé d'attribuer à votre serveur dédié et de spécifier la bonne passerelle (la passerelle par défaut est aussi l'adresse du routeur auquel est connecté votre Dedibox, vous pourrez trouver dans les logs de Dibbler l'adresse de ce routeur). Et remplacer 88.123.123.123 par l'adresse IPv4 qui vous a été attribuée (et spécifier la passerelle correspondante).

Ce paramétrage correspond à la mise en place d'un pont réseau (bridge) ce qui permettra à toutes les machines virtuelles de communiquer entre elles et de partager les communications réseau.

On redémarre alors le réseau :

/etc/init.d/networking restart

(si vous êtes connecté en SSH, il faudra peut-être se reconnecter en utiliser les nouvelles adresses spécifiées - pour forcer la connexion SSH en IPv6 il faudra utiliser ssh -6 et ssh -4 pour forcer l'IPv4)

puis on redémarre Dibbler par les commandes habituelles :

/etc/init.d/dibbler-client stop 
/etc/init.d/dibbler-client start

Une fois les conteneurs en place, nous reviendrons sur ce paramétrage pour y apporter quelques légères modifications.

Création de volumes virtuels avec LVM pour héberger les conteneurs

Chaque conteneur sera contenu dans un espace logique géré par LVM. Cela permettra notamment une manipulation aisée pour le redimensionnements, les sauvegardes...

Lors de l'installation initiale, nous avons donc pris le soin de garder une grosse partition /dev/sdaX non utilisée - c'est elle que nous allons déclarer comme volume physique pour LVM.

Il faut d'abord s'assurer que /dev/sdaX n'est pas mentionné dans /etc/fstab et le cas échéant commenter la ligne correspondante.

Puis on crée le volume physique :

pvcreate /dev/sdaX
vgcreate vg /dev/sdaX

et 2 volumes logiques de 50 Go :

lvcreate -n Nom1 -L 50g vg
lvcreate -n Nom2 -L 50g vg
mkfs.ext4 /dev/vf/Nom1
mkfs.ext4 /dev/vf/Nom2

Installation de LXC et déploiement du premier conteneur

aptitude install lxc lxc lxctl bridge-utils debootstrap unzip

installera les éléments nécessaires. Puis on modifiera /etc/fstab pour contenir :

cgroup        /sys/fs/cgroup        cgroup        defaults    0    0

La commande lxc-checkconfig permet de vérifier si tout est paré et donné des aides pour la résolution d'éventuels problèmes. Une fois que tous les paramètres de lxc-checkconfig sont au vert, on se lance pour de vrai !

A noter que le template Debian 7 inclus par défaut pour LXC dans Debian 7 est défectueux (cf. 'The Debian 7 template is broken' in [https://wiki.debian.org/LXC |https://wiki.debian.org/LXC] et la solution proposée ici par Rob van der Hoeven). Les lignes ci-dessous correspondent à la solution proposée par Rob.

On déploie un template fonctionnel :

cd /usr/share/lxc/templates/
wget http://freedomboxblog.nl/wp-content/uploads/lxc-debian-wheezy.gz
gzip -d lxc-debian-wheezy.gz
chmod u+x lxc-debian-wheezy

et on lance la création du premier conteneur :

lxc-create -n myfirstcontainer -t debian-wheezy

On déplace alors le conteneur dans le premier disque logique LVM que nous avions créé précédement :

cd /var/lib/lxc/
mv myfirstcontainer myfirstcontainer-tmp
mkdir myfirstcontainer
mount /dev/vg/Nom1 myfirstcontainer
cd myfirstcontainer-tmp
cp -R * ../myfirstcontainer/
cd ..
rm -Rf myfirstcontainer-tmp

et on paramètre le conteneur comme suit dans /var/lib/lxc/myfirstcontainer/config :

lxc.utsname = container1
lxc.network.type = veth
lxc.network.veth.pair = vethcontainer1
lxc.network.flags = up
lxc.network.link = br0
lxc.network.ipv4 = 192.168.0.101/24  #on attribue une adresse IPv4 de réseau local
lxc.network.ipv4.gateway = 192.168.0.1  #la passerelle, nous allons attribuer cette adresse ensuite à l'hôte physique
lxc.network.hwaddr = 00:11:D0:14:84:BE  #attention, à modifer par une valeur aléatoire si vous installez plusieurs machines pour qu'il n'y ait pas collision !
lxc.network.ipv6 = 2001:abcd:abcd:abcd::101/56  #une adresse appartenant au bloc /56 attribué au serveur dédié

et on modifie les paramétrages réseau au sein du conteneur dans /var/lib/lxc/myfirstcontainer/rootfs/etc/network/interfaces :

auto eth0
iface eth0 inet static
    address 192.168.0.101

iface eth0 inet6 static
    address 2001:abcd:abcd:abcd::101
    netmask 56
    post-up ip -6 route add default via 2001:abcd:abcd:abcd::

Sur la machine hôte, on modifie alors les paramètres tel que suit :

  • on indique à Dibbler de ne pas chercher à paramétrer l'interface virtuelle vethcontainer1 en ajoutant dans la configuration de Dibbler :
iface vethcontainer1 no-config
  • on met en place le réseau IPv4 par :
ip addr add 192.168.0.1 dev br0
ip route add 192.168.0.0/16 dev br0
iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE
  • on met en place le réseau IPv6 par :
ip -6 route add 2001:abcd:abcd:abcd::101 dev br0
  • on modifie les paramétrages réseau du système en modifiant /etc/sysctl.conf :
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.forwarding = 1
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.all.accept_ra = 2

et sysctl -p pour prendre en compte ces paramétrages.

Si la connectivité IPv6 disparaît, alors il faudra se reconnecter en IPv4 et lancer les commandes suivantes :

ip -6 route add aa:bb:cc:dd:ee::/64 dev br0
ip -6 route add default via aa:bb:cc:dd:ee::1 dev br0
/etc/init.d/dibbler-client stop
/etc/init.d/dibbler-client start

en remplaçant aa:bb:cc:dd:ee::1 par l'adresse de la passerelle IPv6 (cette adresse est normalement communiquée par les Router Advertisements).

Tout semble alors prêt pour le démarrage du conteneur !

Lancement du conteneur

lxc-start -d -n myfirstcontainer

et on peut alors s'y connecter en console via :

lxc-console -n myfirstcontainer

Par défaut, le mot de passe root est root (c'est le paramétrage par défaut du template que nous avons utilisé - il va de soi que nous allons rapidement modifier ce paramétrage).

Pour quitter la console LXC, il faudra faire Ctrl+a puis d.

Dans le conteneur, on pourra vérifier que :

  • ping 192.168.0.1 fonctionne (ping de la machine hôte physique)
  • ping 8.8.8.8 fonctionne (ping vers l'extérieur, le web)
  • ping -6 2001:abcd:abcd:abcd:: fonctionne (ping de la machine hôte physique en IPv6)
  • ping -6 2001:4860:4860::8888 fonctionne (ping vers le web en IPv6)

Si tout fonctionne comme attendu, on peut alors poursuivre l'installation du système. On pourra par exemple :

  • créer des conteneurs additionnels (en adaptant quelque peu le paramétrage réseau afférent)
  • paramétrer iptables et ip6tables sur l'hôte physique et les conteneurs pour protéger les systèmes et rediriger le trafic IPv4 sur les conteneurs
  • installer Pound comme reverse proxy pour diriger le trafic HTTP/HTTPS IPv4 vers les différents conteneurs sous-jacents

Exemple de configuration iptables sur l'hôte physique

#!/bin/bash
IPTABLES='/sbin/iptables';

CT1_HOST="192.168.0.101";
CT2_HOST="192.168.0.102";
MONITORING_ONLINE="88.190.254.18";
LAN="192.168.0.0/24";
WAN_IFACE="br0";
WAN_IP="88.123.123.123";
# Flushing tables
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F
# Define default policy
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT

$IPTABLES -A INPUT -j ACCEPT -d $LAN;
$IPTABLES -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED

# Temporary - SSH access open to all IPs on port 22 but Fail2ban is working.$
$IPTABLES -A INPUT -j ACCEPT -p tcp --dport 22
# Opens to ping from online monitoring
$IPTABLES -A INPUT -j ACCEPT -p icmp -s $MONITORING_ONLINE

# Accepts connection to ports 80 and 443
$IPTABLES -A INPUT -j ACCEPT -p tcp --dport 80
$IPTABLES -A INPUT -j ACCEPT -p tcp --dport 443

# Rediriger le port 123 vers le container 1
$IPTABLES -t nat -A PREROUTING -p tcp --dport 123 -d $WAN_IP -j DNAT --to-destination $CT2_HOST:123

# Rediriger un port 456 vers le container 2
$IPTABLES -t nat -A PREROUTING -p tcp --dport 456 -d $WAN_IP -j DNAT --to-destination $PAB2_HOST:456

# Activating masquerade FROM local network
$IPTABLES -t nat -A POSTROUTING -o $WAN_IFACE -s $LAN -j MASQUERADE

Exemple de configuration de pound sur l'hôte physique

User		"www-data"
Group		"www-data"
RootJail	"/chroot/pound"

## Logging: (goes to syslog by default)
##	0	no logging
##	1	normal
##	2	extended
##	3	Apache-style (common log format)
LogFacility local0
LogLevel 1

## check backend every X secs:
Alive		180

## use hardware-accelleration card supported by openssl(1):
#SSLEngine	"<hw>"

# poundctl control socket
Control "/var/run/pound/poundctl.socket"

ListenHTTP
	Address 88.123.123.123
	Port	80

	## allow PUT and DELETE also (by default only GET, POST and HEAD)?:
	xHTTP		2

        #Les services à envoyer sur le premier conteneur
	Service
		HeadRequire "Host: .*(domaine1.fr|domaine2.fr|domaine3.fr).*"
		BackEnd
			Address	192.168.0.101
			Port	8080
		End
	End

        #Les services à envoyer sur le second conteneur
        Service
                HeadRequire "Host: .*(domaine4.fr|domaine5.fr).*"
                BackEnd
                        Address 192.168.0.102
                        Port    8080
                End
        End

End

ListenHTTPS
        Address 88.123.123.123
        Port    443
	Cert    "/path/to/certificate/pound.pem"

	HeadRemove "X-Forwarded-Proto"
        AddHeader "X-Forwarded-Proto: https"

        ## allow PUT and DELETE also (by default only GET, POST and HEAD)?:
        xHTTP           2

        #Les services à envoyer sur le premier conteneur
	Service
		HeadRequire "Host: .*(domaine1.fr|domaine2.fr|domaine3.fr).*"
		BackEnd
			Address	192.168.0.101
			Port	8080
		End
	End

        #Les services à envoyer sur le second conteneur
        Service
                HeadRequire "Host: .*(domaine4.fr|domaine5.fr).*"
                BackEnd
                        Address 192.168.0.102
                        Port    8080
                End
        End

End

Sunday, June 9 2013

Transformer un Raspberry Pi en passerelle vers Hubic d'OVH : Nginx, script Toorop & Cloudfuse

10 mars 2014 - Attention, il semble que le code de https://github.com/Toorop/HubicSwiftGateway ne soit plus fonctionnel aujourd'hui... Il faudrait vraisemblablement se rabattre vers https://github.com/oderwat/hubic2swiftgate...

Hubic est une intéressante offre de stockage en ligne proposée par OVH, le champion français de l'hébergement web. Elle dispose notamment d'un bon rapport qualité/prix (60€ HT/an pour 500 Go). Mais elle souffre de plusieurs défauts : pas de client Linux disponible au moment de l'écriture de ces lignes, et le client Windows/MacOs se résume à un client de synchronisation comme le client d'ownCloud ou celui de Dropbox et peut être insuffisant pour réaliser des sauvegarde de données (par exemple des photos).

Voici une reprise de plusieurs bonnes idées glanées sur le net pour pallier ces défauts : nous allons transformer un Raspberry Pi en passerelle Hubic ce qui permettra à tous les périphériques du réseau local d'accéder à Hubic en se passant du client d'OVH.

Introduction technique

Hubic s'appuie (si la presse spécialisée dit vrai) sur OpenStack, et plus précisément sur OpenStack Object Storage encore appelé Swift. Il est donc possible de se connecter à Hubic à l'aide d'un client swift que l'on pourra installer sur son système avec son gestionnaire de paquets préféré (pour les non-linuxiens, Cyberduck intègre normalement les fonctionnalités d'un client swift).

Toutefois, OVH a ajouté à Hubic une couche d'authentification qui n'est pas gérée par défaut par les clients swift. Heureusement entrent alors en jeu les talents de Toorop et son fort utile script que nous allons déployer plus bas.

Un script PHP pour passer l'étape d'authentification

Toorop a développé un script fort utile qui se charge de l'authentification auprès d'Hubic et permet ensuite une "libre" communication avec un client swift. Le script en question est codé en PHP et est disponible ici : https://github.com/Toorop/HubicSwiftGateway.

Installons d'abord un serveur web + PHP sur le Raspberry Pi (que l'on considèrera dans la suite propulsé par Raspbian, dérivée de Debian). Par souci de légèreté, nous déploierons ici Nginx :

aptitude install nginx php5-fpm

puis téléchargeons le script de Toorop :

cd /var/www
git clone https://github.com/Toorop/HubicSwiftGateway.git
cp -R /var/www/HubicSwiftGateway-master/src/www /var/www/HubicSwiftGateway

et créons un nouvel hôte virtuel dans la configuration de nginx qui pointera vers /var/www/HubicSwiftGateway :

touch /etc/nginx/sites-available/hubicgw

Le fichier de configuration pourra contenir :

server {
       server_name hubicgw.raspberry.lan;
       root /var/www/HubicSwiftGateway;
       index index.html index.htm index.php;

       location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
}

On active cet hôte virtuel par :

cd /etc/nginx/sites-enabled
ln -s ../sites-available/hubicgw

et on redémarre nginx :

service nginx restart

La première étape est passée : si on appelle dans le navigateur hubicgw.raspberry.lan alors le système devrait répondre "Headers AUTH_USER and/or AUTH_KEY are missing" ce qui est normal et atteste d'un bon fonctionnement du script php. Le travail sur le Raspberry Pi s'achève ici : il est fin prêt à jouer le rôle de passerelle vers Hubic.

Se connecter alors avec le client swift

A partir de maintenant, les actions sont à effectuer sur les postes depuis lesquels on souhaite accéder à Hubic. On peut dès lors se connecter à Hubic à l'aide du client swift que l'on aura préalablement installé sur la machine de son choix (par ex. aptitude install swift sous Debian) :

swift -A http://hubicgw.raspberry.lan/ -U login_hubic -K motdepasse_hubic

(bien sûr, si le réseau local sur lequel on se trouve n'est pas parfaitement sécurisée Wifi, CPL..., on veillera à activer une connexion https pour éviter que des oreilles indiscrètes ne viennent écouter notre login et notre mot de passe Hubic !)

Simplifier l'accès grâce à cloudfuse

Nous allons poursuivre en installant sur le poste local le petit utilitaire cloudfuse que l'on trouvera ici : https://github.com/redbo/cloudfuse. Une fois téléchargé, il faut le compiler et l'installer par :

./configure
make
make install

On créera alors un fichier .cloudfuse à la racine du compte utilisateur :

username=login_hubic
authurl=http://hubicgw.raspberry.lan
cache_timeout=20

et la commande suivante permettra d'effectuer le montage de l'accès hubic comme un dossier classique de votre ordinateur :

cloudfuse /mnt/hubic/ api_key=password_hubic

Il nous est dès lors possible de naviguer au sein de l'espace hubic depuis le gestionnaire de fichiers favori.

Faire ses sauvegardes avec rsync sur Hubic

Tout est en place pour la dernière étape : nous pouvons désormais utiliser rsync (fameux logiciel unix de sauvegarde) pour synchroniser notre répertoire de photos avec sa sauvegarde en ligne :

rsync -var --size-only /path/to/my/photos /mnt/hubic/default/mon/dossier/photos

Bonnes sauvegardes !

Monday, April 15 2013

Samba et un numflock trop faible !

J'utilise Samba pour partager des contenus avec de nombreux utilisateurs (clients Windows) au travers d'un réseau local. Le serveur est très stable - les contributeurs de Samba ont fait un travail remarquable !

Toutefois, suite à quelques arrêts de copie chez certains utilisateurs, et après un patient épluchage des logs, je découvrais ceci :

lib/util_tdb.c:521(tdb_wrap_log)   tdb(/var/run/samba/locking.tdb): tdb_lock failed on list 5277 ltype=1 (No locks available)
smbd/close.c:296(close_remove_share_mode)
  close_remove_share_mode: Could not get share mode lock for file
lib/util_tdb.c:521(tdb_wrap_log)   tdb(/var/run/samba/locking.tdb): tdb_lock failed on list 9355 ltype=1 (No locks available)
lib/util_tdb.c:521(tdb_wrap_log)   tdb(/var/run/samba/locking.tdb): tdb_lock failed on list -1 ltype=1 (No locks available)
locking/locking.c:804(share_mode_lock_destructor)
  store returned NT_STATUS_UNSUCCESSFUL
lib/util.c:1465(smb_panic)  PANIC (pid 24575): could not store share mode entry: NT_STATUS_UNSUCCESSFUL

Curieux message que je ne parvenais pas à raccrocher avec un quelconque dysfonctionnement. Mes recherches sur Google ne donnaient pas grand chose : quelques postes (anciens) relatifs à HP-UX et à une variable du noyau : nflock.

C'est alors que je compris : comme Samba tourne dans une machine virtuelle OpenVZ, alors le serveur doit avoir épuisé le nombre de locks disponibles pour la VM. L'observation du fichier /proc/user_beancounters (disponible sur l'hôte OpenVZ) confirma le diagnostic : la machine virtuelle avait heurté à plusieurs reprises le seuil de numflock (file locks, verrous de fichier) !

Le seuil se modifie aisément dans le fichier de configuration de la machine virtuelle OpenVZ, et voilà le tour est joué et Samba est apaisé !

En espérant que cette astuce saura aider quelques uns !

Wednesday, March 27 2013

Echappement pour les requêtes à la base de données

En reprenant dernièrement une vieille application, je restais perplexe devant des problèmes d'échappement de caractères assez basiques. Comment diable l'application pouvait-elle fonctionner par le passé ?

Je découvrais alors qu'il existait (et c'est maintenant obsolète) une option :

 php_admin_value magic_quotes_gpc 1
/// 
valable avant PHP 5.3 qui provoquait un échappement global des caractères !

Cette approche est désormais obsolète (la fonction magic_quotes_gpc n'est plus prise en compte dans PHP 5.4) et il semble bien préférable d'échapper au cas par cas les champs avec la fonction :

string mysqli::real_escape_string ( string $escapestr ) ///

Monday, March 11 2013

Phpunit, les variables $_SERVER["nom_du_champ"] et quelques autres surprises

Tester son application est une bonne habitude - personne n'ira soutenir le contraire. Et Phpunit est un des outils majeurs pour ce faire en PHP.

Si l'application à tester tourne avec Zend Framework 1.11, il faut d'abord savoir que Phpunit 3.6.x n'est a priori pas compatible et qu'il faut se rabattre sur les versions 3.4.x (la branche phpunit 3.4 est mentionnée dans la documentation officielle Zend Framework comme celle à privilégier) et peut-être 3.5.x.

Variables $_SERVER

Je butai sur une autre difficulté : l'application à tester utilise plusieurs variables serveur du type $_SERVER"nom_du_champ" qui sont normalement fournies par un SSO (mécanisme d'authentification qui pousse l'identité de l'utilisateur dans les variables $_SERVER. En temps normal, c'est donc le serveur Web qui s'occupe de peupler les variables $_SERVER - qui peut s'en charger pour les tests ? Phpunit peut le faire : on peut ajouter la ligne suivante dans le fichier phpunit.xml (qui définit les tests) :

<server name="nom_du_champ" value="1234567"/>

En PHP, la variable $_SERVER"nom_du_champ" sera alors accessible au cours des tests et aura la valeur '1234567'.

Phpunit 3.4 s'arrête avec un 'x'

Plus tard, Phpunit s'arrêta au cours d'un test sans aucune information, terminant la ligne par le signe pourcent % :

PHPUnit 3.4.14 by Sebastian Bergmann.

.....% 

Normalement, phpunit explique les raisons de l'arrêt et est suffisamment verbeux pour permettre le débogage. Il semble qu'un arrêt aussi brutal soit dû à l'utilisation de la fonction 'exit' dans le code de l'application. En effet, 'exit' stoppe l'exécution de tout code et phpunit n'y échappe pas et s'éteint sans avoir le temps de terminer son travail et de nous glisser à l'oreille les résultats des tests (non achevés d'ailleurs).

Sunday, February 3 2013

Quelques petits scripts bash

Les scripts Bash sont fort pratiques pour automatiser certaines tâches ! Je voulais télécharger une série d'images sur un site distant - les adresses étaient de la forme http://adresse.url/images/imageN.jpg avec N un entier de 1 à 35 - et les transformer en fichiers PDF.

Voici une petite solution toute simple :

#!/bin/bash
	for iNumSlide in {1..35}
	do
		wget "http://adresse.url/images/image"$iNumSlide".jpg";
		convert "image"$iNumSlide".jpg" "image"$iNumSlide".pdf";
	done

Saturday, December 29 2012

Drupal me fait paniquer !

Les mises à jour de sécurité attendent rarement ! Voilà qu'en mettant à jour Drupal (7.15 vers 7.18), grosse frayeur quand le site ne répond plus après la mise à jour et renvoie :

Parse error: syntax error, unexpected T_CLASS in ./includes/bootstrap.inc on line 302

Il semble que cela soit dû à la version de PHP exécutée par défaut sur le serveur hôte : l'ajout de

SetEnv PHP_VER 5.2

dans le .htaccess a permis de résoudre ce problème inattendu !

Wednesday, December 26 2012

ActiveRecord et le gem mysql2 rouspètent

Je rencontrai dernièrement un petit souci lors de la migration d'une application Rails depuis 3.0.1 vers 3.2.9 (la version stable la plus récente alors que j'écris ces lignes). En effet, au cours de la migration, j'étais invité à remplacer le gem mysql par mysql2 (donné comme plus rapide) et à ajouter le gem activerecord-mysql2-adapter.

Je m'exécutai et modifier le Gemfile en ce sens, mais au moment de lancer l'application - et de lancer des commandes sur la base de données via Rake - j'obtenais :

stack trace:
rake aborted!
undefined method accept' for nil:NilClass
/home/pab/.rvm/gems/ruby-1.9.3-p327@global/gems/activerecord-3.2.9/lib/active_record/connection_adapters/abstract/database_statements.rb:7:into_sql'

Et impossible d'aller plus loin...

Heureusement, les fils de discussion GitHub ont volé à mon secours : https://github.com/rails/rails/issues/7295

@nstuart yes, as @rafaelfranca says, you need to remove activerecord-mysql2-adapter from your Gemfile. The mysql2 adapter ships with Rails 3.1 and up, so you don't need this gem (in fact, that gem is causing your error).

et je comprenais qu'il fallait supprimer la ligne gem 'activerecord-mysql2-adapter' du Gemfile. Après une exécution de 'bundle install', tout rentra dans l'ordre.

Monday, November 26 2012

Thunar très lent au démarrage

Si vous aussi Thunar vous irrite car il met un temps long à s'ouvrir lors de son premier lancement (après le démarrage de la machine), voici la solution ! Il fallait penser à chercher "thunar slow cold start" pour trouver la solution sur fil dédié au gestionnaire de fichiers !

Il fallait donc modifier ce fichier

/usr/share/gvfs/mounts/network.mount

en remplaçant

AutoMount=true par AutoMount=false

Il semblerait effectivement que la (trop grande !) patience de Thunar vis-à-vis des montages réseau !

Saturday, October 6 2012

Jouer avec les données EXIF des photos

Les données EXIF sont les méta-données associées aujourd'hui à toutes les photos prises - elles incluent par exemple le type d'appareil, la focale utilisée lors de la prise de vue, la position si l'appareil photo est associé à un module GPS... Et bien sûr, ces données contiennent l'heure et la date de la prise de vue - à condition bien sûr que date et heure soient correctement paramétrées sur l'appareil photographique.

Ces données sont donc très intéressantes. Elles permettront par exemple de retrouver l'heure de prise de vue.

Maintenant, il peut arriver que l'heure paramétrée sur l'appareil photo soit erronée. Il existe un petit outil qui permet de corriger cela : il s'appelle jhead.

La ligne de commande suivante permettra d'ajouter 1 heure à l'heure de prise de vue EXIF :

jhead -ta+1:00 *.JPG

et

jhead -ds2012:10:07 *.JPG

imposera la date du 7 octobre 2012 à toutes les photos

Et voilà un autre outil fort pratique lors du tri des photos :exiv2 permet (entre autre) de renommer une photo d'après la date et l'heure de prise de vue enregistrées dans les données EXIF. Ainsi, même si elles sont prises depuis plusieurs périphériques disctincs, il sera possible de classer naturellement les photos par ordre chronologique !

La commande :

exiv2 rename *.JPG

changera le nom de toutes les images *.JPG par la date et l'heure de la prise de vue sous la forme YYYYMMJJ_HHMMSS.JPG

La commande :

exiv2 -r '%Y-%m-%d_:basename:' *.JPG

permet plus de flexibilité sur le renommage du cliché.

En espérant que cela vous permettra tous de gagner du temps !

Sunday, September 9 2012

Une belle présentation en HTML5

Google a récemment libéré le modèle de diapositives utilisé pour la présentation IO 2012. Une jolie manière de préparer des présentations : on respecte un standard (presqu'universel... HTML5+Javascript) et on s'abstrait de la nécessité de disposer pour la création ou la lecture d'un logiciel spécifique.

http://code.google.com/p/io-2012-slides/

La présentation se visualise également très facilement sur le web et notamment sur les petites tablettes qui deviennent nos compagnons !

Les vidéos sur le Web en vitesse x2 ?

Je ne pense pas qu'il faille toujours aller plus vite pour être plus efficace - mais plutôt que prendre son temps permet assujettir cette ressource finie et de ne pas se laisser dicter sa conduite par une accélération de la société dans une direction... qu'on ne voit pas trop !

Toutefois, il est possible de de gagner un temps certain en accélérant certaines vidéos que l'on regarde sur le net (surtout quand celles-ci sont pauvres en contenu). Les balises <video> d'HTML5 (HTML5 rocks!) possèdent plusieurs attributs de contrôle et notamment :

defaultPlaybackRate* (float): The playback speed at which the video should be played
playbackRate* (float): The current playback speed: 1.0 is normal, 2.0 is two times faster forward, -3.0 is three times faster backwards and so on

Au moment d'écrire ces lignes, le w3c m'informe que seul Chromium/Google Chrome supporte cette fonctionnalité : http://www.w3schools.com/html5/av_prop_defaultplaybackrate.asp

On pourra le confirmer en se rendant sur Youtube HTML5 (http://www.youtube.com/html5) avec une version récente de Chromium par exemple : le système de contrôle de la vidéo permet de choisir la vitesse de lecture (de 0.5 à 2x).

Les discussions sur https://bugzilla.mozilla.org/show_bug.cgi?id=495040 me laissent penser que l'option sera bientôt disponible sur Mozilla Firefox.

C'est une bonne nouvelle pour l'utilisateur - mais ça ne va faire qu'empirer notre consommation de bande passante !

Bon dimanche à tous

Friday, September 7 2012

Mise à jour de Wordpress

En route pour une migration de Wordpress, le moteur de blog qui rend bien des services !

Avant toute mise à jour, on ne le répétera jamais assez, il est fort conseillé d'effectuer des sauvegardes ! On commencera donc par effectuer une sauvegarde complète de la base de données puis une copie complète du répertoire d'installation sur serveur. Ainsi, en cas de gros problème, le retour en arrière sera possible !

Ensuite on trouve le bon lien pour télécharger la dernière version de Wordpress sur Wordpress.org,

wget lebonlien/latest.tar.gz

puis

tar xvzf latest.tar.gz

On copie alors tout le contenu de l'extraction vers l'instance courante.

cp -R wordpress/ mon-instance-de-wordpress/

Dans la manip', le dossier 'wp-content' risque d'avoir perdu son régime de droit, on redonnera au serveur Web le droit d'écrire avec la commande :

chown -R www-data:www-data wp-content

(sous Debian, www-data est par défaut l'utilisateur qui exécute le serveur web)

Le tour est joué : il ne reste plus qu'à se reconnecter à Wordpress et profiter de la nouvelle version !

Mise à jour de Piwik

Avant toute sauvegarde, on effectuera les sauvegardes qui s'imposent : - la base de données complète - et, pour assurer ses arrières, le répertoire de l'application sur le serveur

Puis, on télécharge la dernière version de Piwik :

wget http://wherepiwik.is/latest.zip

et on extrait le tout sur le répertoire Piwik existant :

unzip latest.zip
(do you want to replace ......php -> Yes to [A]ll)

On se connecte alors tout de suite à Piwik qui propose d'effectuer la migration de la base de données - on s'empresse d'accepter (et on remercie intérieurement les développeurs pour leur diligence à nous aider dans le processus de mise à jour).

Et voilà, normalement c'est tout bon !

- page 1 of 3