pkgin 0.5, faster pussycat kill kill

Tags: ,
No Comments »

Avant de partir me dorer la pilule à la maison, je vous jette en pâture une toute nouvelle pre-release de pkgin, j’ai nommé 0.5.0.

Fruit des conseils avisés du sieur Bapt, fort de son experience avec son fâmeux pkgng, ainsi que des multiples feedbacks d’horizons très differents, le code de pkgin 0.5.0 est plus rapide, plus simple et embarque un certain nombre de features requests.

Dans l’ordre d’implémentation:

  • Migration silencieuse d’une base 0.4 vers 0.5
  • Fonction check_yesno() plus souple
  • “Yes” par defaut pour pkgin install / remove / upgrade
  • Une unique structure pour toutes les formes de listes de packages
  • Nettoyage de dizaines de calculs de listes inutiles (perfs x10)
  • Introduction du champs FULLPKGNAME, accélération des recherches
  • unique_pkg(): plus de “many versions of foo available”, le plus récent est toujours choisi
  • Import du progressmeter d’OpenSSH

Cette version restera en gestation dans wip le temps qu’elle soit correctement testée, les changements sont nombreux et profonds, je dois m’assurer que tout fonctionne comme il se doit.
Vous l’aurez compris, il faut tester, TESTER, TESTER !
Je vous invite à rapporter les problèmes potentiels sur la liste de developpement de pkgin, à pkgin-devel-at-lists-point-sourceforge-point-net.

pkgin upgrade

Mais tu t’ennuies dans la vie en fait ?

Tags: , , , , ,
6 Comments »

Depuis que j’ai commencé la serie de billets qui parlent de tunnels, on me demande en substance “c’est chouette et tout mais… tu vas ou là ?”. Rappelez-vous, le premier billet de cette serie parlait de tunnels suédois, et bien évidemment, je ne suis pas le seul à désirer contrôler plus finement le chemin qu’empruntent les paquets IP qui sortent de mes machines. Aussi, avec quelques amis, avons nous décidé de mettre en place un réseau possiblement sécurisé, interconnecté, et hautement disponible. Ainsi, l’objectif est de pouvoir contacter nos réseaux à travers des liens cryptés, et de sortir sur le Net en utilisant differents tunnels, ces routes se construisant dynamiquement grâce au protocole BGP.
Hormis l’aspect purement pratique de la chose, le projet est passionnant et les techniques employées sont élégantes et interessantes. For teh lulz quoi.

Plus précisemment, considérons une machine, hébergée quelque part sur l’Internet. Cette machine fait office de routeur BGP à l’aide du logiciel Quagga. Ce routeur BGP est connecté à d’autres routeurs représentant autant de Systèmes Autonomes (AS), privés bien entendu, on parle ici d’EBGP (Exterior Border Gateway Protocol). À ce routeur, je connecte ma passerelle maison, qui fait partie de mon AS privé. C’est un lien IBGP (Interior Border Gateway Protocol).

Lorsqu’un noeud, que j’ai déclaré dans la configuration du routeur, se connecte à notre réseau, ce dernier annonce les routes qu’il souhaite. Par exemple un réseau d’échange ou encore une route par defaut. Un système de poids fera préférer tel ou tel chemin pour joindre un point du réseau.

Voici un exemple de configuration, très simple, de l’un des routeurs de bordure:

password trescomplique
enable password trestrescomplique
!
router bgp 65535
 bgp router-id 10.0.1.1
 network 192.168.10.0/24
 neighbor 10.0.1.2 remote-as 65535
 neighbor 10.0.2.1 remote-as 65536
!
ip forwarding

On établit ici une liaison IBGP vers 10.0.1.2 et EBGP vers 10.0.2.1, et on annonce sur ces réseaux comment joindre 192.168.10.0/24.

Comme vous vous en doutiez, ces routeurs sont tous reliés entre eux par une liaison point à point IPsec, routent leur traffic à travers des tunnels gre(4) sur les liaisons IPsec, et sortent tous par défaut sur Internet via la Suède.

Ce dernier point n’est pas anodin d’un point de vue routage; en effet, il est contre-productif qu’une partie du traffic, celui de l’infrastructure, emprunte la suède pour communiquer avec ses pairs. Pire, dans certains cas cela provoquera des cas de routage asymétrique. Aussi, il est indispensable de mettre en place des règles de gestion de routage… en amont de la table de routage ainsi que de la SPD d’IPsec. La solution ? PF bien sûr :)

Voici la configuration que j’utilise pour m’assurer que tout le traffic lié à l’infrastructure emprunte bien des chemins optimaux (explication dans la conf):

real_if="xennet0"
tun_if="tap0"
gateway="192.168.0.254"

openvpn="{ 1194 10010 10020 }"
direct_ports="{ 22 53 80 179 443 500 4500 }"
ipsec="{ 179 500 4500 }" # ipsec protocols + BGP

# comme vu dans un billet precedent, on s'assure de repondre via notre IP
# publique "reelle" lorsque l'on est interroges sur $direct_ports
pass in quick log on $real_if reply-to ($real_if $gateway) proto { tcp, udp } \
        from any to any port $direct_ports

# meme methode pour les protocoles utilises par IPsec
pass in quick log on $real_if reply-to ($real_if $gateway) proto { ah, esp } \
        from any to any

# on route les protocoles d'echange de cle (isakmp) sur l'interface
# reelle $real_if
pass out quick log route-to ($real_if $gateway) proto { tcp, udp } \
        from any to any port $ipsec
# on route tout le traffic AH/ESP via $real_if
pass out quick log route-to ($real_if $gateway) proto { ah, esp } \
        from any to any

# on bloque tout le traffic se dirigeant vers l'interface reelle $real_if
# sauf OpenVPN et les protocoles utilises par IPsec
block out log on $real_if
pass out on $real_if proto { tcp, udp } from any to any port $openvpn
pass out on $real_if proto { ah, esp } from any to any

Ces règles doivent être chargées après le chargement d’OpenVPN, on peut réaliser cette séquence très simplement à l’aide de la directive up du fichier de configuration du logiciel:

script-security 2
up /home/imil/bin/pf-up.sh

Le script en question est trivial:

#!/bin/sh

/sbin/pfctl -f /etc/pf.conf-ovpn

Moyennant quoi, à chaque démarrage d’OpenVPN, ces règles viendront s’assurer qu’aucun paquet hors contrôle ne transitera par l’IP publique “réelle” de notre serveur, tout le traffic non lié à l’infrastructure devant passer par le tunnel Suédois.

Le projet est toujours en cours de construction et il reste encore quelques boulons à serrer, mais ‘vous inquiétez pas, vous serez les permiers au courant des évolutions ;)

Un dernier mot, certains lecteurs m’envoient depuis quelque jours leur setup à debugger et m’expliquent en détail les problèmes qu’ils rencontrent, vous comprendrez aisemment que je ne peux humainement pas dépiler tout ça tout seul, mais n’oubliez pas que, modulo votre bienséance, vous êtes bienvenu sur le canal #gcu@freenode !

I herd you liek tunnels… (updated)

Tags: , , , , ,
1 Comment »

so i put a tunnel in your tunnel so you can route while you route. Une fois n’est pas coutume, Xzibit résume assez bien la situation.

Mais revenons quelques heures en arrière.

Alors que nos tunnels IPsec fonctionnent sans broncher depuis nos dernières experiences, l’un des objectifs finaux de l’opération montrait le boût de son nez: router des réseaux à travers nos fâmeuses liaisons IPsec. Et “ça marche pas”(tm).
Plus précisemment, il apparaît impossible de joindre d’autres réseaux que ceux liés par IPsec, ou plus particulièrement la SPD, et en y reflechissant à deux fois, ceci est parfaitement normal. La solution ? Un tunnel par dessus le tunnel !

Fort heureusement, nos UNIX modernes bénéficient de systèmes de tunneling peu coûteux en overhead, et parmi eux, gre(4). Pourquoi gre(4) et non gif(4) ? honteuse réponse: IPsec + domU + gif == kernel panic. Si.

En réalité, la mise en place d’un tel mécanisme est beaucoup plus simple qu’il n’y parait, nous allons simplement utiliser la liaison déjà établie par IPsec, 10.0.0.1 vers 10.0.0.2 selon l’exemple du billet précédent, pour établir un tunnel qui ne sera pas soumis à la base stricte d’IPsec et nous permettra de router ce que bon nous semble d’un bout du tunnel à l’autre.

Cela est à nouveau pris en charge très natuellement par NetBSD; il suffit, pour mettre en place cette nouvelle interconnexion, de créer un fichier /etc/ifconfig.gre0 de la forme suivante:

create
inet 10.0.1.1 10.0.1.2 netmask 255.255.255.255
tunnel 10.0.0.1 10.0.0.2 up

pour que s’établisse, sur notre interconnexion IPsec (10.0.0.1 – 10.0.0.2), une nouvelle liaison (10.0.1.1 – 10.0.1.2) libre d’être utilisée comme pivot de routage.

Attention ! Afin que ce petit monde fonctionne sans soucis à chaque démarrage, il ne faudra pas utiliser /etc/ifaliases comme je l’annonçais dans le précédent billet, mais compléter le fichier /etc/ifconfig.iface de cette façon:

up
inet 1.2.3.4 netmask 0xffffff00
inet 10.0.0.1 netmask 0xffffffff alias

car autrement, les alias seront montés après les tunnels gre(4), ifaliases étant manifestement appelé à la suite de ifconfig.if.

More to come…

Y’a plus simple mais c’est moins rigolo (updated)

Tags: , ,
4 Comments »

02 / 08 / 2011 – Mise à jour il-ne-faut-pas utiliser lo0 comme interface pivot, il ne faut pas. Pour une raison que j’ignore totalement, aucun autre protocole qu’ICMP n’a jamais fonctionné pendant nos tests, si d’aucuns ont une explication rationelle, je suis toutes ouïes. Le problème est résolu en utilisant les interfaces physiques.

IPsec. À l’évocation de ce terme technique, vous avez avalé d’un trait votre Gin Tonic, vous éteignez votre écran en espérant qu’il s’agisse d’un mauvais rève et vous décrivez des cercles dans votre bureau en vous frappant la tête avec une règle metallique.
Je le sais, j’étais pareil.

Et puis, avec l’ami mat, nous avons lu, épluché, factorisé, testé, pesté, hurlé, et finalement, je vous propose un petite petite bafouille sur l’art de mettre en place un tunnel IPsec entre deux machines NetBSD. Ouais.

Il me semble que cette configuration est assez classique, jugez plutot: une passerelle, chez vous, disposant d’un bridge vers un réseau quelconque d’opérateur qui fournit une adresse IP fixe publique (si ce n’est pas le cas, vous savez ce qu’il vous reste à faire), et de l’autre coté, une machine dédiée dont vous disposez chez l’un des multiples hébergeurs low-cost aujourd’hui disponibles.
Petite particularité, cette dernière, dans mon cas, est une machine virtuelle NetBSD, un domU hebergé par un dom0 Debian/GNU Linux.

En raison de cette particularité, la première étape consiste à manipuler iptables afin de translater les differents protocoles nécessaires à IPsec directement vers ma machine virtuelle. Sur mon dom0, j’ajoute donc les règles suivantes:

# isakmp
-A PREROUTING -i eth0 -p udp -m udp --dport 500 -j DNAT --to-destination 192.168.2.1:500
# isakmp + nat-t
-A PREROUTING -i eth0 -p udp -m udp --dport 4500 -j DNAT --to-destination 192.168.2.1:4500
# protocole ESP
-A PREROUTING -i eth0 -p esp -j DNAT --to-destination 192.168.2.1
# protocole AH
-A PREROUTING -i eth0 -p ah -j DNAT --to-destination 192.168.2.1

Nous considérerons que l’IP publique de cette machine est 1.2.3.4, l’IP privée du domU est 192.168.2.1.

Le logiciel que nous utiliserons pour établir notre tunnel IPsec, d’un coté et de l’autre, sera le fâmeux racoon.

Je vous jette en pâture la configuration simplifiée que j’utilise, cette dernière étant expliquée point par point à cette adresse:

# cat /etc/racoon/racoon.conf
path pre_shared_key "/etc/racoon/psk.txt";

padding {
    maximum_length 20;
    randomize off;
    strict_check off;
    exclusive_tail off;
}

listen
{
    isakmp 192.168.2.1 [500];
}

remote anonymous
{
    exchange_mode aggressive;
    dpd_delay 20;

    weak_phase1_check on;

    proposal
    {
        encryption_algorithm 3des;
        hash_algorithm sha1;
        authentication_method pre_shared_key;
        dh_group 2;
    }
}

sainfo anonymous
{
    pfs_group 2;
    encryption_algorithm 3des;
    authentication_algorithm hmac_sha1;
    compression_algorithm deflate;
}

Notez que je fais écouter isakmp sur l’adresse privée du domU.
Il faudra créer le fichier /etc/racoon/psk.txt avec des droits stricts (0600), qui contiendra l’adresse IP du peer et une passphrase:

# cat /etc/racoon/psk.txt
5.6.7.8 unepassphrasedunfortbeaugabarit

5.6.7.8 étant l’IP publique de ma passerelle.
Coté passerelle, justement, nous créons l’exacte copie de cette configuration en remplaçant l’ip d’écoute de isakmp et l’ip publique présente dans le fichier /etc/racoon/psk.txt par l’IP publique de notre machine hébergée (1.2.3.4, donc).

Ceci étant fait, il faut maintenant indiquer au noyau pour quels sous-réseaux il est nécessaire de crypter le trafic IP. Cette indication est donnée via l’outil setkey, qui lira le fichier /etc/ipsec.conf sous NetBSD (nous y reviendrons). Un peu de concentration, voici son contenu sur la machine hébergée:

# on fait le ménage
flush;
spdflush;
# et on indique nos routes
spdadd 10.0.0.1/32 10.0.0.2/32  any -P out ipsec esp/tunnel/192.168.2.1-5.6.7.8/require;
spdadd 10.0.0.2/32 10.0.0.1/32 any -P in ipsec esp/tunnel/5.6.7.8-192.168.2.1/require;

Ici, 10.0.0.1 est le “réseau” (une IP unique dans mon cas) joignable à travers IPsec, via le tunnel établi entre l’IP privée de mon domU et l’IP publique de ma passerelle. De l’autre côté, le “réseau” est 10.0.0.2.
Afin de clarifier les choses, voici la configuration coté passerelle:

flush;
spdflush;
spdadd 10.0.0.2/32 10.0.0.1/32  any -P out ipsec esp/tunnel/5.6.7.8-1.2.3.4/require;
spdadd 10.0.0.1/32 10.0.0.2/32 any -P in ipsec esp/tunnel/1.2.3.4-5.6.7.8/require;

Miroir miroir, c’est suykidikihé, on observe que la configuration est l’exacte symétrie de celle présente sur la machine hébergée à cette difference près que notre passerelle s’adresse à une IP publique, le dom0, de l’autre coté, s’occuppe de translater tout ce merdier en IP privée.
Ça va, vous suivez toujours ?
Il ne reste qu’une opération à mener pour que ces réseaux se voient: router effectivement ces divers réseaux entre eux; mais voila, pour l’instant les IPs endpoint du tunnel IPsec n’existent pas, et pour pallier à cela, nous allons une fois de plus abuser de l’ami loopback nous allons utiliser des alias sur les interfaces physiques (virtuelles dans le cas du domU) . Par exemple, sur notre domU:

# ifconfig xennet0 alias 10.0.0.1 netmask 255.255.255.255

Et sur notre passerelle:

# ifconfig sip0 alias 10.0.0.2 netmask 255.255.255.255

Reste à effectivement router ces “réseaux” entre eux, par exemple sur la passerelle:

# route add -host 10.0.0.1 10.0.0.2

Avant d’automatiser tout ce petit monde, vous pouvez d’ores et déjà réaliser quelques tests “live”. Chargez d’abord vos règles SPD des deux côtés:

# setkey -f /etc/ipsec.conf

Puis démarrez racoon en mode debug + verbose, sans passer en tâche de fond:

# racoon -F -d -v -f /etc/racoon/racoon.conf

Une fois satisfaits, nous allons pouvoir automatiser ces opérations afin qu’elles soient prises en compte à chaque boot. Non, nous n’allons pas écrire un script à la con.
Tout d’abord, nous préparons nos interfaces d’alias à l’aide du fichier /etc/ifaliases, sur notre machine hebergée par exemple:

# cat /etc/ifaliases
10.0.0.1 xennet0 255.255.255.255

Puis nous mettons en place les routes statiques:

# cat /etc/route.conf
host 10.0.0.2 10.0.0.1

Enfin, nous indiquons à rc qu’il devra charger la base SPD et démarrer racoon à l’aide du fichier /etc/rc.conf:

ipsec=YES
racoon=YES

Et nous y voila, une connectique sûre, standard et bidirectionelle en un tournemain.

En terme de latence, ça donne ça:
Sans IPsec

64 bytes from 1.2.3.4: icmp_seq=0 ttl=52 time=21.770 ms

Avec IPsec

64 bytes from 10.0.0.1: icmp_seq=0 ttl=255 time=21.869 ms

Tranquille hein.

Je vous livre en sus les quelques liens qui nous ont aidé à peaufiner notre configuration:

  • http://www.kame.net/newsletter/20001119/
  • http://www.netbsd.org/docs/network/ipsec/
  • http://www.netbsd.org/docs/network/ipsec/rasvpn.html
  • http://wtf.hijacked.us/wiki/index.php/IPSEC-Racoon
  • http://www.mad-hacking.net/documentation/linux/networking/ipsec/nat-vpn.xml
  • http://www.lacave.net/~fred/racoon/config.html

Et vous souhaite une bonne nuit.

Rapid’CGI PHP, nginx et NetBSD

Tags: , , ,
3 Comments »

Il y a une foultitude de documentations sur la façon de faire tourner PHP via fastCGI sur un nginx, et à chaque fois, j’ai l’impression de lire des tambouilles copiées/collées de ci et de là. Ça cause de scripts (non portables la plupart du temps), de wrappers, et autres solutions capillotractées, et ça me plaît pas. En dépilant un peu, j’ai abouti à une solution que je trouve élégante… sous NetBSD evidemment :)

Tout d’abord, il s’agit de compiler PHP avec le support fastCGI, sans pollution avec le module CGI. Ceci est réalisé grâce au fichier /etc/mk.conf et la directive suivante:

PKG_OPTIONS.php=        -cgi fastcgi

Un make install clean plus loin, on peut s’assurer du support fastCGI d’un des binaires générés de cette façon:

$ /usr/pkg/libexec/cgi-bin/php -h|grep -i bind
  -b
|
 Bind Path for external FASTCGI Server mode

Il existe dans pkgsrc un outil spécialement dédié à gérer ce type d’implémentation, il s’agit de www/spawn-fcgi, que nous installons donc sans hésiter. spawn-fcgi a le bon goût d’être controlé par le fichier /etc/rc.conf, ainsi, après avoir copié /usr/pkg/share/examples/rc.d/spawnfcgi dans le repertoire /etc/rc.d, on configure le logiciel de cette façon:

$ grep spawn /etc/rc.conf
spawnfcgi=YES
spawnfcgi_jobs="php"
spawnfcgi_php_command="/usr/pkg/libexec/cgi-bin/php"
spawnfcgi_php_args=""
spawnfcgi_php_user="nginx"
spawnfcgi_php_address="127.0.0.1"
spawnfcgi_php_port="9000"
spawnfcgi_php_children="3"

Attention toutefois, il existe un minuscule bug dans rc.d/spawnfcgi que j’ai signalé au mainteneur, voici le patch trivial à appliquer:

--- /usr/pkg/share/examples/rc.d/spawnfcgi      2011-07-24
12:57:38.000000000 +0200
+++ /etc/rc.d/spawnfcgi 2011-07-24 17:16:49.000000000 +0200
@@ -38,6 +38,7 @@
                job_user=$(eval echo \$${name}_${job}_user)
                job_cwd=$(eval echo \$${name}_${job}_cwd)                                       job_socket=$(eval echo \$${name}_${job}_socket)
+               job_port=$(eval echo \$${name}_${job}_port)
                job_socket_mode=$(eval echo \$${name}_${job}_socket_mode)
                job_address=$(eval echo \$${name}_${job}_address)
                job_children=$(eval echo \$${name}_${job}_children)

Update bon, on est jamais mieux servi que par soi-même toussa, j’ai donc corrigé le package dans pkgsrc current. Un ptit cvs up -dP -rHEAD et tout devrait rouler.
Nous pouvons alors démarrer spawnfcgi comme n’importe quel autre service:

$ sudo /etc/rc.d/spawnfcgi start

Et de constater:

$ ps axuww|grep php
nginx     795  0.0  0.8  26412  8012 ?       Is    5:16PM  0:00.17 /usr/pkg/libexec/cgi-bin/php
nginx   18322  0.0  0.7  26412  7816 ?       Is    5:16PM  0:00.14 /usr/pkg/libexec/cgi-bin/php
nginx   22540  0.0  0.8  26412  8012 ?       Is    5:16PM  0:00.18 /usr/pkg/libexec/cgi-bin/php

Eeeeeexcellent Smithers.

Il ne reste alors plus qu’à configurer nginx pour qu’il passe à PHP en mode fastCGI les pages de script à interpréter:

        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /home/user/www$fastcgi_script_name;
            include        /usr/pkg/etc/nginx/fastcgi_params;
        }

Il faudra evidemment prendre soin de remplacer /home/user/www par le chemin de votre documentroot. Il doit d’ailleurs certainement y avoir une variable pour s’épargner cela…

On oublie pas le petit phpinfo() qui va bien:

Jouons à cache-cache

Tags: , , ,
4 Comments »

Aujourd’hui, en raison des diverses lois liberticides mises en oeuvre pour controler l’activité des usagers sur Internet dans notre beau pays de la plainte, je me suis abonné à un très bon service de VPN fourni par la société Suédoise VPNtunnel.

Le service est impeccable, la conf OpenVPN fonctionne out-of-the-box, et ainsi la route par defaut de ma machine client prend le chemin de la Suède. Nickel.

Mais vous me connaissez, j’aime bien me compliquer la vie.
Le service en question ne fournit pas d’IP fixe, et c’est bien normal au vu de l’objectif même de l’offre; seulement voila, la machine que j’ai raccordé à ce service n’est pas une bête workstation, mais plutot un serveur situé “quelque part”. Évidemment, je me connecte via ssh à cette machine, et il m’est fort désagréable de devoir retrouver son IP en permanence. Pas question de bidouiller un truc à base de dynamic DNS, on est pas des sauvages tout de même.

Le problème, je vous le donne en mille, c’est que lorsque je ssh vers l’IP publique habituelle de cette machine, le paquet de retour emprunte la route par défaut, le tunnel donc, et que le serveur en question, c’est une machine virtuelle, dont le port SSH est translaté par le dom0. Oui je sais ça commence à donner mal à la tête. En un mot comme en cent, la connexion SSH n’aboutit jamais, passant par un endroit et sortant par un autre.

La solution: PF le magnifique !

Je vous entretenais il y a quelques temps déjà de la fabuleuse directive route-to, mais cette dernière ne s’applique pas au cas présent. Fort heureusement, sa soeur jumelle, reply-to réalise exactement le travail voulu, et ce en 2 coups de cuiller à pot. Démonstration:

Sur mon dom0, une machine Debian/GNU Linux, je redirige le traffic du port 2323 sur le port 22 de ma machine virtuelle NetBSD de cette façon:

-A PREROUTING -i eth0 -p tcp -m tcp --dport 2323 -j DNAT --to-destination 192.168.0.8:22
-A POSTROUTING -s 192.168.0.8/32 -j MASQUERADE # ici, on NAT la sortie de sorte que le domU puisse répondre au client

Mais lorsque le domU souhaite répondre à l’IP qui le sollicite sur le port 22, il emprunte sa route par défaut, et nous nous retrouvons dans un bon vieux cas de routage asymétrique, la lose.
On peut lire dans le man de pf.conf la prose suivante:

     reply-to
           The reply-to option is similar to route-to, but routes packets that
           pass in the opposite direction (replies) to the specified inter-
           face.  Opposite direction is only defined in the context of a state
           entry, and reply-to is useful only in rules that create state.  It
           can be used on systems with multiple external connections to route
           all outgoing packets of a connection through the interface the
           incoming connection arrived through (symmetric routing enforce-
           ment).

Et j’ai envie de dire “pile poil”. Voyons ce que cela nous donne:

real_if="xennet0"
gateway="192.168.0.254"

direct_ports="{ 22,80,443 }"

pass in quick log on $real_if reply-to ($real_if $gateway) proto tcp \
        from any to any port $direct_ports

Wooooh, trop balèse Watson !

Moyennant ces quelques lignes, nous pouvons constater, heureux:

imil@tatooine:~$ telnet foobar.imil.net 2323
Trying 1.2.3.4...
Connected to foobar.imil.net.
Escape character is '^]'.
SSH-2.0-OpenSSH_5.0 NetBSD_Secure_Shell-20080403-hpn13v1

C’est la classe ou bien ?

WP Theme & Icons based on GlossyBlue by N.Design Studio
Banner from www.trynthlas.com
Entries RSS Comments RSS Log in
Performance Optimization WordPress Plugins by W3 EDGE