Cómo instalar un servidor Postfix (II) : Dovecot 2.0

Una vez que tenemos el servidor funcionando, vamos a empezar a discriminar mensajes.  Por defecto vamos a considerar como mensajes locales y de confianza sólo los que vengan de nuestra ip local.  Si alguien quiere enviar mensajes a través de nuestro servidor, deberá autenticarse.

Primero instalamos dovecot y así podremos utilizar el servidor con POP3 e IMAP :

# yum -y install dovecot
# chkconfig dovecot on

Y editamos su configuración en  /etc/dovecot/conf.d/10-master.conf  y añadimos los siguientes parámetros dentro de ‘service auth’

unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix 
    group = postfix
}

En  /etc/dovecot/conf.d/10-mail.conf  añadimos :

mail_location = maildir:~/Maildir

En /etc/dovecot/conf.d/20-pop3.conf  añadimos :

pop3_uidl_format = %08Xu%08Xv
pop3_client_workarounds = outlook-no-nuls

Y en /etc/dovecot/conf.d/20-imap.conf  añadimos :

imap_client_workarounds = delay-newmail

Reiniciamos el servicio dovecot y probamos la configuración :

# telnet localhost pop3
Trying ::1...
 Connected to localhost.
 Escape character is '^]'.
 +OK Dovecot ready. <ada.1.4e32ef80.da6CWXF+V9S4cJyTpG34uw==@mail>
user user1
+OK
pass user1
+OK Logged in.
list
+OK 1 messages:
 1 470
 .
retr 1
+OK 470 octets
 Return-Path: <test@test.org>
 X-Original-To: user1@midominio.org
 Delivered-To: user1@midominio.org
 Received: from local (localhost [IPv6:::1])
 by mail.midominio.org (Postfix) with ESMTP id F2E5DB6
 for <user1@midominio.org>; Wed, 27 Jul 2011 20:51:21 +0200 (CEST)
 subject: prueba 1
 Message-Id: <20110727185126.F2E5DB6@mail.midominio.org>
 Date: Wed, 27 Jul 2011 20:51:21 +0200 (CEST)
 From: test@test.org
 To: undisclosed-recipients:;
primer correo de prueba
 .
quit
 +OK Logging out.
 Connection closed by foreign host.

Hemos recuperado el mensaje que habíamos enviado al usuario user1, por lo que dovecot está funcionando correctamente.

Ahora modificamos el archivo el arhivo /etc/postfix/main.cf  y reiniciamos el servicio

mynetworks = 127.0.0.0/8
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

Ahora al intentar conectarnos para enviar un mensaje tendremos el siguiente ‘problema’ :

# telnet 10.0.0.254 smtp
Trying 10.0.0.254...
Connected to 10.0.0.254.
Escape character is '^]'.
Connection closed by foreign host.

Y si miramos el log en  /var/log/maillog  :

Jul 29 22:47:07 mail postfix/smtpd[6552]: connect from unknown[10.0.0.1]
 Jul 29 22:47:07 mail postfix/smtpd[6552]: warning: SASL: Connect to private/auth failed: Permission denied
 Jul 29 22:47:07 mail postfix/smtpd[6552]: fatal: no SASL authentication mechanisms
 Jul 29 22:47:08 mail postfix/master[6495]: warning: process /usr/libexec/postfix/smtpd pid 6552 exit status 1
 Jul 29 22:47:08 mail postfix/master[6495]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling

Aunque comprobemos los permisos del archivo private/auth  veremos que todo está correcto … pero no hay que romperse la cabeza, esto es cosa de selinux

Primero instalamos la herramienta que nos ayudará a resolver nuestros problemas con selinux :

# yum -y install setroubleshoot-server

Y ahora filtramos la información del log :

# grep postfix  /var/log/audit/audit.log  >  postfix_selinux
# sealert -a  postfix_selinux

Y vemos la siguiente info :

Summary:
SELinux is preventing /usr/libexec/postfix/smtpd "connectto" access on
 /var/spool/postfix/private/auth.
Detailed Description:
SELinux denied access requested by smtpd. It is not expected that this access is
 required by smtpd and this access may signal an intrusion attempt. It is also
 possible that the specific version or configuration of the application is
 causing it to require additional access.
Allowing Access:
You can generate a local policy module to allow this access - see FAQ
 (http://docs.fedoraproject.org/selinux-faq-fc5/#id2961385) Please file a bug
 report.

No preocuparse, tenemos otra utilidad de nuestro lado :

# grep postfix postfix_selinux | audit2allow -M mimodulo
# semodule -i mimodulo.pp

Y con la política instalada, ya no debería dar más problemas …

Ahora probamos a conectar de nuevo con el servidor :

# telnet 10.0.0.254 smtp
Trying 10.0.0.254...
 Connected to 10.0.0.254.
 Escape character is '^]'.
 220 mail.midominio.org ESMTP Postfix
 ehlo local
 250-mail.midominio.org
 250-PIPELINING
 250-SIZE 10240000
 250-VRFY
 250-ETRN
 250-AUTH PLAIN
 250-AUTH=PLAIN
 250-ENHANCEDSTATUSCODES
 250-8BITMIME
 250 DSN
mail from: user1@midominio.org
250 2.1.0 Ok
rcpt to: test@test.org
554 5.7.1 <test@test.org>: Relay access denied

Lo primero que vemos diferente son las líneas de respuesta a ‘ehlo local’ :

250-AUTH PLAIN
 250-AUTH=PLAIN

Ahora ya nos podemos autenticar con el servidor.  Tal como hemos configurado en dovecot y postfix : todas las conexiones que vengan de 127.0.0.1 serán consideradas como locales, para todas las demás será necesario autenticarse contra el servidor para enviar mensajes a otros servidores.  De esta forma evitamos ser un servidor ‘open relay‘ y no nos podrán utilizar  para enviar spam.

Por eso vemos que al intentar enviar un mensaje a una cuenta externa nos muestra el mensaje “Relay access denied”.  Para evitar ese mensaje tenemos que autenticarnos con el usuario user1 :

auth plain AHVzZXIxAHVzZXIx
235 2.7.0 Authentication successful
rcpt to: test@test.org
250 2.1.5 Ok

Y una vez autenticados no hay problema para enviar el mensaje.

Por supuesto también podemos conectarnos a la cuenta por POP3 e IMAP y descargar los mensajes  ( ojo que hay que abrir los puertos en el firewall ).

Aquí está el log de la descarga de los mensajes :

Jul 29 23:49:48 mail dovecot: pop3-login: Login: user=<user1>, method=PLAIN, rip=10.0.0.1, lip=10.0.1.10, mpid=1678, TLS
Jul 29 23:49:48 mail dovecot: pop3(user1): Disconnected: Logged out top=0/0, retr=2/1003, del=0/2, size=971

Nos hemos conectado por POP3, la autenticación ha sido en plano, desde la IP 10.0.0.1 y hemos descargado 2 mensajes con un tamaño de 971 bytes.

En la siguiente entrega añadiremos cifrado a los protocolos, que no es muy elegante ir con las contraseñas en plano …

Configurar un servidor de VPN con openvpn

El esquema de la red que tenemos es el siguiente :


Tenemos dos routers linux conectados a internet con las IP “públicas”  192.168.1.254  y  192.168.1.253

El equipo que hace la función de servidor es RT1,  y recibirá las peticiones de conexión VPN.  Puede ser que el equipo que hace de servidor, no tenga asignada la IP pública, sino que se encuentre detrás de un router, en ese caso bastaría con redirigir los puertos UDP que vayamos a utilizar y todo funcionaría igual.

Cada ruter tiene su red local  RT1  tiene la red 172.16.5.0/24  y  RT2  tiene la 172.16.6.0/24.

Las IP que asignaremos a los interfaces de la VPN son  192.168.0.1  y 192.168.0.2.

Las reglas en iptables las definiremos al final.

Instalamos el repositorio rpmforge de donde podremos instalar el paquete openvpn

# rpm -Uvh http://rpmforge.sw.be/redhat/el5/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm

Instalamos el paquete en los dos servidores

          # yum -y  install openvpn

Creamos el directorio donde guardaremos los logs

# mkdir /var/log/openvpn

Creamos el archivo de configuración del servidor  RT1  en  /etc/openvpn/vpn_rt1rt2.conf

 dev tun0
 ifconfig 192.168.0.1  192.168.0.2
 secret /etc/openvpn/vpn_rt1rt2.key
 local 192.168.1.254
 port 11111
 comp-lzo
 keepalive 10 60
 ping-timer-rem
 persist-tun
 persist-key
 user openvpn
 group openvpn
 daemon
 log /var/log/openvpn/vpn_rt1rt2.log
 

Ahora generamos la clave :

# openvpn --genkey --secret /etc/openvpn/vpn_rt1rt2.key

Y el resultado será como el siguiente :

 #
 # 2048 bit OpenVPN static key
 #
 -----BEGIN OpenVPN Static key V1-----
 d754f32b6b2187c5f89d39099b621ff5
 24525ffe97b2bec51863f48f3b2a76dd
 a928568447c2380f5ae88d117c3db3a1
 84a8765b7465c26d7d148eeb74a95b1c
 954ec4dc07a8e6b83c2689836ae67163
 ec72cac97482313e23afe6c5607de22e
 37cb562b96158360ca33abe0a6803fd3
 8cde7176c700be774b1515fbf66cde82
 86fb66e992e718d586220200c9304d04
 a864a0d0b76b550ce8c9b9cac2397887
 c737862dd65e7e5df3c363496f72283b
 d8e825e637c7e5492182c3fb5838326d
 a648cabfa91320c98b497bdd23b5b8fc
 8369725793da557ec1aa1b06b9d9ddac
 fb1e1aeeb59ad64aa0485fff499cb6c6
 71c606d5f203b1a1ed5057cc48ab3552
 -----END OpenVPN Static key V1-----

Ahora ya tenemos una parte del servidor de VPN,  vamos a crear la configuración del cliente. En  RT2 creamos el archivo /etc/openvpn/vpn_rt2rt1.conf  ( en el nombre del archivo, siempre indico primero el nombre del equipo que estoy configurando, de esta forma no tengo dudas sobre el servidor en el que estoy trabajando )

 dev tun0
 ifconfig 192.168.0.2  192.168.0.1
 secret /etc/openvpn/vpn_rt2rt1.key
 remote 192.168.1.254
 port 11111
 comp-lzo
 keepalive 10 60
 ping-timer-rem
 persist-tun
 persist-key
 user openvpn
 group openvpn
 daemon
 log /var/log/openvpn/vpn_rt2rt1.log

Las diferencias entre los dos archivos son :

  • ifconfig :  primero se indica la IP local y después la remota
  • En el servidor se indica la directiva  local y en el cliente la directiva  remote

El archivo con la clave secreta es el mismo en ambos servidores.  Por lo que habrá que enviarlo de uno a otro de forma segura.

En RT1 hay que aceptar las conexiones para el puerto 11111,  permitir conexiones entrantes desde y hacia la red remota.

 iptables -A INPUT -p udp --destination-port 11111 -j ACCEPT
 iptables -A FORWARD -s 192.168.0.2 -j ACCEPT

Además hay que indicar al sistema las rutas para poder llegar a la ruta remota.  Si añadimos la ruta al archivo /etc/rc.local  nos aseguraremos que incluso reiniciando el sistema, no se pierdan las rutas.

# route add -net 172.16.6.0/24 gw 192.168.0.1

Hay que tener mucho cuidado si se para ( o paramos el servicio openvpn ), ya que al dejar de estar disponible el interface tun0 la ruta desaparecerá.  Y aunque volvamos a iniciar el servicio, es necesario añadir la ruta de nuevo.

La configuración de Iptables  necesaria en RT2  es la siguiente :

 iptables -A FORWARD -s 192.168.0.1 -j ACCEPT
 iptables -A FORWARD -s 172.16.6.0/24 -d 172.16.5.0/24 -j ACCEPT
 iptables -t nat -A POSTROUTING -s 172.16.6.0/24 -d 172.16.5.0/24 -j MASQUERADE

Y se añade la ruta en /etc/rc.local

# route add -net 172.16.5.0/24 gw 192.168.0.2

Ahora reiniciamos los servicios y comprobamos los logs en ambos servidores :

En RT1 tenemos el siguiente log ( en /var/log/openvpn/ ):

 Tue Jul  5 17:59:40 2011 LZO compression initialized
 Tue Jul  5 17:59:40 2011 TUN/TAP device tun0 opened
 Tue Jul  5 17:59:40 2011 /sbin/ip link set dev tun0 up mtu 1500
 Tue Jul  5 17:59:40 2011 /sbin/ip addr add dev tun0 local 192.168.0.1 peer 192.168.0.2
 Tue Jul  5 17:59:40 2011 GID set to openvpn
 Tue Jul  5 17:59:40 2011 UID set to openvpn
 Tue Jul  5 17:59:40 2011 UDPv4 link local (bound): 192.168.1.254:11111
 Tue Jul  5 17:59:40 2011 UDPv4 link remote: [undef]
 Tue Jul  5 17:59:44 2011 Peer Connection Initiated with 192.168.1.253:11111
 Tue Jul  5 17:59:44 2011 Initialization Sequence Completed

Y en RT2 :

 Tue Jul  5 18:00:02 2011 LZO compression initialized
 Tue Jul  5 18:00:02 2011 TUN/TAP device tun1 opened
 Tue Jul  5 18:00:02 2011 /sbin/ip link set dev tun1 up mtu 1500
 Tue Jul  5 18:00:02 2011 /sbin/ip addr add dev tun1 local 192.168.0.2 peer 192.168.0.1
 Tue Jul  5 18:00:02 2011 GID set to openvpn
 Tue Jul  5 18:00:02 2011 UID set to openvpn
 Tue Jul  5 18:00:02 2011 UDPv4 link local (bound): [undef]:11111
 Tue Jul  5 18:00:02 2011 UDPv4 link remote: 192.168.1.254:11111
 Tue Jul  5 18:00:11 2011 Peer Connection Initiated with 192.168.1.254:11111
 Tue Jul  5 18:00:12 2011 Initialization Sequence Completed

Ahora podemos comprobar que la conexión VPN  funciona lanzando un ping desde uno de los router al interface interno del otro.

Para comprobar el camino que siguen los paquetes podemos utilizar herramientas como iptraf

Los paquetes que viajen por la VPN irán encapsulados en el puerto 11111 UDP como hemos definido en el archivo de configuración

Cómo montar un servidor iSCSI

Para montar un servidor iSCSI utlizaremos una máquina virtual con CentOS y una máquina física con Fedora 14.   La IP del servidor es 192.168.1.201.

Primero en el servidor hay que instalar las dependencias y el target iSCSI :

# yum install kernel-devel openssl-devel gcc rpm-build

Descargarmos el target desde   aquí

# tar xvzf iscsitarget-1.4.20.2.tar.gz
# cd iscsitarget-1.4.20.2.tar.gz
# ./configure && make && make install

Cada vez que se instale un nuevo kernel es necesario volver a recompilar el target iSCSI  :(

Ahora editamos el archivo /etc/iet/initiators.allow

iqn.2011-02.com-mydomain:centos01 192.168.1.0/24

Esta notación es IQN ( iscsi qualified name ) y la convención que he utilizado es :

iqn. año – mes . dominio : volumen  red permitida

Y ahora editamos el archivo /etc/iet/initiators.deny

ALL:ALL

Ya sólo nos queda hacer la configuración del target, añadimos al final de /etc/iet/ietd.conf

Target iqn.2011-02.com-mydomain:centos01
IncomingUser iscsiuser 123456789012
OutgoingUser iscsiuser 123456789012
Lun 0 Path=/mnt/iscsi/LUN0,Type=fileio,IOMode=wb
Alias iSCSI
ImmediateData Yes
MaxConnections 10
MaxOutstandingR2T 10
InitialR2T Yes

Y creamos el archivo /mnt/iscsi/LUN0

# dd if=/dev/zero of=/mnt/iscsi/LUN0 bs=1M count=512

En mi caso tengo un disco SCSI de 512 Mb montado en /mnt/iscsi

También nos tendremos que asegurar que el servicio iscsi-target está activo y que el puerto tcp/3260 está abierto.

Ahora en el equipo cliente instalamos los paquetes necesarios

# yum install iscsi-initiator-utils

Añadimos la siguiente línea al archivo /etc/iscsi/initiatorname.iscsi

InitiatorName=iqn.2011-02.com-mydomain:centos016

Y la siguiente configuración a /etc/iscsi/iscsid.conf

node.session.auth.username = iscsiuser
node.session.auth.password = 123456789012
discovery.sendtargets.auth.username = iscsiuser
discovery.sendtargets.auth.password = 123456789012

Una vez con esta configuración vamos a ‘descubrir’ el servidor iSCSI desde el cliente :

# iscsiadm -m discovery -t st -p 192.168.1.201

Y obtenemos como resultado :

192.168.1.201:3260,1 iqn.2011-02.com-mydomain:centos01

Y ahora nos conectamos al servidor :

# iscsiadm -m node -p 192.168.1.201  -T iqn.2011-02.com-mydomain:centos01 –login

Obtenemos la respuesta :

Logging in to [iface: default, target: iqn.2011-02.com-mydomain:centos01, portal: 192.168.1.201,3260]
Login to [iface: default, target: iqn.2011-02.com-mydomain:centos01, portal: 192.168.1.201,3260] successful.

Y en /var/log/messages podemos ver :

kernel: [  180.278207] scsi7 : iSCSI Initiator over TCP/IP
kernel: [  181.322554] scsi 7:0:0:0: Direct-Access     IET      VIRTUAL-DISK     0    PQ: 0 ANSI: 4
kernel: [  181.324758] sd 7:0:0:0: [sdd] 989832 512-byte logical blocks: (506 MB/483 MiB)
kernel: [  181.325426] sd 7:0:0:0: [sdd] Write Protect is off
kernel: [  181.326587] sd 7:0:0:0: [sdd] Write cache: enabled, read cache: enabled, doesn’t support DPO or FUA
kernel: [  181.328275] sd 7:0:0:0: Attached scsi generic sg4 type 0
kernel: [  181.331055]  sdd:
kernel: [  181.334002] sd 7:0:0:0: [sdd] Attached SCSI disk
iscsid: Connection1:0 to [target: iqn.2011-02.com-mydomain:centos01, portal: 192.168.1.201,3260] through [iface: default] is operational now

Si miramos los discos duros de nuestro equipo vemos lo siguiente :

# fdisk -l 

Disk /dev/sdd: 506 MB, 506793984 bytes
16 heads, 61 sectors/track, 1014 cylinders, total 989832 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x6c58bb07

Device Boot      Start         End      Blocks   Id  System

Así que ahora ( y como es el primer uso )  tenemos que crear una partición y darle formato.
Montamos la nueva partición :

# mount /dev/sdd1 /mnt/iscsi 

# df -h

/dev/sdd1             468M   11M  433M   3% /mnt/iscsi

Y ya podemos trabajar con ella …. pero si queremos que se monte al iniciar el sistema tenemso que añadir la siguiente línea a /etc/fstab

/dev/sdd1               /mnt/iscsi              ext3    _netdev         0 0

Con esto ya tenemos funcionando completamente nuestro servidor y cliente iSCSI

Error al iniciar squid

Cuando instalas squid en CentOS / RedHat / Fedora y lo inicias ( si no has cambiado la configuración ) obtienes el siguiente error :

init_cache_dir /var/spool/squid… /etc/init.d/squid: line 62: 21407 Aborted                 $SQUID -z -F -D >> /var/log/squid/squid.out 2>&1
Starting squid: /etc/init.d/squid: line 42: 21408 Aborted                 $SQUID $SQUID_OPTS >> /var/log/squid/squid.out 2>&1
[FAILED]

Lo que te hace pensar que el paquete está roto o bien que tienes algún problema en las librerías de tu sistema …  pero sólo es necesario añadir la línea

visible_hostname  nombre-de-mi-servidor

al archivo /etc/squid/squid.conf