omnomnomnomnom

Tags: , ,
No Comments »

Au boulot, j’ai mis en place un NAS. À force de lire les louanges de ZFS, je me suis dit que c’était l’occasion idéale d’utiliser réellement ses capacités, et plus simplement comme “le filesystem de Solaris/OpenSolaris”.

Nous sommes partis de l’hypothèse suivante :

  • Nous utiliserons les fonctions RAID de ZFS, et non pas le RAID5 natif fourni par le controlleur du serveur de disques; en effet, après moult lectures, il apparait que le mode RAID-Z de ZFS est non seulement plus flexible, plus rapide, mais également plus sur (voir par exemple ici ou ici)
  • La partition de boot/root fonctionnera, elle, en mode mirror et sera disponible sur tous les disques
  • Le reste de la place disponible formera un pool raidz. Nous aurions pu choisir raidz2, mais ce dernier nous aurait coûté de l’espace en moins.

Le serveur que nous utilisons pour ce setup comporte une carte HP de type Smart Array g6, dont le firmware ne permet pas de mode JBOD, aussi, chaque disque formera une unité logique RAID0.

Les disques ont une taille de 1To; le système occuppant moins de 10Go, nous spécifions à l’installation que nous ne souhaitons utiliser “que” 30Go pour le système, le reste sera affecté au raidz.

Une fois OpenSolaris installé sur le disque logique numero 1, nous mettons en place le mirroring sur chaque unité logique. Pour ce faire, nous allons préparer un premier disque à l’aide de la commande format puis dupliquer la table de partitions du disque 1 sur ce second disque à l’aide des commandes prtvtoc et fmthard :

# format
Searching for disks...done

AVAILABLE DISK SELECTIONS:
       0. c8t0d0 
          /pci@0,0/pci8086,340a@3/pci103c,3241@0/sd@0,0
       1. c8t1d0 
          /pci@0,0/pci8086,340a@3/pci103c,3241@0/sd@1,0
       2. c8t2d0 
          /pci@0,0/pci8086,340a@3/pci103c,3241@0/sd@2,0
       3. c8t3d0 
          /pci@0,0/pci8086,340a@3/pci103c,3241@0/sd@3,0
       4. c8t4d0 
          /pci@0,0/pci8086,340a@3/pci103c,3241@0/sd@4,0
       5. c8t5d0 
          /pci@0,0/pci8086,340a@3/pci103c,3241@0/sd@5,0

Specify disk (enter its number): 1
selecting c8t1d0
[disk formatted]
No Solaris fdisk partition found

FORMAT MENU:
        disk       - select a disk
        type       - select (define) a disk type
        partition  - select (define) a partition table
        current    - describe the current disk
        format     - format and analyze the disk
        fdisk      - run the fdisk program
        repair     - repair a defective sector
        label      - write label to the disk
        analyze    - surface analysis
        defect     - defect list management
        backup     - search for backup labels
        verify     - read and display labels
        save       - save new disk/partition definitions
        inquiry    - show vendor, product and revision
        volname    - set 8-character volume name
        !     - execute , then return
        quit
format> fdisk
No fdisk table exists. The default partition for the disk is:

  a 100% "SOLARIS System" partition

Type "y" to accept the default partition, otherwise type "n" to edit the partition table.
y
format> quit

# prtvtoc /dev/rdsk/c8t0d0s2 |fmthard -s - /dev/rdsk/c8t1d0s2

Pour rappel, le slice numero 2 (s2) représente l’intégralité du disque.

Intervient à cet instant une astuce particulière relative à notre setup. J’ai dit plus haut que nous avons pris le parti de mirrorer la partition système sur tous les disques, cela signifie que sur chacun d’eux, nous devons disposer de deux slices, or, le disque numero 1, en cours d’utilisation, ne peut être manipulé de la sorte. Nous allons donc :

  • Créer un deuxième slice sur le second disque
  • Intégrer le slice 1 du second disque au pool système
  • Détacher le disque 1 du pool système
  • Effacer le slice système du disque numero 1
  • Re-formatter le disque numero 1
  • Importer la table de partition du disque 2 vers le disque 1
# format
[...]
Specify disk (enter its number): 1
format> partition
[...]
partition> 3
Part      Tag    Flag     Cylinders         Size            Blocks
  3 unassigned    wu       0                0         (0/0/0)              0

Enter partition id tag[unassigned]:
Enter partition permission flags[wu]: wm
Enter new starting cyl[0]: 1955
Enter partition size[0b, 0c, 0e, 0.0mb, 0.0gb]: 900gb
partition> label
partition> quit
format> quit

Notez que la valeur du cylindre de départ est égale au prochain cylindre disponible. Dans notre cas, le dernier cylindre de la partition système était 1954.

On attache le 1er slice du second disque à rpool

# zpool attach -f rpool c8t0d0s0 c8t1d0s0

On attend que le mirroring soit effectué (quelques secondes), puis on détache le premier disque :

# zpool detach rpool c8t0d0s0

On détruit maintenant le partitionnement du disque 1

# format
[...]
Specify disk (enter its number): 0
[...]
format> fdisk
             Total disk size is 60798 cylinders
             Cylinder size is 32130 (512 byte) blocks

                                               Cylinders
      Partition   Status    Type          Start   End   Length    %
      =========   ======    ============  =====   ===   ======   ===
          1       Active    Solaris2          1  60797    60797    100

SELECT ONE OF THE FOLLOWING:
   1. Create a partition
   2. Specify the active partition
   3. Delete a partition
   4. Change between Solaris and Solaris2 Partition IDs
   5. Exit (update disk configuration and exit)
   6. Cancel (exit without updating disk configuration)
Enter Selection:
fdisk> 3
[...]
Specify the partition number to delete (or enter 0 to exit): 1
fdisk> 1
[...]
Indicate the type of partition you want to create
  1=SOLARIS2   2=UNIX        3=PCIXOS     4=Other
  5=DOS12      6=DOS16       7=DOSEXT     8=DOSBIG
  9=DOS16LBA   A=x86 Boot    B=Diagnostic C=FAT32
  D=FAT32LBA   E=DOSEXTLBA   F=EFI        0=Exit? 1

Specify the percentage of disk to use for this partition
(or type "c" to specify the size in cylinders). 100

Should this to become the active partition? If yes, it will be
activated each time the computer is reset or turned on.
Please type "y" or "n". y

Enter Selection: 5

On exporte la table de partitions du disque 2 vers le disque 1

# prtvtoc /dev/rdsk/c8t1d0s2 |fmthard -s - /dev/rdsk/c8t0d0s2

Puis on rattache le slice 1 du disque 1 à rpool :

# zpool attach -f rpool c8t0d0s0 c8t1d0s0

Voila !

Nous pouvons maintenant préparer et importer la table des partitions sur les disques suivants grâce au même combo utilisé pour le disque 2 (format>fdisk, prtvtoc et fmthard).
Ainsi, il est maintenant possible d’attacher l’ensemble de nos slices au pool système :

zpool attach -f rpool c8t0d0s0 c8t2d0s0
zpool attach -f rpool c8t0d0s0 c8t3d0s0
etc...

Une fois ceci effectué, il est indispensable d’installer grub sur l’ensemble des disques, de façon que notre NAS puisse booter indifféremment sur n’importe lequel.

# installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c8t0d0s0
# installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c8t1d0s0
# installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c8t2d0s0
etc...

On constate le succès de l’opération grâce à la commande zpool :

# zpool status
  pool: rpool
 state: ONLINE
 scrub: resilver completed after 0h6m with 0 errors on Fri Apr  9 16:27:03 2010
config:

        NAME          STATE     READ WRITE CKSUM
        rpool         ONLINE       0     0     0
          mirror      ONLINE       0     0     0
            c8t1d0s0  ONLINE       0     0     0
            c8t2d0s0  ONLINE       0     0     0
            c8t0d0s0  ONLINE       0     0     0
            c8t3d0s0  ONLINE       0     0     0  6.10G resilvered
            c8t4d0s0  ONLINE       0     0     0  6.10G resilvered
            c8t5d0s0  ONLINE       0     0     0  6.10G resilvered

errors: No known data errors

Désormais, tous nos disques disposent également d’un second slice, s3, qui sera lui affecté à un pool raidz, nous effectuons l’opération de cette façon :

# zpool create -f omnomnom raidz c8t0d0s3 c8t1d0s3 c8t2d0s3 c8t3d0s3 c8t4d0s3 c8t5d0s3

Ce qui nous donne :

# zpool status
  pool: omnomnom
 state: ONLINE
 scrub: none requested
config:

        NAME          STATE     READ WRITE CKSUM
        omnomnom        ONLINE       0     0     0
          raidz1      ONLINE       0     0     0
            c8t0d0s3  ONLINE       0     0     0
            c8t1d0s3  ONLINE       0     0     0
            c8t2d0s3  ONLINE       0     0     0
            c8t3d0s3  ONLINE       0     0     0
            c8t4d0s3  ONLINE       0     0     0
            c8t5d0s3  ONLINE       0     0     0

errors: No known data errors

  pool: rpool
 state: ONLINE
 scrub: resilver completed after 0h6m with 0 errors on Fri Apr  9 16:27:03 2010
config:

        NAME          STATE     READ WRITE CKSUM
        rpool         ONLINE       0     0     0
          mirror      ONLINE       0     0     0
            c8t1d0s0  ONLINE       0     0     0
            c8t2d0s0  ONLINE       0     0     0
            c8t0d0s0  ONLINE       0     0     0
            c8t3d0s0  ONLINE       0     0     0  6.10G resilvered
            c8t4d0s0  ONLINE       0     0     0  6.10G resilvered
            c8t5d0s0  ONLINE       0     0     0  6.10G resilvered

errors: No known data errors

On peut dès lors utiliser les commandes ZFS pour créer un filesystem sur notre pool raidz :

# zfs create omnomnom/backup

Placer un quota :

# zfs set quota=3.5T omnomnom/backup

Ou encore exporter un autre système de fichiers en NFS :

# zfs set sharenfs=on omnomnom/share

Trop dur.

Un petit df pour la route :

# df -h
Filesystem            Size  Used Avail Use% Mounted on
rpool/ROOT/opensolaris
                       24G  2.9G   21G  13% /
swap                  7.2G  332K  7.2G   1% /etc/svc/volatile
/usr/lib/libc/libc_hwcap1.so.1
                       24G  2.9G   21G  13% /lib/libc.so.1
swap                  7.2G  8.0K  7.2G   1% /tmp
swap                  7.2G   52K  7.2G   1% /var/run
rpool/export           21G   21K   21G   1% /export
rpool/export/home      21G   29K   21G   1% /export/home
rpool/export/home/imil
                       21G  862K   21G   1% /export/home/imil
rpool                  21G   78K   21G   1% /rpool
omnomnom                4.3T   35K  4.3T   1% /omnomnom
omnomnom/backup         3.5T   32K  3.5T   1% /omnomnom/backup
omnomnom/share          4.3T   32K  4.3T   1% /omnomnom/share

Merci à nico pour ses nombreux conseils.

pkgsrc/net/nagstamon… ça arrive (commited)

Tags: , ,
No Comments »

Il y a quelques jours, nico me faisait découvrir nagstamon. Ce fabuleux petit outil est le pendant du plugin Nagios Checker pour Firefox pour votre bureau UNIX/Linux.

Nagstamon est disponible dans le repository unstable de Debian, mais devinez quoi, pas dans pkgsrc. Ntt.. ntt.. ntt… je ne pouvais pas laisser ce vide perdurer.

Pkgsrc est actuellement en status freeze afin de préparer la sortie de pkgsrc-2010Q1, aussi, nous ne sommes autorisés à commiter que des correctifs mineurs ou impactant la sécurité. Ainsi, pour l’impatient qui souhaite essayer sur le champs ce package, j’ai mis en ligne un .shar du futur package ici même, à déployer dans /usr/pkgsrc/net/nagstamon.

update

À vos CVS :)

Gestion des hôtes dans syslog.conf

Tags: ,
1 Comment »

J’ai, dans mon réseau, des équipements capables d’utiliser le protocole syslog. Bien évidemment, je me suis mis en tête de mettre en route cette fonctionnalité, et ainsi de configurer ma passerelle NetBSD afin qu’elle serve également de serveur syslog.

Syslog est démarré par défaut sous NetBSD, mais uniquement en “secure mode”. On peut constater cela dans le fichier /etc/defaults/rc.conf :

# grep ^syslog /etc/defaults/rc.conf
syslogd=YES             syslogd_flags="-s"      # -s "secure" unix domain only

Le flag "-s" ordonne à syslogd de n’écouter que sur une socket UNIX, au lieu d’une socket UDP. La première étape consiste donc à ajouter dans le fichier /etc/rc.conf la ligne suivante :

syslogd_flags=""

La partie moins triviale réside dans la séparation des logs fonction des hôtes desquels ils proviennent. Je n’ai pas trouvé le man de syslog.conf très explicite, et plusieurs tests ont été nécessaires pour comprendre le mécanisme d’”attachement” d’événements. Voici une partie de mon fichier /etc/syslog.conf :

+host1,host2
*.*                                                     /var/log/hosts.log
-host1,host2

*.err;kern.*;auth.notice;authpriv.none;mail.crit        /dev/console
*.info;auth,authpriv,cron,ftp,kern,lpr,mail.none        /var/log/messages
kern.debug                                              /var/log/messages

L’astuce réside evidemment dans les 3 premières lignes. Il faut les comprendre de cette façon :

  • Pour tous les messages en provenance de host1 et host2, on applique les règles qui suivent
  • Tout type de message est écrit dans /var/log/hosts.log
  • Pour toute autre machine (y compris la machine locale), on applique les règles qui suivent
  • Suivent les règles par defaut du fichier syslog.conf

Moyennant quoi, j’ai désormais un fichier de log distinct par équipement.

Hey, salut voisin !

Tags: ,
12 Comments »

Témoignage

Hier, alors que je parcourais la zone privée de mon DNS interne, je constate la présence d’une entrée ajoutée par dhcpd que je ne connais pas. Elle était de la forme :

a0b1e67834a1    A    192.168.0.102

Intrigué, je nmap l’IP en question pour m’apercevoir qu’il s’agit d’une machine windows, exposant fièrement ses ports 135 et 139. Cette fois c’était sur, il ne s’agissait pas d’une machine de mon réseau.

Evidemment, mon premier suspect était l’access point privé de mon réseau. Bien qu’il n’autorise que le WPA et que sa clé ne soit pas triviale, il me semblait clair que l’intru provenait des airs. Dans la hâte, j’éteins l’OpenWrt que j’avais migré en Kamikaze 8.09.2 quelques heures auparavant, et m’aperçois que je ping toujours mon “invité”.

Et puis m’apparait une autre porte d’entrée à mon réseau privé: le CPL.

J’avais acheté des boitiers CPL Netgear voila quelques mois; d’abord utilisés pour mon réseau Wifi public, j’utilisais de temps en temps ces derniers pour accueillir des portables invités ne bénéficiant pas de cartes Wifi. Ni une ni deux, je débranche le boitier CPL de mon switch. Le constat est sans appel, le ping cesse immédiatement, et avec lui, les miliers de paquets impurs à destinations d’adresses en *.ru en UDP, probablement une de ces saloperies de machine windows infectées jusqu’à l’os.

J’avais lu que la technologie CPL ne permettait pas à quelqu’un qui ne se trouvait pas sur le même disjoncteur de se brancher sur mon réseau, il s’agit manifestement d’une vaste supercherie, car logs à l’appui, je suis maintenant certain que l’intrus arrivait sur ma passerelle par ce biais. Le seul élément rassurant, c’est qu’il semble que la machine zombie en question s’invitait sur mon réseau involontairement. Mon voisin (quel qu’il soit) branchait probablement sa machine à un autre boitier CPL, effectuait une requète DHCP à laquelle mon serveur dhcpd répondait, ce dernier enregistrant ensuite l’IP affectée sur mon DNS.

Mes boitiers CPL servent désormais de décoration au fond d’une corbeille.

Au feu, tournez à gauche

Tags: , , , ,
2 Comments »

Pour des raisons évidentes, j’ai décidé de rendre un peu moins aisée (i.e. pas immédiate) la découverte de mon IP. Plus précisemment, pour certains protocoles et pour certaines machines, je veux que l’IP vue par mon/mes peers ne soit pas directement l’IP que mon fournisseur d’accès m’affecte.

J’ajoute, mais cela n’a evidemment aucun rapport avec cet article, que certains pays intellectuellement plus développés ont recemment confirmé que le partage de fichiers sur le réseau n’était pas illégal sur leur sol.

Le postulat est donc le suivant: seules certaines machines de mon réseau privé devront “sortir” sur une passerelle differente, et uniquement pour certains ports et protocoles.

Pour réaliser cette petite tambouille, j’ai à ma disposition :

  • Un serveur dédié ou virtuel hébergé “ailleurs”, possédant une interface sur une DMZ
  • Le serveur en question fonctionne sous GNU/Linux, on gère donc le NAT et le firewalling grâce à iptables
  • Une passerelle qui me relie à l’Internet par le biais de mon fournisseur d’accès
  • Cette passerelle fonctionne sous NetBSD 5.0.2, on gère le NAT et le firewalling grâce à pf (notez qu’ipf ne permettrait pas, à ma connaissance, d’utiliser les fonctions qui nous seront nécessaires)

La première étape consiste à établir un lien VPN entre la passerelle et le serveur dédié. J’ai utilisé OpenVPN, solution de choix de par sa simplicité, sa souplesse et sa grande stabilité. Étant donné qu’il existe un nombre incalculable de documentations sur cet outil, je colle ici mes configurations client et serveur sans plus de détails :

Sur le serveur :

tls-server

port 4444
dev tun
proto udp
local mon.serveur.dedie

cd /home/imil/etc/openvpn
ca keys/ca.crt
cert keys/dedie.crt
key keys/dedie.key
dh keys/dh1024.pem

client-config-dir ccd

server 10.20.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt

client-to-client
route 192.168.1.0 255.255.255.0

comp-lzo

keepalive 10 60
ping-timer-rem
persist-tun
persist-key

status openvpn-status.log

verb 3

Sur le client :

tls-client

proto udp
dev tun0

remote mon.serveur.dedie 4444

nobind

cd /usr/pkg/etc/openvpn/dedie-keys
ca ca.crt
cert monhost.crt
key monhost.key

comp-lzo

keepalive 10 60
ping-timer-rem
persist-tun
persist-key

pull

verb 3
log /var/log/openvpn.log

Une fois OpenVPN démarré sur chaque point, une interface tun0 monte, avec coté serveur une IP du type 10.20.0.1 et côté client, 10.20.0.6.
Notez que, coté serveur dédié, on verra arriver une machine depuis la passerelle avec son IP réelle sur le réseau domestique, soit ici 192.168.1.0/24. Ainsi, c’est ce sous-réseau que nous devons NATer sur le dédié GNU/Linux.

Une particularité de mon montage est que je ne souhaite pas utiliser l’IP publique principale de mon serveur public car celle-ci possède un reverse sur mon domaine et est facilement identifiable. Par chance, mon hébergeur me donne la possibilité d’ajouter des alias IP routés sur l’interface publique. En l’occurence, c’est précisemment sur cet alias que j’effectue un source NAT plutot que du MASQUERADING :

### règles INPUT
# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # j'autorise en entrée les connexions établies et connexes
# iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT # j'autorise l'echo-request
# iptables -A INPUT -p udp -m udp --dport 4444 -j ACCEPT # j'autorise la connexion vers OpenVPN
# iptables -A INPUT -i eth0 -j REJECT --reject-with icmp-port-unreachable # et je rejette tout le reste sur l'interface eth0
### règles de NAT
# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source mon.alias.ip.public

Désormais, si sur ma passerelle je plaçais une route par defaut sur 10.20.0.1 (le boût du tunnel sur le serveur dédié), les machines de mon réseau 192.168.1.0/24 apparaîtraient avec l’IP mon.alias.ip.public.
Cependant, seulement certaines machines, et surtout certains protocoles devront être soumis à cette politique, et c’est grâce à pf, et en particulier la directive route-to, que nous allons mettre en place ce routage conditionnel. Voici les lignes corresponsantes du fichier pf.conf de notre passerelle NetBSD :

int_if="xennet0"

[...]

pass in on $int_if route-to (tun0 10.20.0.1) proto tcp from 192.168.1.10 \
        to any port 80
pass in on $int_if route-to (tun0 10.20.0.1) proto udp from 192.168.1.10 \
        to any port > 10000

Décodage: Concernant le traffic qui arrive sur l’interface interne $int_if, toute demande en provenance de l’IP 192.168.1.10 à destination du protocole HTTP devra être routée vers l’interface tun0 en utilisant l’adresse de passerelle 10.20.0.1.
toute demande en provenance de l’IP 192.168.1.10 à destination de ports UDP supérieurs à 10000 devra être routée vers l’interface tun0 en utilisant l’adresse de passerelle 10.20.0.1.

J’utilise ce routage depuis hier soir, l’overhead du lien VPN est minimal et l’ensemble se comporte correctement. Je ne prétend pas, avec ce système, bénéficier d’un anonymat hors du commun, mais il me permet au moins de ne pas exposer mon IP publique.

pinpin transforme le sang en vin

Tags: ,
8 Comments »

SL10, c’est fini, et on va encore se faire plein d’amis !

Merci à llaumgui pour la photo ci-dessus et au mysterieux Monsieur J pour cette idée simplement géniale :)

WP Theme & Icons based on GlossyBlue by N.Design Studio
Banner from www.trynthlas.com
Entries RSS Comments RSS Log in