domingo, 26 de octubre de 2008

Sistema de correo MultiPOP con Postfix+FetchMail

para que nuestro postfix funcione como servidor de cuentas multipop, tenemos que decirle que todo lo que llegue hasta el para un dominio definido, lo ponga en una cuenta local, destinada a almacenar la mensajería de este dominio, o sea, decirle que todo lo que venga para @ejemplo.com lo guarde en buzon@dominio.org, para decirle esto al postfix se deben usar los mapas para usuario virtuales, con la directiva

virtual_alias_maps =

la cual obtiene como valor una tabla con el listado de dominios o usuarios virtuales de los cuales el postfix se encargara de procesarle los correos; podria quedar asi

virtual_alias_maps = hash:/usr/local/etc/postfix/virtual_maps

donde virtual_maps, puede contener esto

@dominio.org @dominio.org
@ejemplo.com ccejemplo
manager@dominio.org juan
manager@ejemplo.com juan


la segunda linea le esta indicando al postfix que todos los correos que lleguen con destino al dominio @ejemplo.com los guarde en el buzon correspondiente al usuario ccejemplo.

la 3ra y 4ta linea le estan indicando que los correos con destino al usuario manager en cualquiera de los dos dominios, se lo ponga en el buzon al usuario juan, con esta tabla podemos, para decirlo de alguna manera, "enrutar" los correos para ponerlos en el destino que se nos antoje

NOTA: esto no sobreescribe para nada los encabezados de los correos, ni nada por el estilo, esto solo implica el lugar en donde se van a guaradar los correos en nuestro servidor.

a esta tabla (virtual_maps), cada vez que se le haga una modificacion, hay que crear la base de datos correspondiente con el utilitario `postmap`

# postmap virtual_maps

con esto, ya nuestro postfix esta configurado para que brinde el servicio de multipop para el dominio ejemplo.com

Ahora vamos a configurar el cliente multipop, para que descargue los correos y los distribuya en los buzones de los usuarios destinatarios.

en el lado del cliente para el servicio de multipop, necesitamos fundamentalmente dos servicios.

1.- FetchMail [encargado de revisar el buzón y descargar los correos del servidor]
2.- Postfix [sera quien distribuye los correos en los buzones de usuarios]

Como funciona esta mezcla; el fetchmail es un cliente POP que recolecta los correos de un usuario especifico de un servidor, y al recibirlos, hace con ellos SMTP a un MTA [postfix] que existe local, el cual se encargara de colocar en los buzones los correos de los usuarios.

entonces, para terminar con el trabajo, vamos a comenzar por configurar el fetchmail, en nuestro caso como estamos hablando de la configuración de un multipop, vamos a crear un archivo general para la descarga de correo de los usuarios.

# cat /etc/fetchmailrc
set daemon 60
poll pop.dominio.org
proto pop3
via dominio.org
no dns
localdomains ejemplo.com
user "ccejemplo"
pass "KlaV3.#j3mpl0"
is *


set daemon -> es el valor en segundo de la frecuencia con la cual se va a chequear el buzón en el servidor.
poll -> servidor del cual se va a descargar el correo
localdomains -> dominio local del cual se van a descargar los correos en el servidor
user -> usuario que se autenticara en el buzón
pass -> clave para autenticación

con esta configuración ya el fetchmail se ejecutara y recogerá los correos del servidor, y cuando encuentre alguno, se lo enviara al postfix en este servidor, local, que se configura de la forma clásica, no implica ninguna configuracion especifica para este escenario.

espero sirva de ayuda ;)

jueves, 17 de julio de 2008

Configurando WCCPv2 en un cisco 3725 con squid-2.7.STABLE3 corriendo sobre FreeBSD-6.3

Este how-to describe los pasos necesarios para la configuración de WCCP versión 2.0 con un router CISCO 3725 en combinación con un Squid-2.7.STABLE3 ejecutándose sobre un FreeBSD-6.3.

El WCCP (Web Cache Control Protocol) versión 2 de Cisco es usado para el envío de peticiones Web desde los clientes a uno o mas servidores proxy. La función del WCCP es que nos permite redireccionar el trafico de la web hacia nuestros servidores proxies, en los que prestaremos de servicios de cache, filtros de contenidos, políticas de consumo de ancho de banda, u otros servicios, lo cual nos ayudaría a economizar nuestros enlaces.

Con WCCP, podemos crear un "cluster de cache" para lograr un mejor balance de carga. Por ejemplo, en el caso de tener dos servidores proxies, si uno de los dos falla, por alguna razón, el WCCP redireccionara todo el trafico hacia el segundo, evitando así interrupciones en el servicio. En el caso extremo que los dos servidores de cache, fallen, el WCCP determinara los proxies como "muertos" y enrrutara directamente todas las peticiones a través de sus interfaces.
NOTA: Solo la versión CISCO IOS Release 12.1 o anteriores permiten usar las versiones 1.0 (WCCPv1) o la 2.0 (WCCPv2) de WCCP.


Como funciona WCCP y navegación transparente con Squid?

- Un cliente hace una petición hacia la web, esta va directo al router.
- El router intercepta la peticion.
- El router redirecciona la petición a una nueva ubicación dentro de un marco de enrrutamiento de encapsulamiento genérico (generic routing encapsulation GRE) para prevenir cualquier modificación en el paquete original.
- El túnel (GRE) se establece entre el servidor proxy y el router cisco.
- Todas las peticiones redireccionadas desde el router son encapsuladas bajo el túnel hacia la cache en el FreeBSD.
- El FreeBSD desencapsula el trafico en el GRE y redirecciona los paquetes de WCCP hacia el Squid.
- El redireccionamiento se logra transparentemente usando el Reenvío de Paquetes (IP Forwarding) y el cortafuegos IPFW.
- El squid separa la petición y entonces la reenvía, así sea a un servidor cache padre o directamente a al destino.
- La respuesta a la petición es enviada a través del router al cliente que la origino.

Ahora para armar todas las piezas para el funcionamiento del WCCP, en conjunto con el Squid, se seguirán los siguientes pasos:

- inicialmente necesitamos incluir las fuentes de nuestro kernel en el sistema.

# sysintall
Entrar en la Opción
Configure
Distributions
src
sys
Chose Media
CD/DVD

deje que termine el proceso de inclusión de las fuentes de lo relacionado a "sys", cuando este proceso termine entonces haremos lo siguiente

1.- lo primero sera configurar y recompilar el kernel, para adicionarle soporte para el ip_forward, ipfw.

# cd /usr/src/sys/i386/conf/

hacer una copia del archivo original para modificarlo y ponerlo a nuestro gusto
# cp GENERIC SQUID_WCCP

# nano SQUID_WCCP

2.- con el editor preferido editar el archivo que creamos y adicionarle las siguientes lineas

options IPFIREWALL #firewall
options IPFIREWALL_VERBOSE #enable logging to syslogd(8)
options IPFIREWALL_FORWARD #enable transparent proxy support
options IPFIREWALL_VERBOSE_LIMIT=500 #limit verbosity
options IPSTEALTH #support for stealth forwarding
options DUMMYNET
options NETGRAPH
options DEVICE_POLLING
options HZ=1000

options SHMSEG=128
options SHMMNI=256
options SHMMAX=50331648 # max shared memory segment size (bytes)
options SHMALL=16384 # max amount of shared memory (pages)
options MSGMNB=16384 # max # of bytes in a queue
options MSGMNI=48 # number of message queue identifiers
options MSGSEG=768 # number of message segments
options MSGSSZ=64 # size of a message segment
options MSGTQL=4096 # max messages in system

3.- Configurar y compilar el nuevo kernel
(a.) config SQUID_WCCP
(b.) cd ../compile/SQUID_WCCP/
(c.) make cleandepend
(d.) make depend
(e.) make
(f.) make install
(g.) reboot
Si no hubo errores en nada, entonces todo salio bien, reinicie el servidor con su nuevo kernel.
4.- crear en el FreeBSD el túnel hacia el router.
ifconfig gre0 create
ifconfig gre0 IP.DE.SQUID.BOX 10.20.30.40 netmask 255.255.255.255 link2 tunnel IP.DE.SQUID.BOX IP.DE.CISCO.ROUTER up

4.) compilar squid y configurarlo para que trabaje con WCCP.

(a.) descargar los fuentes del squid desde el sitio oficial
# cd /usr/local/src/
# wget http://www.squid-cache.org/Versions/v2/2.7/squid-2.7.STABLE3.tar.gz
(b.) descompactar el paquete
# tar -zxf squid-2.7.STABLE3.tar.gz
(c.) configurar y compilar
# ./configure --prefix='/usr/local' --sbindir='/usr/local/sbin' --bindir='/usr/local/sbin' --datadir='/usr/local/etc/squid' --sysconfdir='/usr/local/etc/squid' --libexecdir='/usr/local/libexec/squid' --localstatedir='/usr/local/squid' --enable-removal-policies='lru heap' --enable-basic-auth-helpers='NCSA PAM SMB' --enable-auth='basic ntlm digest' --enable-digest-auth-helpers='password' --enable-external-acl-helpers='ip_user session unix_group wbinfo_group' --enable-ntlm-auth-helpers='SMB' --enable-storeio='ufs diskd null' --disable-ident-lookups --enable-kqueue --enable-default-err-language='Spanish' --enable-snmp --enable-largefile --enable-ipfilter --enable-wccpv2 --enable-icmp --enable-arp-acl --enable-delay-pools --disable-wccp
# make all
# make install
(d.) editar el archivo de configuración del squid y poner estas lineas
# nano /usr/local/etc/squid/squid.conf

wccp2_router IP.DE.CISCO.ROUTER
wccp2_forwarding_method 1
wccp2_return_method 1
wccp2_service standard 0

(4.) Crear las reglas del firewall para redireccionar las peticiones web que llegan vía GRE hacia el puerto de trabajo del squid (3128).
Vamos crear un archivo llamado rc.firewall para salvar las reglas del IPFW. Se puede usar el script siguiente, ajustando sus direcciones IP.

#!/bin/sh
##### Inicio de rc.firewall ######
NET_IF="rl0"
IPFW="/sbin/ipfw -q"
#IP del Proxy
IF_ADDR="192.168.1.2"
ROUTER_IP="192.168.1.1"
PROXY_NET="192.168.1.0/24"
PROXY_PARENT="192.168.0.1"
ALL_NET="192.168.2.0/24"
CLIENT_NET="192.168.3.0/24"
ADMIN_NET="192.168.1.10"
SSH_PORT="4554"
LOCALHOST="127.0.0.1"
$IPFW -f flush
$IPFW add allow all from any to any via lo0
#$IPFW add allow all from any to any
$IPFW add allow gre from any to any frag
#$IPFW add deny ip from any to any frag
$IPFW add fwd 127.0.0.1,3128 tcp from any to any 80 via gre0 in
$IPFW add fwd 127.0.0.1,3128 ip from any to any via gre0 in
$IPFW add fwd 127.0.0.1,3128 tcp from any to any 80 in
$IPFW add fwd 127.0.0.1,3128 tcp from any to any http in via gre0
$IPFW add allow tcp from any 80 to $PROXY_NET in
$IPFW add allow all from $ROUTER_IP to $IF_ADDR
$IPFW add allow all from $IF_ADDR to $ROUTER_IP
$IPFW add allow gre from $ROUTER_IP to $IF_ADDR
$IPFW add allow all from $IF_ADDR to any
#Allow local DNS caching
$IPFW add allow udp from $ALL_NET to any 53
$IPFW add allow udp from any 53 to $IF_ADDR
$IPFW add allow tcp from any 53 to $IF_ADDR
$IPFW add allow all from any to any out via $NET_IF

#Permitir Consultas DNS
$IPFW add allow udp from $ALL_NET 53 to $IF_ADDR
#For Proxy access
$IPFW add allow tcp from $ALL_NET to any 3128 in via $NET_IF

##### Permitir Conexiones Establecidas
$IPFW add allow tcp from any to any in via $NET_IF established
# Para consultas ICP
$IPFW add allow UDP from $PROXY_PARENT to $PROXY_NET 3130
$IPFW add allow UDP from $PROXY_NET to $PROXY_PARENT 3130
####### Para SSH
$IPFW add allow tcp from $ADMIN_NET to $IF_ADDR $SSH_PORT
#Para SNMPWALK desde el administrador
$IPFW add allow udp from $ADMIN_NET to me 3001
$IPFW add allow udp from $ADMIN_NET to me 161
$IPFW add allow udp from $ADMIN_NET to me 161
$IPFW add allow udp from $LOCALHOST to me 3001
$IPFW add allow udp from $LOCALHOST to me 161
###########
$IPFW add allow ICMP from $ALL_NET to any
#################################################
# Permitir TODO desde el administrador
$IPFW add allow all from $ADMIN_NET to me
$IPFW add allow all from me to $ADMIN_NET
$IPFW add 65533 deny log all from any to any
############# End of rc.firewall ###############

5.- Habilitar WCCP en el router Cisco
Global Configuration
Router (config)# ip wccp version 2
Router (config)# ip wccp web-cache redirect-list 160
Access-List 160
permit ip 192.168.0.0 0.0.0.255 any
Router (config)# interface fastethernet 0/0
Router(config-if)# ip wccp web-cache redirect in
Router# write
Final de la configuracion de WCCP para router Cisco

6.- Habilitar el ip_forwarding en systcl.conf

agregar estas lineas en /etc/sysctl.conf

net.inet.ip.forwarding=1
net.inet.ip.fastforwarding=1

7.- Reiniciar el squid y recargar las reglas del IPFW. Si no hay ningun error, entonces ya tiene trabajando su servidor proxy resondiendo peticiones a traves del GRE y usando el WCCP de su router Cisco

Happy Proxying with Squid + FreeBSD + Cisco WCCP !!!

jueves, 22 de mayo de 2008

Resolver "SIOCSIFADDR No such device eth0 error while getting interface flags" en Debian

si la interface de red que estaba en nuestra PC se rompio y la reemplazamos por otra, normalmente nos da errores como este

SIOCSIFADDR No such device eth0 error while getting interface flags

y que

Failed to bringe interface eth0

para resolver esto, primeramente revisar si la maquina ha reconocido la interface de red, como un nuevo hardware:

# dmesg | egrep eth

si el kernel vio el nuevo hard, entonces podemos hacer esto

en el archivo /etc/udev/rules.d/70-persistent-net.rules existe una relacion de direcciones MAC con el nombre que se le asigna a la interface, por lo general a la primera que se le pone le da el eth0, pero entonces el kernel si es la unica interface le dice que es eth0, las lineas en este archivo se ven como esta mas o menos:

# PCI device 0x8086:0x1039 (e100)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:11:11:4e:ea:6c", NAME="eth0"

se eliminan las lineas correspondientes a las interfaces anteriores y se deja solamente la que nos corresponde.

despues de esto se reinicia el udev

# /etc/init.d/udev restart

luego se puede activar la interface o reiniciar la maquina para que tome toda la configuracion adecuada

# ifup eth0

o
# reboot

Configurar Fecha y Hora en FreeBSD

es incluso mas sencillo que hacerlo en linux, con solo darle los parametros que queremos al comando `date` se resuelve, y bien claro

# date 0805220741
Thu May 22 07:41:00 UTC 2008
# date
Thu May 22 07:41:00 UTC 2008
#

y con eso, ya esta, no hace falta hacer nada mas para poner en hora nuestro sistema.

;)

domingo, 13 de abril de 2008

Postfix + MailScaner y Clamav

Antivirus instalacion y configuracion

Comenzamos por instalar los paquetes necesarios

apt-get install clamav

apt-get install mailscanner

Después de la instalación actualizamos clamav con el comando

freshclam

Escaneamos el directorio home en buscas de virus

clamscan -ri /home

Ahora vamos a modificar en el fichero /etc/MailScanner/Mailscanner.conf lo siguiente:

Run As User = postfix

Run As Group = postfix

Incoming Queue Dir = /var/spool/postfix/hold

Outgoing Queue Dir = /var/spool/postfix/incoming

MTA = postfix

Virus Scanners = clamav

Añadimos a la configuration de postfix /etc/postfix/main.cf esta línea

header_checks = regexp:/etc/postfix/header_checks

Creamos touch /etc/postfix/header_checks y añadimos la línea

/^Received:/ HOLD

Modificamos el fichero /etc/default/mailscanner descomentando lo siguiente:

run_mailscanner=1

damos permisnos para que todo quede listo

usuario grupo

chown -R postfix:postfix /var/spool/MailScanner

chown -R postfix:postfix /var/lib/MailScanner

chown -R postfix:postfix /var/run/MailScanner

chown -R postfix:postfix /var/lock/subsys/MailScanner

/etc/init.d/mailscanner start

/etc/init.d/postfix start

Creación de usuarios por lote con el comando `newusers`

Podemos crear una serie de usuarios encadenados a partir de un fichero de texto plano que ha de contener los mismos campos que el fichero passwd . Un ejemplo de este fichero podría ser este:

pepe10:pas10::600::/home/pepe10:/bin/bash
pepe20:pas22::600::/home/pepe20:/bin/bash
pepe21:pas21::600::/home/pepe21:/bin/bash

A este fichero le podemos llamar todos-usuarios y lo activaríamos con el comando newusers de la siguiente manera

:~# newusers todos-usuarios

y registraria a todos los usuarios que hay dentro del fichero todos-usuarios.

la sintaxis del archivo todos-usuarios es la misma que lleva el archivo passwd.

# [username] [password] [UID] [GID] [información adicional]
# [directorio de inicio] [shell del usuario]
pepe10:pas10::600::/home/pepe10:/bin/bash

en el caso del UID y GID si no se le da un número específico el los genera automáticamente, en el caso del directorio de inicio lo primero que hace es chequear si existe y si no lo crea!
el campo de la clave se da en texto plano y el script la encripta!

Configuración de un Sistema de Correo con Postfix+MySQL+Sasl+Squirrelmail

Este manual es una guía práctica, no tiene en cuenta los conceptos teóricos. No es la única forma de montar este sistema pero fue por la que me fui y esta funcionando, me gustó por que es bastante personalizable.
Primero que todo vamos a comenzar por instalar los paquetes fundamentales.

aptitude install postfix postfix-mysql postfix-doc mysql-client mysql-server courier-authdaemon courier-authmysql courier-pop courier-imap postfix-tls libsasl2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl phpmyadmin

Lo próximo es crear un usuario para que sean quien usen los servicios para conectarse a nuestra base de datos.

$ mysql -u root -p
Password: ***************
mysql> CREATE USER 'mail_admin'@'my.db.server' IDENTIFIED BY 'm41l_4dm\n';

mysql> GRANT USAGE ON * . * TO 'mail_admin'@ 'my.db.server' IDENTIFIED BY 'm41l_4dm\n' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

mysql> CREATE DATABASE 'mailserver';

mysql> GRANT ALL PRIVILEGES ON `mailserver` . * TO 'mail_admin'@ 'my.mail.server';

mysql> use mailserver;

mysql> CREATE TABLE domains (
domain varchar(50) NOT NULL,
PRIMARY KEY (domain) )
TYPE=MyISAM;

mysql> CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
TYPE=MyISAM;

mysql> CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
quota INT(10) DEFAULT '10485760',
PRIMARY KEY (email)
) TYPE=MyISAM;

mysql> CREATE TABLE transport (
domain varchar(128) NOT NULL default '',
transport varchar(128) NOT NULL default '',
UNIQUE KEY domain (domain)
) TYPE=MyISAM;
mysql> quit

estas tablas tienen las funciones de:
domains -> almacenar los dominios que va a manejar nuestro postfix.
forwardings -> almacena los alias que se vayan a manejar por nuestro MTA.
users -> esta tiene la pulpa, lleva la información para la autenticación del usuario y la cuota q se le aplica. Aquí es donde pienso agregar los campos para el tipo de mensajería que tendrá el usuario y si esta activo o no!
transport -> aquí esta la tabla de transportes para nuestro MTA.
Configuración de postfix.
Antes que nada vamos a crear el usuario y el grupo que nos brindara si directorio de inicio y sus permisos para manejar todos los buzones de nuestros usuarios virtuales. Luego veremos donde se pone en practica la función de este usuario.

~# groupadd -g 5000 vmail
~# useradd -g vmail -u 5000 vmail -d /home/vmail -m

Las conexiones que va a hacer nuestro MTA (postfix) serán siempre locales, por lo tanto no necesitamos que MySQL escuche por la interface física que tenemos, para asegurarnos de esto modificamos el archivo de configuración del MySQL y nos aseguramos de que el parámetro bind-address tenga como valor a 127.0.0.1
Lo próximo que vamos a hacer es decirle al postfix donde encontrar la información de la base de datos y las consultas que le va a hacer a las tablas relacionadas con nuestro servicio. Para esto vamos a crear 6 archivos de texto que contendrán esta información.
voy a tratar la variable $config_directory para que sea independiente del directorio en el que se encuentra la configuración del servidor, ya que en no en todas las variantes de Unix se encuentra en el mismo lugar.

$config_directory/mysql-virtual_domains.cf
user = mail_admin
password = m41l_4dm\n
hosts = my.db.server
dbname = mailserver
query = SELECT domain FROM domains WHERE domain='%s'

$config_directory/mysql-virtual_forwardings.cf
user = mail_admin
password = m41l_4dm\n
hosts = my.db.server
dbname = mailserver
query = SELECT destination FROM forwardings WHERE source='%s'

$config_directory/mysql-virtual_mailboxes.cf:
user = mail_admin
password = m41l_4dm\n
hosts = my.db.server
dbname = mailserver
query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s'

$config_directory/mysql-virtual_email2email.cf:
user = mail_admin
password = m41l_4dm\n
hosts = my.db.server
dbname = mailserver
query = SELECT email FROM users WHERE email='%s'

$config_directory/mysql-virtual_transports.cf:
user = mail_admin
password = m41l_4dm\n
hosts = my.db.server
dbname = mailserver
query = SELECT transport FROM transport WHERE domain='%s'

$config_directory/mysql-virtual_mailbox_limit_maps.cf:
user = mail_admin
password = m41l_4dm\n
hosts = my.db.server
dbname = mailserver
query = SELECT quota FROM users WHERE email='%s'

ahora vamos a hacer la configuración del archivo principal del postfix, main.cf,

myhostname = correo.midominio.org
mydestination = correo.midominio.org, localhost, localhost.localdomain
mynetworks = 127.0.0.0/8

virtual_alias_domains =
virtual_alias_maps =
proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql- virtual_email2email.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_mailbox_base = /home/vmail
virtual_uid_maps = static:5000 # UID del usuario que creamos para que guarde los buzones
virtual_gid_maps = static:5000 # GID del usuario que creamos para que guarde los buzones
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps =
proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf

virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = "El usuario esta Sobrepasado de su Cuota."
virtual_overquota_bounce = yes

smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

# smtpd_use_tls = yes
# smtpd_tls_cert_file = /etc/postfix/smtpd.cert
# smtpd_tls_key_file = /etc/postfix/smtpd.key

transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf

proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps

Configuración del Courier-Imap.
en el directorio de confirugacion del courier vamos a editar el archivo authdaemonrc.
authmodulelist="authmysql"
y luego el archivo authmysqlrc

MYSQL_SERVER my.db.server
MYSQL_USERNAME mail_admin
MYSQL_PASSWORD m41l_4dm\n
MYSQL_PORT 3306
MYSQL_DATABASE mailserver
MYSQL_USER_TABLE users
MYSQL_CRYPT_PWFIELD password
#MYSQL_CLEAR_PWFIELD password
MYSQL_UID_FIELD 5000
MYSQL_GID_FIELD 5000
MYSQL_LOGIN_FIELD email
MYSQL_HOME_FIELD "/home/vmail"
MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
#MYSQL_NAME_FIELD
MYSQL_QUOTA_FIELD quota

Después reiniciar todos los procesos del courier

:~# /etc/init.d/courier-authdaemon restart
:~# /etc/init.d/courier-imap restart
:~# /etc/init.d/courier-imap-ssl restart
:~# /etc/init.d/courier-pop restart
:~# /etc/init.d/courier-pop-ssl restart

para FreeBSD seria

:~# /usr/local/etc/rc.d/courier-authdaemon restart
:~# /usr/local/etc/rc.d/courier-imap restart
:~# /usr/local/etc/rc.d/courier-imap-ssl restart
:~# /usr/local/etc/rc.d/courier-pop restart
:~# /usr/local/etc/rc.d/courier-pop-ssl restart

verificamos que estén funcionando los servicios.

:~# telnet localhost pop3
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
+OK Hello there.
:~# telnet localhost imap
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
+OK Hello there.

Configuración del Saslauth para la autenticación del SMTP.
Editar el archivo /etc/default/saslauthd, eliminar el comentario de la linea START = yes y agregar una linea en que se le pasaran los parámetros necesarios al demonio.

START=yes
MECHANISMS="pam"
PARAMS="-m /var/spool/postfix/var/run/saslauthd -r"

Luego vamos a crear el archivo que usara el PAM para la autenticación SMTP, en /etc/pam.d/smtp

auth required pam_mysql.so user=mail_admin passwd=m41l_4dm\n host=my.db.server db=mailserver table=users usercolumn=email passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=mail_admin passwd= m41l_4dm\n host=my.db.server db=mailserver table=users usercolumn=email passwdcolumn=password crypt=1

Luego se crea un archivo dentro del directorio $config_directory/sasl/ con el nombre smtpd.conf
con las siguientes lineas.

pwcheck_method: saslauthd
log_level: 7
mech_list: login plain
mysql_verbose: yes

Después reiniciamos el postfix.

:~# /etc/init.d/postfix restart
:~# /etc/init.d/saslauthd restart

para FreeBSD seria

:~# /usr/local/etc/rc.d/postfix restart
:~# /usr/local/etc/rc.d/saslauthd restart

lo otro que queda es crear un par de registros en nuestra base de datos y ya esta todo funcionando!

mysql -u mail_admin -p
Password:

USE mailserver;
Se Debe crear al menos una entrada para el dominio que se va a manejar.
INSERT INTO `domains` (`domain`) VALUES ('midominio.org');
INSERT INTO `users` (`email`, `password`, `quota`) VALUES ('user@midominio.org', ENCRYPT('Mykl4v3'), 10485760);
(Asegúrense de usar la función ENCRYPT para almacenar la clave de acceso encriptada!)
Si quiere agregar entradas en las otras tablas, debe quedar como esto:

INSERT INTO `forwardings` (`source`, `destination`) VALUES ('pepe@midiminio.org', 'user@midominio.org');
INSERT INTO `transport` (`domain`, `transport`) VALUES ('midominio.org', 'smtp:mx.midominio.org');

Configuracion del Squirrelmail
en el config.php se deben editar las siguientes lineas.

$imap_server_type = 'courier';
$imap_auth_mech = 'login';

Crear salvas de la configuración y guardarlas en un FTP automaticamente.

con este script se crea una salva del directorio /etc/ y se pone en un servidor a traves del protocolo ftp.

#!/bin/bash

echo "Haciendo Copia de Seguridad en $HOSTNAME"
echo ""
cd /tmp

# Variables
CONF="/etc"
FECHA=$(date +%m-%y)

# Paramteros del ftp
USUARIO=user-ftp
PASSWORD=key-user
HOSTREMOTO=ftp.server.rimed.cu

echo "Eliminando Ficheros de Salva Anteriores"
echo ""
rm -f $HOSTNAME*
echo ""
tar -zcf salva-config.tgz $CONF
echo "Creando fichero unico y eliminando antiguos [$HOSTNAME[Antiguos]] "
tar -zcf $HOSTNAME-CONFIG-$FECHA.tgz salva-*

echo "Guardando en el FTP de $HOSTREMOTO"

ftp -inv << BUKAERA
open $HOSTREMOTO
user $USUARIO $PASSWORD
pwd
hash
put $HOSTNAME-CONFIG-$FECHA.tgz
bye

BUKAERA

rm -f salva-*

chmod 666 $HOSTNAME*

cuando se ejecuta el script, se puede ver algo como asi

batfeld:~# ./backup.sh
Haciendo Copia de Seguridad en batfeld

Eliminando Ficheros de Salva Anteriores

Haciendo salva de /etc

tar: Removing leading `/' from member names
Creando fichero unico y eliminando antiguos [batfeld[Antiguos]]
Guardando en el FTP de archer.cmw.rimed.cu
Connected to archer.cmw.rimed.cu.
220 ProFTPD 1.3.1 Server (Debian) [192.168.159.37]
Remote system type is UNIX.
Using binary mode to transfer files.
331 Password required for ftp-proxy
230 User ftp-proxy logged in
Remote system type is UNIX.
Using binary mode to transfer files.
257 "/" is the current directory
Hash mark printing on (1024 bytes/hash mark).
local: batfeld-CONFIG-12-07.tgz remote: batfeld-CONFIG-12-07.tgz
200 PORT command successful
150 Opening BINARY mode data connection for batfeld-CONFIG-12-07.tgz
##############################################
##############################################
#####################
226 Transfer complete
874749 bytes sent in 0.07 secs (12560.4 kB/s)
221 Goodbye.

para agregarlo en el cron se puede copiar el script en /etc/cron.daily o en el crontab para ponerlo a que se ejcute a alguna hora en específico!

25 2 * * * root /root/scripts/backup.sh

;)

Deshabilitar IPv6 en Debian GNU/Linux

Debian trae habilitado en sus kernels estándares el IPV6. Si esta funcionalidad no es necesaria trae como consecuencias:

- Algunos servicios (como apache, mysql, ssh, etc) escuchan en los puertos TCP de IPV6, por lo tanto tendríamos que utilizar ip6tables para bloquear estos puertos. Esto se visualiza cuando la salida de netstat -lt contiene lineas que comienzan con tcp6.

- Empeora el desempeño de algunos servicios que intentan hacer reverse lookup y como el DNS es IPV4 no las responderá, generando demoras innecesarias. Esto a veces se puede observar en el tiempo que tarda en finalizar el comando netstat -lt.

- También puede traer otros problemas según las aplicaciones que estén instaladas como por ejemplo demoras en el arranque.

Una forma de conocer si nuestro kernel soporta IPV6 es observando si existe el archivo /proc/net/if_inet6.

Tambien podemos ver como el kernel trata de aplicar rutas para IPv6 y le es imposible debido a que no las encuentra

# dmesg | egrep IPv6
eth2: no IPv6 routers present

Una posible solución a estos problemas es deshabilitar el modulo IPV6 en el kernel.

Para ello editamos el archivo
/etc/modprobe.d/aliases si usamos un kernel 2.6
o /etc/modprobe.conf si usamos un kernel 2.4
y cambiamos la linea que dice:

alias net-pf-10 ipv6

por

alias net-pf-10 off

Luego tendremos que reiniciar para que se tomen los cambios, dado que el modulo ipv6 no se puede descargar.

Montar Postfix, Dovecot, Squirrelmail con soporte SASL

paquetes a utilizar
- postfix
- sasl2-bin

///////////////// CONFIGURACIÓN DE POSTFIX //////////////////
en el archivo /etc/postfix/main.cf

# habilitar el soporte sasl en el postfix
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
# no permitir usuarios anónimos en la autenticación mediante sasl
smtpd_sasl_security_options = noanonymous
# evitar que ciertos clientes no entiendan las lineas del sasl
broken_sasl_auth_clients = yes

smtpd_client_restrictions = permit_sasl_authenticated,permit_mynetworks,reject

smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination

NOTA: en $mynetworks solo de declararan las direcciones IP de los servidores que podrán hacer smtp hasta nosotros sin necesidad de autenticación, no se debe declarar ninguna de nuestra red local.

/////////////// CONFIGURACION DE SASLAUTHD //////////////////

en /etc/default/saslauthd de cambian los siguientes atributos

# Iniciar con el sistema
START=yes
# mecanismo a utilizar para la autenticacion
MECHANISMS="pam"
# opciones para la ajecucion del saslauthd
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"

-m lugar donde creara el socket para recibir conexiones

el socket de escucha del saslauthd se debe crear dentro de la jaula de trabajo del postfix [/var/spool/postfix].

crear y dar los permisos adecuados al directorio de trabajo del sasl, en caso de que este no exista.

mkdir -p /var/spool/postfix/var/run/saslauthd/
chmod 755 /var/spool/postfix/var/run/saslauthd/
chown root.sasl /var/spool/postfix/var/run/saslauthd/

se creara el archivo /etc/postfix/sasl/smtpd.conf en el que se agregaran las siguientes lineas

# método para la verificación de la clave de acceso
pwcheck_method: saslauth
# mecanismos de encriptacion de la clave de acceso del usuario
# a utilizar para la autenticación ante una conexión por smtp
mech_list: plain login

/////////////////// PROBANDO LA CONFIGURACIÓN ////////////////////

# postconf -n | egrep mynetwork
mynetworks = 169.158.0.25, 200.55.156.188

# nótese que no esta permitido a localhost el smtp directo, solo a dos direcciones IP

$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 correo.cmw.rimed.cu ESMTP Postfix (Debian/GNU)
ehlo correo.cmw.rimed.cu
250-correo.cmw.rimed.cu
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from:aldomtnez@isp.cmw.rimed.cu
250 2.1.0 Ok
rcpt to:aldomtnez@isp.cmw.rimed.cu
554 5.7.1 : Client host rejected: Access denied
quit
221 2.0.0 Bye
Connection closed by foreign host.

en este ejemplo anterior no permitió al usuario enviar el correo, ni siquiera local puesto que no se había autenticado antes para poder enviar el correo. Devolviendo como error Client host rejected: Access denied. En las restricciones smtpd que se declararon se comienza por chequear que este autenticado.

otro ejemplo

Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 archer.cmw.rimed.cu ESMTP Postfix (Debian/GNU)
ehlo archer.cmw.rimed.cu
250-archer.cmw.rimed.cu
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH PLAIN YWxkb210bmV6AGFsZG9tdG5legBhbGRvbXRuZXo=
235 2.0.0 Authentication successful
mail from:aldomtnez@isp.cmw.rimed.cu
250 2.1.0 Ok
rcpt to:aldomtnez@isp.cmw.rimed.cu
250 2.1.5 Ok
data
354 End data with .
envio de mensaje
.
250 2.0.0 Ok: queued as 6668C2B251

notese que en este caso si se permitio el envio del correo por que el usuario se autentifico.
AUTH PLAIN YWxkb210bmV6AGFsZG9tdG5legBhbGRvbXRuZXo=
235 2.0.0 Authentication successful

para obtener la clave encriptada se ejecuta esto en la consola de nuestro sistema.
# perl -MMIME::Base64 -e 'print encode_base64("user\0user\0clave");'

HASTA AQUI ESTA FUNCIONANDO NUESTRO POSTFIX CON SOPORTE PARA SASL Y EL SASL ESTA AUNTENTICANDOO LOS USUARIOS DE FORMA CORRECTA.
NOTA: si se quiere ver los registros de postfix de una manera mas informativa, se puede editar el master.cf del postfix y agregar la opcion -v al demonio smtpd

smtp inet n - - - - smtpd -v

//////////////////////// CONFIGURACION DE DOVECOT ////////////////////////

habilitar soporte sasl en el dovecot.conf
buscar la sección de autenticación, y en la parte del socket cliente poner de esta manera
auth default {
mechanisms = plain login
passdb pam {
}
userdb passwd {
}
socket listen {
client {
# Assuming the default Postfix $queue_directory setting
path = /var/spool/postfix/private/auth
mode = 0660
# Assuming the default Postfix user and group
user = postfix
group = postfix
}
}
}

en el main.cf del postfix agregar estas lineas
smtpd_sasl_type = dovecot
# Puede ser el camino absoluto o relativo al $queue_directory
# smtpd_sasl_path = private/auth
smtpd_sasl_path = /var/spool/postfix/private/auth

////////////////// CONFIGURACION DE SQUIRRELMAIL //////////////////////
el archivo de configuracion del squirrelmail, en /et/squirrelmail/config.php se deben modificar las siguientes lineas

$pop_before_smtp = true;
$smtp_auth_mech = 'login';
$imap_auth_mech = 'login';

Resolución Inversa de Zonas en el DNS con subredes.

Configuración de Bind-9 para resolución de zonas inversas.

Esto lo he sacado del rfc2317 que esta en el sitio www.rfc-es.org

como nuestra red esta dividida en subredes es necesario que nuestro DNS pueda resolver y consultar los otros DNS para encontrar quien es cada IP, de no ser asi, tendríamos que tener cada uno en nuestra zona inversa la definición de TODAS las maquinas de la red entera, serian como mínimo 255 entradas... mmm un poco pesado de mantener esto.

quedaria algo asi.

$ORIGIN 159.168.192.in-addr.arpa.

1 IN PTR host1.sub.rimed.cu
2 IN PTR host2.sub.rimed.cu
3 IN PTR host3.sub.rimed.cu
...
255 IN PTR host255.sub.rimed.cu

y eso es solo para trabajar con las redes de los pedagógicos, imagínense que incluyamos al de los IPI o todas las redes que tenemos en estos momentos.
Pero bueno, como se dice que todo tiene solución solo que hay que dedicarle un poco de tiempo, encontré esta.
Se van a declarar dos zonas, una que va a identificar la red entera y la otra, que va a ser la que estará en cada uno de los servidores de los nodos que van a ser autoritativos en la subred que le corresponde.
La declaración de la red completa seria así

$ORIGIN 159.168.192.in-addr.arpa.
$TTL 604800
@ IN SOA host.rimed.cu. hostmaster.rimed.cu. (
07062009 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL

NS ns.rimed.cu.

; Red CMW
32/28 NS ns.cmw.rimed.cu.
$GENERATE 33-47 $ CNAME $.32/28.159.168.192.in-addr.arpa.

; Red CFG
112/28 NS ns1.cfg.rimed.cu.
$GENERATE 112-127 $ CNAME $.112/28.159.168.192.in-addr.arpa.

así mismo se declaran todas las subredes que correspondan.
que es lo que hace el registro $GENERATE
bueno, pero si se oye clarito clarito; genera entradas a partir de un patrón, en este caso pondría cosas como esta

$GENERATE 33-47 $ CNAME $.32/28.159.168.192.in-addr.arpa.

33.159.168.192.in-addr.arpa CNAME 33/28.159.168.192.in-addr.arpa
34.159.168.192.in-addr.arpa CNAME 34/28.159.168.192.in-addr.arpa

y así sucesivamente, va poniendo todos los registros necesarios asociados e las diferentes subredes con el servidor DNS que la resolverá.
ahora, como se declara la zona en los servidores de los subnodos

$ORIGIN 32/28.159.168.192.in-addr.arpa.
$TTL 604800
@ IN SOA strike.cmw.rimed.cu. admin-red.cmw.rimed.cu. (
07062003 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL

@ NS ns.cmw.rimed.cu.
33 IN PTR frelay.cmw.rimed.cu.
34 IN PTR batfeld.cmw.rimed.cu.
35 IN PTR strike.cmw.rimed.cu.
36 IN PTR serv1.cmw.rimed.cu.
37 IN PTR archer.cmw.rimed.cu.
38 IN PTR hard.cmw.rimed.cu.
39 IN PTR nicolas.cmw.rimed.cu.
40 IN PTR sephiroth.cmw.rimed.cu.

esta zona de declara normal, que es lo que se ve diferente la declaración de el $ORIGIN que debe coincidir con el que esta definido en la zona de la red completa.
la otra parte es la declaración de la zona en el archivo named.conf; quedaría así

zone "32/28.159.168.192.in-addr.arpa" {
type master;
file "frelay/db.fr.192.168.159.32";
};

y por supuesto en cada forward para cada dominio se hará un forward de la zona inversa también, junto con la de resolución, como por ejemplo:

zone "cfg.rimed.cu" IN {
type forward;
forwarders {192.168.159.114;};
};

zone "112/28.159.168.192.in-addr.arpa" IN {
type forward;
forwarders {192.168.159.114;};
};

y con esto me esta funcionando, hice una prueba contra cfg y funcionó, ahora, la cuestión esta en donde debe ir definida la zona que domina la red entera. yo pienso que el ISP de carácter mas global, que en nuestro caso es RIMED.

aquí pongo la respuesta a las consultas de resolución inversa desde un servidor de camaguey

# host 192.168.159.114
114.159.168.192.in-addr.arpa is an alias for 114.112/28.159.168.192.in-addr.arpa.
114.112/28.159.168.192.in-addr.arpa domain name pointer hermes.cfg.rimed.cu.

# dig +short -x 192.168.159.114
114.112/28.159.168.192.in-addr.arpa.
hermes.cfg.rimed.cu.

# dig +short hermes.cfg.rimed.cu
192.168.159.114

saludos y nos mantenemos en contacto