miércoles, marzo 18, 2009

FreeBSD 7.1 + RAID0 - Striping

Bueno, hoy tengo que montar un monstruo en almacenamiento, sera un RAID0 por software, los datos no son criticos y el limitante es el factor dinero...

Informacion de los discos

6 HITACHI de 1TB SATA II

La organizacion

/dev/ad0 de 1TB FreeBSD 7.1 amd64

/ 1G
swap 4G
/var 4G
/tmp 1G
/usr 20G
/home 873G

5 SATAs 1TB cada uno para el raid0 por sofware
/dev/ad1
/dev/ad2
/dev/ad3
/dev/ad10
/dev/ad8

1) Instalar FreeBSD 7.1
(ya sabemos como, asi que no lo explicare, solo decir que se instala lo basico [X] 6 Kernel deve...)

2) Configurar los discos
Segun el manual http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/geom-striping.html

Solo modifico unas cosas en mi caso

Creating a stripe of unformatted ATA disks

  1. Load the geom_stripe.ko module:

    # kldload geom_stripe
  2. Ensure that a suitable mount point exists. If this volume will become a root partition, then temporarily use another mount point such as /mnt:

    # mkdir /mnt
  3. Determine the device names for the disks which will be striped, and create the new stripe device. For example, to stripe two unused and unpartitioned ATA disks, for example /dev/ad2 and /dev/ad3:

    # gstripe label -v st0 /dev/ad1 /dev/ad2 /dev/ad3 /dev/ad10 /dev/ad8
    Metadata value stored on /dev/ad1.
    Metadata value stored on /dev/ad2.
    Metadata value stored on /dev/ad3.
    Metadata value stored on /dev/ad10.
    Metadata value stored on /dev/ad8.
    Done.
  4. Write a standard label, also known as a partition table, on the new volume and install the default bootstrap code:

    (Esta parte la omito, ya que bsdlabel no trabaja con mas de 4TB)
    # bsdlabel -wB /dev/stripe/st0
  5. This process should have created two other devices in the /dev/stripe directory in addition to the st0 device. Those include st0a and st0c. At this point a file system may be created on the st0a device with the newfs utility:

    (Como omiti bsdlabel, el siguiente comando es sin la a al final)
    # newfs -U /dev/stripe/st0

    Many numbers will glide across the screen, and after a few seconds, the process will be complete. The volume has been created and is ready to be mounted.

To manually mount the created disk stripe:

# mount /dev/stripe/st0 /mnt

To mount this striped file system automatically during the boot process, place the volume information in /etc/fstab file. For this purpose, a permanent mount point, named stripe, is created:

# mkdir /home/stripe
# echo "/dev/stripe/st0 /stripe ufs rw 2 2" \
>> /etc/fstab

The geom_stripe.ko module must also be automatically loaded during system initialization, by adding a line to /boot/loader.conf:

# echo 'geom_stripe_load="YES"' >> /boot/loader.conf

Update:
Si queremos hacer RAID0 con ZFS...
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/filesystems-zfs.html
http://wiki.freebsd.org/ZFSQuickStartGuide

(desmontar el stripe)
# umount /stripe

(deshacer el stripe)
# gstripe unload /dev/stripe/st0
# gstripe clear -v /dev/ad1
# gstripe clear -v /dev/ad2
# gstripe clear -v /dev/ad3
# gstripe clear -v /dev/ad6
# gstripe clear -v /dev/ad8

(quitar la linea del fstab)
#/dev/stripe/st0 /stripe ufs rw 2 2

20.2.2.1 Single Disk Pool
# zpool create tank ad1 ad2 ad3 ad6 ad8

# df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/ad0s1a 989M 419M 491M 46% /
devfs 1.0K 1.0K 0B 100% /dev
/dev/ad0s1g 873G 40K 803G 0% /home
/dev/ad0s1e 989M 12K 910M 0% /tmp
/dev/ad0s1f 19G 2.3G 16G 13% /usr
/dev/ad0s1d 3.9G 34M 3.5G 1% /var
tank 4.5T 128K 4.5T 0% /tank

# zfs create tank/data

# df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/ad0s1a 989M 419M 491M 46% /
devfs 1.0K 1.0K 0B 100% /dev
/dev/ad0s1g 873G 40K 803G 0% /home
/dev/ad0s1e 989M 12K 910M 0% /tmp
/dev/ad0s1f 19G 2.3G 16G 13% /usr
/dev/ad0s1d 3.9G 34M 3.5G 1% /var
tank 4.5T 128K 4.5T 0% /tank
tank/data 4.5T 128K 4.5T 0% /tank/data

(para eliminar el ZFS)
# zfs destroy /tank/data

(para eliminar el pool)
# zpool destroy /tank

Nota con ZFS tambien se puede hacer un RAID5 (lo denomina "raidz")
Para RAID5
# zpool create storage raidz ad1 ad2 ad3 ad6 ad8

En este caso la unidad sera mas pequeña

bueno, parece que todo quedo listo...

jueves, marzo 05, 2009

FreeBSD 7.1 + Firewall + Internet para nuestra LAN

Introduccion:
Instalaremos un servidor para dar salida a Internet a los usuarios de la LAN, implementaremos un firewall para controlar lo que sale o entra a nuestra LAN y los pondremos a salir por Squid-cache como proxy para controlar la navegacion.

Ultima actualizacion:
(DD-MM-AAA) 27-10-2009

Contenido:
Instalaremos FreeBSD 7.2
Activaremos un Firewall
Daremos salida a Internet
Configuraremos Squid-cache como proxy para optimizar y controlar la navegacion

Requerimientos:
1 Real server o en su caso, un buen PC
2 Tarjetas de red para para el equipo que compartira la salida a Internet

Diagrama de la configuracion:

Internet---Router---bge0-[FreeBSD]-bge1---Suiche---LAN

Proceso:
1) Instalar FreeBSD 7.1 (en mi caso como el procesador es un Intel Xeon con soporte para 64bits, instalare la version de FreeBSD 7.2 amd64 que se puede bajar de la web www.freebsd.org)

Se inicia con el cd-rom, se siguen unas instrucciones en pantalla, se usa todo el disco, se particiona por defecto y se instala solo lo basico
[X] 6 Kern-Developer Full binaries and doc, kernel sources only

En el proceso de instalacion se debe poner atencion en los nombres de las tarjetas que se muestran en la instalacion, por ejemplo: bge0 y bge1 , ya que luego se debera activar la segunda (la primera nos permite configurarla en el momento de la instalacion)

2) Actualizar nuestro FreeBSD
En el pasado lo hacia de otra forma, pero en este lugar encontre una forma mas facil
http://www.sarckz.com.ar/2009/01/06/freebsd-71-guia-de-instalacion/
Y la pondre aqui igualmente (seria una lastima perderla)

Copiamos al directorio de root 2 archivos importantes
# cp /usr/share/examples/cvsup/stable-supfile .
# cp /usr/share/examples/cvsup/ports-supfile .

Luego los editamos para especificar de donde puede bajar las cosas

# edit /root/
stable-supfile

Modificamos una linea para que quede asi:

*default host=cvsup.de.freebsd.org

Guardamos los cambios y salimos del editor

# edit /root/ports-supfile

Modificamos una linea para que quede asi (manteniendonos en 7.2):

*default host=cvsup10.us.FreeBSD.org
*default release=cvs tag=RELENG_7_2

Guardamos los cambios y salimos del editor

Actualizamos (kernel+base)

# csup -g -L 2 /root/stable-supfile

Descargamos/Actualizamos el arbol de ports con el supfile antes creado:
(el arbol de ports es el sistema para instalar aplicaciones)

# csup -g -L 2 /root/ports-supfile

Compilar un KERNEL personalizado para que tenga soporte para algunas cositas

Segun nuestro querido HANDBOOK
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-building.html

Seguimos los pasos

(como estamos usando FreeBSD 7.1 amd64)
# cd /usr/src/sys/amd64/conf

(o en caso de que usaramos FreeBSD 7.1 i386)
# cd /usr/src/sys/i386/conf

# mkdir /root/kernels
# cp GENERIC /root/kernels/MYKERNEL
# ln -s /root/kernels/MYKERNEL

Es bueno darle una leida a UPDATING, pues tiene informacion importante
# edit /usr/src/UPDATING

Salimos del editor y continuamos

Editamos el archivo MYKERNEL en el cual especificamos que nuevas opciones queremos

# edit /root/kernels/MYKERNEL

Al final le ponemos estas lineas:

# Nuevas opciones

# 30.4 The OpenBSD Packet Filter (PF) and ALTQ
# 30.4.6 Enabling ALTQ
options ALTQ
options ALTQ_CBQ # Class Bases Queuing (CBQ)
options ALTQ_RED # Random Early Detection (RED)
options ALTQ_RIO # RED In/Out
options ALTQ_HFSC # Hierarchical Packet Scheduler (HFSC)
options ALTQ_PRIQ # Priority Queuing (PRIQ)
options ALTQ_NOPCC # Required for SMP build

Guardamos y salimos del editor

(segun el handbook, seguir estos pasos)

Building a Kernel

  1. Change to the /usr/src directory:

    # cd /usr/src
  2. Compile the kernel:

    # make buildkernel KERNCONF=MYKERNEL
  3. Install the new kernel:

    # make installkernel KERNCONF=MYKERNEL

Re-iniciar el equipo
# shutdown -r now

Al entrar nuevamente deberemos tener funcionando el nuevo kernel, para verificar

# uname -a
FreeBSD alpha.company.com 7.2-RELEASE-p2 FreeBSD 7.2-RELEASE-p2 #2: Sat Jul 4 12:17:17 COT 2009 angel@alpha.company.com:/usr/obj/usr/src/sys/MYKERNEL amd64

3) Activar la segunda tarjeta de red (ya que en la instalacion, solo activamos la primera)

(como en la instalacion anotamos el nombre de las tarjetas detectadas, ya sabemos el nombre de la segunda segun FreeBSD, que en mi caso es bge1)

# edit /etc/rc.conf

defaultrouter="192.168.0.1"
hostname="alpha.company.com"
ifconfig_bge0="inet 192.168.0.1 netmask 255.255.255.0"
sshd_enable="YES"

# Segunda tarjeta
ifconfig_bge1="inet 192.168.1.1 netmask 255.255.255.0"

Guardar y salir

Re-iniciar el equipo
# shutdown -r now

Al entrar nuevamente, debemos tener 2 tarjetas levantadas, para verificar
(se mostrara algo como esto)
alpha# ifconfig
bge0: flags=8843 metric 0 mtu 1500
options=9b
ether 00:13:21:e9:dc:0e
inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
media: Ethernet autoselect (100baseTX )
status: active
bge1: flags=8843 metric 0 mtu 1500
options=9b
ether 00:13:21:c8:fd:c2
inet 192.168.1.1 netmask 0xffffff00 broadcast 192.168.1.255
media: Ethernet autoselect (1000baseTX )
status: active

4) Compartir el Internet con la LAN
(Se supone que ya tenemos internet en nuestro FreeBSD 7.1 de modo que lo podemos compartir)

Editamos este archivo y le agregamos estas lineas al final

# edit /etc/rc.conf

# Activamos OpenBSD Packet Filter (PF)
pf_enable="YES" # Enable PF (load module if required)
pf_rules="/etc/pf.conf" # rules definition file for pf
pf_flags="" # additional flags for pfctl startup
pflog_enable="YES" # start pflogd(8)
pflog_logfile="/var/log/pflog" # where pflogd should store the logfile
pflog_flags="" # additional flags for pflogd startup
gateway_enable="YES" # Enable as LAN gateway (PF)

5) Generar nuestro archivo de politicas del firewall (que es el que compartira el Internet)

Aqui toca leer un poco el manual oficial de PF, que se puede ver aqui
http://www.openbsd.org/faq/pf/

Un ejemplo basico para una red pequena
http://www.openbsd.org/faq/pf/example1.html

Aqui el que yo tengo que puedes adaptar segun tus necesidades (muy completo y bien explidado)
http://alpha.telemedellin.tv/public/pf.conf

El archivo con las reglas es /etc/pf.conf

Ya con nuestro archivo creado re-iniciamos el servidor y los equipos de la LAN deben navegar si tienen los datos correctos de IP, MASK, GATEWAY y DNS

Nota:
Si usas como ejemplo mi archivo pf.conf debes tener cuidado con estas lineas:

# mejor solo les permito ftp a algunos usuarios, por lo de los .exe y otros
rdr pass on $eth_if1 proto tcp from $usuarios_ftp to !$eth_if1 port ftp \
-> 127.0.0.1 port 8021
# rdr allow outgoing WWW requests to the squid, but not from LAN to my server
rdr pass on $eth_if1 proto tcp from any to !$eth_if1 port www \
-> 127.0.0.1 port 3128

Esto ya que la primera hace una redireccion para las conexiones FTP a un proxy llamado pftpx y la segunda hace igualmente una redireccion para las conexiones WWW a un proxy llamado Squid-chache

Tanto pftpx como Squid-cache, se pueden instalar mediante los ports asi:
Istalando PFTPX
# cd /usr/ports/ftp/pftpx
# make install clean

Activandolo al iniciar el sistema, poner esta linea en /etc/rc.conf
# Activamos pel pftpx proxy
pftpx_enable="YES"

Iniciar pftpx
# /usr/local/etc/rc.d/pftpx start

Instalando Squid-chache
# cd /usr/ports/www/squid30
# make install clean

Activandolo al iniciar el sistema, poner esta linea en /etc/rc.conf
# Activamos el Squid para cachear y controlar la navegacion WWW
squid_enable="YES"

Iniciar el directorio donde se cacheara el contenido de Squid
# /usr/local/sbin/squid -z

Iniciar Squid
# /usr/local/etc/rc.d/squid start

Squid es todo un mundo, hay infinidad de cosas que se pueden hacer o bloquear, aqui
el que actualmente uso y con el cual torturo a los usuarios de mi LAN ;-)

http://alpha.telemedellin.tv/public/squid.conf

Aqui un manual mas explicativo de como poner a funcionar Squid con mas detalle
http://www.freebsddiary.org/squid.php

NOTA 2:
En mi archivo squid.conf se navega libremente con Firefox, Opera, y todos los otros
buenos navegadores. Con el Internet Explorer solo les dejo navegar en algunos sitios
mal construidos y que solo funcionan con ese navegador.

Igualmente mi squid.conf hace referencias a algunos archivos como:
/usr/local/etc/squid/deny_sites.conf
# ejemplo de contenido:
playboy.com

usr/local/etc/squid/sites_hours.conf
# ejemplo de contenido:
facebook.com

/usr/local/etc/squid/msn_overhttp.conf
# ejemplo de contenido:
msnmessenger.com

/usr/local/etc/squid/msn_domains.conf
# ejemplo de contenido:
gateway.messenger.hotmail.com

/usr/local/etc/squid/accept_domains.conf
# ejemplo de contenido:
.grupoaval.com

/usr/local/etc/squid/accept_domains_system.conf
# ejemplo de contenido:
.microsoft.com
.windowsupdate.com
.windowsmedia.com
.mcafee.com
.nai.com
.mcafeeasap.com

/usr/local/etc/squid/FreeDB.conf
# ejemplo de contenido
freedb.org
cddb.com
music-city.org
allmediaguide.com
allmediaguide.com/lasso
allmusic.com
musicbrainz.org
microsoft.com
windowsmedia.com

Nota:
Recientemente al mirar los log de cache de squid
# tail -f /usr/local/squid/logs/cache.log
2009/09/15 11:58:48| clientNatLookup: PF open failed: (13) Permission denied

Para solucionar esto, debemos modificar el archivo /etc/devfs.conf
# edit /etc/devfs.conf

y agregar esta linea al final:

# Le doy permiso a squid en /dev/pf
own pf root:squid
perm pf 0640