Archives pour la catégorie ‘FreeBSD’

FreeBSD : portmaster et conflit de nom de package

===>  Installing for pkgconf-0.8.9

===>  pkgconf-0.8.9 conflicts with installed package(s):
      pkg-config-0.25_1

      They install files into the same place.
      Please remove them first with pkg_delete(1).
*** Error code 1
root@box15:~ # portmaster -o devel/pkgconf devel/pkg-config

FreeBSD : gestion des alias IPv4/IPv6

# ifconfig igb0 80.0.0.1 alias
# ifconfig igb0 80.0.0.1 -alias
# ifconfig igb0 inet6 2001:1:2:3::1 alias
# ifconfig igb0 inet6 2001:1:2:3::1 -alias

FreeBSD : connexion fibre mode PPPoE + VLAN

# cat /etc/rc.conf
gateway_enable="YES"
network_interfaces="lo0 igb0"
cloned_interfaces="vlan35"
ifconfig_igb0="up polling"
ifconfig_vlan35="vlan 35 vlandev igb0"

ppp_enable="YES"
ppp_mode="ddial"
ppp_nat="NO"
ppp_profile="myisp"
# cat /etc/ppp/ppp.conf
myisp:
	set device PPPoE:vlan35
	set authname toto@tata
	set authkey blablablaaa
	set dial
	set login
	set log phase tun command
	add default HISADDR

FreeBSD : gestion des interfaces CARP

Lister les interfaces CARP du groupe principal carp :

# ifconfig -g carp

Assigner une interface CARP au groupe carp :

# ifconfig carp4 group carp

Supprimer une interface CARP du groupe carp :

# ifconfig carp4 -group carp

Firewall Builder : configuration pour un cluster de firewalls PF

Voici un exemple de fichier de règles firewall, généré avec Firewall Builder, dans le cas d’un cluster de deux firewalls PF sous FreeBSD.

Les règles PF employées couvrent quasiment toutes les fonctionnalités possibles :

  • le filtrage d’accès en IPv4 et IPv6
  • la redondance réseau avec CARP + PFSYNC
  • le filtrage des interfaces virtuelles (VLAN, TUN)
  • le filtrage par balisage des paquets (tagging)
  • la limitation des connexions avec blacklistage automatique
  • le load-balancing des connexions sortantes
  • la gestion de la QoS
  • la gestion FTP pour l’accès interne et externe

A noter que je n’ai pas utilisé la gestion cluster de Firewall Builder ; les règles sont donc dupliquées pour chaque noeud.

Fichier de configuration (format v 5.1) : Faille de sécurité ClamAV CVE-2008-5314 (un téléchargement)

FreeBSD : clean install ZFS avec support des BE

Les environnements d’initialisation – Boot Environment (BE) – est une fonctionnalité backportée de Solaris et liée au portage de ZFS sur FreeBSD. Son intérêt est de créer différentes versions du filesystem racine afin de garantir un démarrage sûr du système suite à une opération de maintenance comme l’installation, la mise à jour ou tout simplement une reconfiguration. Elle s’appuie intégralement sur des snapshots ZFS.

Techniquement, le pool racine ZFS doit respecter une organisation du type : <nom du pool>/ROOT/<nom du BE>. Ainsi pour un pool nommé rpool et le BE default, le fileystem racine est rpool/ROOT/default. La gestion des BE est ensuite effectuée grâce à la commande beadm qui permet de les créer et de sélectionner le BE à utiliser au prochain démarrage.

Cet article vise à présenter l’installation et l’utilisation d’un système supportant les BE.

Installation du système

Toute la procédure s’effectue depuis le CD de FreeBSD en mode live.

# gpart create -s gpt ada0
# gpart add -b 34 -s 94 -t freebsd-boot ada0
# gpart add -s 4G -t freebsd-swap -l swap0 ada0
# gpart add -t freebsd-zfs -l disk0 ada0
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
# gpart create -s gpt ada1
# gpart add -b 34 -s 94 -t freebsd-boot ada1
# gpart add -s 4G -t freebsd-swap -l swap1 ada1
# gpart add -t freebsd-zfs -l disk1 ada1
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
# kldload geom_mirror.ko
# gmirror label -F -h -b round-robin swap /dev/gpt/swap0 /dev/gpt/swap1
# kldload opensolaris.ko
# kldload zfs.ko
# gnop create -S 4096 /dev/gpt/disk0
# gnop create -S 4096 /dev/gpt/disk1
# zpool create -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache rpool mirror /dev/gpt/disk0.nop /dev/gpt/disk1.nop
# zpool export rpool
# gnop destroy /dev/gpt/disk0.nop
# gnop destroy /dev/gpt/disk1.nop
# zpool import -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache rpool
# zfs set checksum=fletcher4 rpool
# zfs set atime=off rpool
# zfs create rpool/ROOT
# zfs create -o mountpoint=/ rpool/ROOT/default
# zfs set freebsd:boot-environment=1 rpool/ROOT/default
# zpool set bootfs=rpool/ROOT/default rpool
# zfs create -o mountpoint=/usr/local rpool/local
# zfs create -o mountpoint=/var rpool/var
# zfs create -o compression=lzjb -o exec=off -o setuid=off rpool/var/crash
# zfs create -o exec=off -o setuid=off rpool/var/db
# zfs create -o compression=lzjb -o exec=on -o setuid=off rpool/var/db/pkg
# zfs create -o exec=off -o setuid=off rpool/var/empty
# zfs create -o compression=lzjb -o exec=off -o setuid=off rpool/var/log
# zfs create -o compression=gzip -o exec=off -o setuid=off rpool/var/mail
# zfs create -o exec=off -o setuid=off rpool/var/run
# zfs create -o compression=lzjb -o exec=on -o setuid=off rpool/var/tmp
# zfs create -o mountpoint=/tmp -o compression=on -o exec=on -o setuid=off rpool/tmp
# zfs create -o mountpoint=/home rpool/home
# chmod 1777 /mnt/tmp
# chmod 1777 /mnt/var/tmp
# sh
# cd /usr/freebsd-dist
# export DESTDIR=/mnt
# for file in base.txz lib32.txz kernel.txz doc.txz;
> do (cat $file | tar --unlink -xpJf - -C ${DESTDIR:-/}); done
# zfs set readonly=on zroot/var/empty
# cp /var/tmp/zpool.cache /mnt/ROOT/default/boot/zfs/zpool.cache
# ee /mnt/etc/fstab
/dev/mirror/swap none swap sw 0 0
# ee /mnt/boot/loader.conf
geom_mirror_load="YES"
zfs_load="YES"
vfs.root.mountfrom="zfs:rpool/ROOT/default"
# ee /mnt/etc/rc.conf
hostname="freebsd9"
keymap="fr.iso.acc"
zfs_enable="YES"

network_interfaces="lo0 em0"
defaultrouter="192.168.0.1"
ipv6_defaultrouter="fdcb:9921:3552:afd7::1"
ifconfig_em0="inet 192.168.0.2 netmask 255.255.255.0 polling"
ifconfig_em0_ipv6="inet fdcb:9921:3552:afd7::2 prefixlen 64"

clear_tmp_enable="YES"
tcp_drop_synfin="YES"

moused_enable="NO"
sendmail_enable="NONE"
sshd_enable="YES"
syslogd_flags="-ss"
# ee /mnt/etc/resolv.conf
nameserver 192.168.0.254
search my.domain
# echo 'daily_status_gmirror_enable="YES"' >> /mnt/etc/periodic.conf
# echo 'daily_status_zfs_enable="YES"'' >> /mnt/etc/periodic.conf
# echo 'daily_status_smart_devices="/dev/ada0 /dev/ada1"' >> /mnt/etc/periodic.conf
# echo 'daily_status_mail_rejects_enable="NO"' >> /mnt/etc/periodic.conf
# echo 'daily_status_include_submit_mailq="NO"' >> /mnt/etc/periodic.conf
# echo 'daily_submit_queuerun="NO"' >> /mnt/etc/periodic.conf
# echo 'WRKDIRPREFIX=/usr/obj' >> /mnt/etc/make.conf
# chroot /mnt
# passwd
# tzsetup
# cd /etc/mail
# nano aliases
# make aliases
# exit
# zfs umount -a
# zfs set mountpoint=/rpool rpool
# zfs set mountpoint=/rpool/ROOT rpool/ROOT
# zfs set mountpoint=legacy rpool/ROOT/default
# shutdown -r now

Démarrage du système

# zfs list
NAME                 USED  AVAIL  REFER  MOUNTPOINT
rpool                687M  14.7G   152K  /rpool
rpool/ROOT           683M  14.7G   144K  /rpool/ROOT
rpool/ROOT/default   683M  14.7G   683M  legacy
rpool/home           144K  14.7G   144K  /home
rpool/local          144K  14.7G   144K  /usr/local
rpool/tmp            176K  14.7G   176K  /tmp
rpool/var           1.89M  14.7G   564K  /var
rpool/var/crash      148K  14.7G   148K  /var/crash
rpool/var/db         388K  14.7G   244K  /var/db
rpool/var/db/pkg     144K  14.7G   144K  /var/db/pkg
rpool/var/empty      144K  14.7G   144K  /var/empty
rpool/var/log        188K  14.7G   188K  /var/log
rpool/var/mail       144K  14.7G   144K  /var/mail
rpool/var/run        204K  14.7G   204K  /var/run
rpool/var/tmp        152K  14.7G   152K  /var/tmp
# zfs snapshot rpool/ROOT/default@clean

Création d’un nouvel environnement

On commence par installer la commande beadm :

# cd /usr/ports/sysutils/beadm
# make install

On peut dès lors vérifier que le BE default est bien détecté :

# beadm list
BE      Active Mountpoint  Space Created
default NR     /            1.8G 2012-10-08 04:33

La création d’un BE nécessite uniquement de spécifier son nom :

# beadm create upgrade
Created successfully
# beadm list
BE      Active Mountpoint  Space Created
default NR     /            1.8G 2012-04-19 15:05
upgrade -      -          136.0K 2012-10-08 06:25

Il est également possible de cloner un BE existant en spécifiant son nom.

Au niveau du pool ZFS, le BE se matérialise par un nouveau clone :

# zfs list
NAME                 USED  AVAIL  REFER  MOUNTPOINT
rpool               1.83G  13.6G   152K  /rpool
rpool/ROOT          1.68G  13.6G   144K  /rpool/ROOT
rpool/ROOT/default  1.68G  13.6G  1.68G  legacy
rpool/ROOT/upgrade   144K  13.6G  1.68G  legacy
rpool/home           144K  13.6G   144K  /home
rpool/local         4.14M  13.6G  4.14M  /usr/local
rpool/tmp            184K  13.6G   184K  /tmp
rpool/var            146M  13.6G   564K  /var
rpool/var/crash      148K  13.6G   148K  /var/crash
rpool/var/db         145M  13.6G   144M  /var/db
rpool/var/db/pkg     196K  13.6G   196K  /var/db/pkg
rpool/var/empty      144K  13.6G   144K  /var/empty
rpool/var/log        192K  13.6G   192K  /var/log
rpool/var/mail       144K  13.6G   144K  /var/mail
rpool/var/run        204K  13.6G   204K  /var/run
rpool/var/tmp        152K  13.6G   152K  /var/tmp

Reste enfin à activer ce BE et redémarrer le système :

# beadm activate upgrade
Activated successfully
# shutdown -r now

A présent, l’ensemble des opérations affecte le BE upgrade. En cas d’erreur, une réactivation du BE default permettra un redémarrage du système.

FreeBSD : booter sur un noyau alternatif

Lancez l’invite de commandes du bootmenu de FreeBSD :

OK unload
OK load /boot/kernel.old/kernel
OK boot

FreeBSD : clean install avec pool ZFS racine

Un petit mémo sur une installation clean de FreeBSD 9 avec :

  • partitionnement GPT (boot loader ZFS, swap & pool ZFS)
  • pool ZFS racine en miroir, avec alignement pour secteurs disque de 4k
  • miroir GEOM pour le swap
  • configuration LAN dualstack IPv4 et IPv6

Toute la procédure s’effectue depuis le CD de FreeBSD en mode live.

Partitionnement des disques

# gpart create -s gpt ada0
# gpart add -b 34 -s 94 -t freebsd-boot ada0
# gpart add -s 4G -t freebsd-swap -l swap0 ada0
# gpart add -t freebsd-zfs -l disk0 ada0
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
# gpart create -s gpt ada1
# gpart add -b 34 -s 94 -t freebsd-boot ada1
# gpart add -s 4G -t freebsd-swap -l swap1 ada1
# gpart add -t freebsd-zfs -l disk1 ada1
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1

Création du miroir GEOM pour la swap

# kldload geom_mirror.ko
# gmirror label -F -h -b round-robin swap /dev/gpt/swap0 /dev/gpt/swap1

Création du pool ZFS racine

# kldload opensolaris.ko
# kldload zfs.ko
# gnop create -S 4096 /dev/gpt/disk0
# gnop create -S 4096 /dev/gpt/disk1
# zpool create -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache zroot mirror /dev/gpt/disk0.nop /dev/gpt/disk1.nop
# zpool export zroot
# gnop destroy /dev/gpt/disk0.nop
# gnop destroy /dev/gpt/disk1.nop
# zpool import -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache zroot
# zpool set bootfs=zroot zroot
# zfs set checksum=fletcher4 zroot
# zfs set atime=off zroot
# zfs create zroot/usr
# zfs create zroot/usr/home
# zfs create zroot/var
# zfs create -o compression=on -o exec=on -o setuid=off zroot/tmp
# zfs create -o compression=lzjb -o setuid=off zroot/usr/ports
# zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/distfiles
# zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/packages
# zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/usr/src
# zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/crash
# zfs create -o exec=off -o setuid=off zroot/var/db
# zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/db/pkg
# zfs create -o exec=off -o setuid=off zroot/var/empty
# zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/log
# zfs create -o compression=gzip -o exec=off -o setuid=off zroot/var/mail
# zfs create -o exec=off -o setuid=off zroot/var/run
# zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/tmp
# chmod 1777 /mnt/tmp
# chmod 1777 /mnt/var/tmp
# cd /mnt; ln -s usr/home home

Installation du système

# sh
# cd /usr/freebsd-dist
# export DESTDIR=/mnt
# for file in base.txz lib32.txz kernel.txz doc.txz;
> do (cat $file | tar --unlink -xpJf - -C ${DESTDIR:-/}); done

Configuration

# zfs set readonly=on zroot/var/empty
# cp /var/tmp/zpool.cache /mnt/boot/zfs/zpool.cache
# ee /mnt/etc/fstab
/dev/mirror/swap none swap sw 0 0
# ee /mnt/boot/loader.conf
geom_mirror_load="YES"
zfs_load="YES"
vfs.root.mountfrom="zfs:zroot"
# ee /mnt/etc/rc.conf
hostname="freebsd9"
keymap="fr.iso.acc"
zfs_enable="YES"

network_interfaces="lo0 em0"
defaultrouter="192.168.0.1"
ipv6_defaultrouter="fdcb:9921:3552:afd7::1"
ifconfig_em0="inet 192.168.0.2 netmask 255.255.255.0 polling"
ifconfig_em0_ipv6="inet fdcb:9921:3552:afd7::2 prefixlen 64"

clear_tmp_enable="YES"
tcp_drop_synfin="YES"

moused_enable="NO"
sendmail_enable="NONE"
sshd_enable="YES"
syslogd_flags="-ss"
# ee /mnt/etc/resolv.conf
nameserver 192.168.0.254
search my.domain
# echo 'daily_status_gmirror_enable="YES"' >> /mnt/etc/periodic.conf
# echo 'daily_status_zfs_enable="YES"'' >> /mnt/etc/periodic.conf
# echo 'daily_status_smart_devices="/dev/ada0 /dev/ada1"' >> /mnt/etc/periodic.conf
# echo 'daily_status_mail_rejects_enable="NO"' >> /mnt/etc/periodic.conf
# echo 'daily_status_include_submit_mailq="NO"' >> /mnt/etc/periodic.conf
# echo 'daily_submit_queuerun="NO"' >> /mnt/etc/periodic.conf]
# echo 'WRKDIRPREFIX=/usr/obj' >> /mnt/etc/make.conf
# chroot /mnt
# passwd
# tzsetup
# gpart status
# zpool status
# gmirror status
# exit
# shutdown -r now

L’installation étant terminée, on peut de suite effectuer un snapshot ZFS du pool :

# zfs snapshot -r zroot@default

Annexe : création d’un volume ZFS pour la swap

Au lieu d’une partition dédiée, la swap peut être stockée par un volume dans le pool ZFS. Le système d’exploitation ne pourra toutefois pas y stocker les coredumps.

# zfs create -V 4G zroot/swap
# zfs set org.freebsd:swap=on zroot/swap
# zfs set checksum=off zroot/swap

FreeBSD : patch pour la gestion des alias IPv6 sur interface CARP

Le driver CARP de FreeBSD 8.x contient un bug au niveau de la gestion IPv6. Au lieu d’ajouter chaque adresse IPv6 de l’interface CARP au groupe multicast ff02::1, le driver n’ajoute que la première adresse. Ainsi la prise en compte des alias n’est pas effective et la découverte du voisinage IPv6 n’aboutit pas :

ipv6_ifconfig_carp0="2001:1610:4::102 prefixlen 64"
ipv6_ifconfig_carp0_alias0="2001:1610:4::113 prefixlen 64"
0.000000 fe80::223:4ff:fe17:f840 -> ff02::1:ff00:113 ICMPv6 86 Neighbor Solicitation
0.999052 fe80::223:4ff:fe17:f840 -> ff02::1:ff00:113 ICMPv6 86 Neighbor Solicitation
1.999103 fe80::223:4ff:fe17:f840 -> ff02::1:ff00:113 ICMPv6 86 Neighbor Solicitation
3.000220 fe80::223:4ff:fe17:f840 -> ff02::1:ff00:113 ICMPv6 86 Neighbor Solicitation

Pour corriger ce bug, Paul Herman propose un patch à appliquer aux sources de FreeBSD :

# cd /usr/src
# zcat /path/to/carp_ip6_alias.patch.gz | patch
--- sys/netinet6/in6.c.orig    2011-08-19 07:08:30.000000000 +0000
+++ sys/netinet6/in6.c    2011-08-19 07:09:53.000000000 +0000
@@ -1743,7 +1743,7 @@

ia->ia_addr = *sin6;

-    if (ifacount <= 1 && ifp->if_ioctl) {
+    if ((ifacount <= 1 || ifp->if_type == IFT_CARP) && ifp->if_ioctl) {
error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, (caddr_t)ia);
if (error) {
splx(s);
--- sys/netinet/ip_carp.c.orig    2011-08-19 07:52:56.000000000 +0000
+++ sys/netinet/ip_carp.c    2011-08-19 07:15:03.000000000 +0000
@@ -1670,9 +1670,11 @@
struct carp_if *cif;
struct in6_ifaddr *ia, *ia_if;
struct ip6_moptions *im6o = &sc->sc_im6o;
+    struct in6_multi *in6m;
struct in6_addr in6;
int own, error;

+
error = 0;

if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
@@ -1729,8 +1731,6 @@
}

if (!sc->sc_naddrs6) {
-        struct in6_multi *in6m;
-
im6o->im6o_multicast_ifp = ifp;

/* join CARP multicast address */
@@ -1745,24 +1745,24 @@
goto cleanup;
im6o->im6o_membership[0] = in6m;
im6o->im6o_num_memberships++;
-
-        /* join solicited multicast address */
-        bzero(&in6, sizeof(in6));
-        in6.s6_addr16[0] = htons(0xff02);
-        in6.s6_addr32[1] = 0;
-        in6.s6_addr32[2] = htonl(1);
-        in6.s6_addr32[3] = sin6->sin6_addr.s6_addr32[3];
-        in6.s6_addr8[12] = 0xff;
-        if (in6_setscope(&in6, ifp, NULL) != 0)
-            goto cleanup;
-        in6m = NULL;
-        error = in6_mc_join(ifp, &in6, NULL, &in6m, 0);
-        if (error)
-            goto cleanup;
-        im6o->im6o_membership[1] = in6m;
-        im6o->im6o_num_memberships++;
}

+    /* join solicited multicast address */
+    bzero(&in6, sizeof(in6));
+    in6.s6_addr16[0] = htons(0xff02);
+    in6.s6_addr32[1] = 0;
+    in6.s6_addr32[2] = htonl(1);
+    in6.s6_addr32[3] = sin6->sin6_addr.s6_addr32[3];
+    in6.s6_addr8[12] = 0xff;
+    if (in6_setscope(&in6, ifp, NULL) != 0)
+        goto cleanup;
+    in6m = NULL;
+    error = in6_mc_join(ifp, &in6, NULL, &in6m, 0);
+    if (error)
+        goto cleanup;
+    im6o->im6o_membership[1] = in6m;
+    im6o->im6o_num_memberships++;
+
if (!ifp->if_carp) {
cif = malloc(sizeof(*cif), M_CARP,
M_WAITOK|M_ZERO);

Une fois le noyau de l’hôte patché, le test par ping externe est concluant.

Patch : [Téléchargement introuvable]

FreeBSD : fichier de règles PF

#
# pf.conf
#

# macros
ext_if = "re0"
int_if = "lo1"

# tables
table  persist {}

# options
set block-policy drop
set skip on lo0
set limit { states 20000, frags 5000, src-nodes 2000 }

# normalization
scrub in all fragment reassemble
scrub all reassemble tcp
scrub in all random-id

#
# redirection
#

nat on $ext_if from !($ext_if) to any -> ($ext_if)

# jail dns
rdr pass on $ext_if proto tcp from any to port 53 -> 172.16.0.1 port 53
rdr pass on $ext_if proto udp from any to port 53 -> 172.16.0.1 port 53
# jail www
rdr pass on $ext_if proto tcp from any to port 80 -> 172.16.0.2 port 80
rdr pass on $ext_if proto tcp from any to port 443 -> 172.16.0.2 port 443
rdr pass on $ext_if proto tcp from any to port 2222 -> 172.16.0.2 port 22

#
# rules
#

block in log
block out log
block quick from
antispoof quick for lo0

pass quick on $int_if

pass out proto tcp all keep state
pass out proto udp all keep state

pass in on $ext_if inet proto icmp from any to any keep state
pass out on $ext_if inet proto icmp from any to any keep state

pass in on $ext_if inet6 proto icmp6 from any to any keep state
pass out on $ext_if inet6 proto icmp6 from any to any keep state

pass in on $ext_if proto tcp from any to any port 22 flags S/SA keep state \
(source-track rule, max-src-conn 4, max-src-conn-rate 4/30, \
overload  flush global)
Haut de page