Skip to main content

Modificar las conexiones máximas por IP de dovecot

Mi cliente de email a veces se quejaba de que no podía conectar al servidor. El caso es que la configuración de la cuenta de email era correcta, porque normalmente accedía sin problemas. Pues mirando en /var/log/maillog he visto que aparecía este mensaje:

dovecot: imap-login: Maximum number of connections from user+IP exceeded

He encontrado la solución al problema, sólo es necesario cambiar la configuracíon de la variable mail_max_userip_connections e incrementarlo de manera que permita más conexiones simultáneas. Si el límite de conexiones es muy bajo, es muy facil llegar a él, ya que por cada cuenta de email que tengamos en el servidor, y por cada “carpeta” (Inbox, Spam, Trash, etc..) realiza una conexión individual. Esto optimiza la descarga de emails, pero también debe realizar muchas más conexiones.

Para cambiar este parámetro, editamos el fichero de configuración

nano /etc/dovecot/conf.d/imap.conf

y añadimos un limite de 50 conexiones por IP (o las que necesites)

protocol imap {
   mail_plugins = $mail_plugins autocreate
   mail_max_userip_connections = 50
}

Sólo queda reiniciar el servicio

systemctl restart dovecot.service

Y ya está!

Registrar información más detallada en el log de exim

Exim va escribiendo en un archivo de log todas las peticiones de conexión que se realizan al servidor. Quedan registradas las IP’s, emails, y las sesiones que se crean y se cierran, así como si la conexión ha sido correcta o ha habido algún error. En general, es información más que suficiente. Aún así hay algo que no se guarda en el log y que puede sernos útil. En concreto, vamos a ver cómo guardar también un registro de los emails eliminados, o movidos de carpeta. Vamos allá:

El fichero en el que queda registro de toda actividad, en mi caso es /var/log/maillog y tiene una pinta parecida a esta:

Sep 11 11:37:06 servername dovecot: imap-login: Login: user=<user@example.com>, method=PLAIN, rip=123.456.789.123, lip=123.456.789.123, mpid=9007, TLS, session=<QVpx3dfsC1DU>

Sep 11 08:25:03 servername dovecot: pop3(user@example.com): Disconnected: Logged out top=0/0, retr=2/41769, del=1/47, size=15946098, bytes=50/43374

Sep 11 08:45:10 servername dovecot: imap(user@example.com): Logged out in=409, out=1405, bytes=409/1405

En la primera linea, el usuario se ha conectado y muestra la IP remota (rip), la IP local (lip), así como el tipo de conexión (TLS) y el identificador de la sesión al final. También nos indica que ha sido una conexión usando imap.

En la segunda línea, el usuario se ha desconectado de su sesión, su conexión era de tipo pop3 y hay un parámetro, que he resaltado en negrita que dice del=1/47. Esto nos indica que durante la sesión, ese usuario ha borrado 1 mensaje de los 47.

En la tercera linea, también se han desconectado de una sesión, en este caso imap, pero ahí sólo aparece los bytes que se han recibido/enviado (in/out) durante la conexión.

Para detallar más el log, hay que activar el plugin MailLog de exim. Esto nos dará detalles sobre los emails eliminados, movidos de una carpeta a otra, ¡perfecto!

Lo primero es editar el fichero de configuración de devecot

nano /etc/dovecot/dovecot.conf

Y buscaremos la linea que contiene mail_plugins, y añadiremos los plugins mail_log notify. En micaso quedará así

mail_plugins = quota quota_clone mail_log notify

Luego, buscaremos dentro de ese mismo fichero el apartado de Plugin settings y deberemos escribir estas lineas:

##
## Plugin settings
##

plugin {

  # Events to log. Defined in src/plugins/mail-log/mail-log-plugin.c - also available: flag_change save mailbox_create
  mail_log_events = delete undelete expunge copy mailbox_delete mailbox_rename

  # Also available: Defined in src/plugins/mail-log/mail-log-plugin.c - flags vsize from subject
  mail_log_fields = uid box msgid size
  (...)

Ya está, sólo tendremos que reiniciar el servicio

/etc/init.d/dovecot restart

Ahora, si borramos o movemos un email dentro de nuestro cliente de correo, quedará detallado en el log. Se verá algo así:

Sep 13 11:46:02 servername dovecot: imap(user@example.com): copy from INBOX: box=INBOX.Trash, uid=1433, msgid=<abc.123@example.com>, size=3143

Sep 13 11:46:02 servername dovecot: imap(user@example.com): expunge: box=INBOX, uid=4750, msgid=<abc.123@example.com>, size=3143

Sep 13 11:46:16 servername dovecot: imap(user@example.com): delete: box=INBOX.Trash, uid=1433, msgid=<abc.123@example.com>, size=3143

Eso sí, contad conque el log aumentará considerablemente de tamaño cada día.

Un saludo!

Comandos útiles para gestionar exim desde el terminal

Acceder por ssh a un servidor remoto para comprobar el estado de los emails es bastante habitual. Exim, es el MTA más común para servidores linux, y es con el que me encuentro a diario. Aquí dejo una lista de comandos que me han resultado útiles en más de una ocasión para el mantenimiento de los servidores.

Mostrar el número de emails en cola

exim -bpc

Eliminar todos los emails en cola

exim -bp | awk '/^ *[0-9]+[mhd]/{print "exim -Mrm " $3}' | bash

Mostrar los emails en cola

exim -bp

Se mostrará algo parecido a esto

46h  1.7K 1bi4YL-000123-AB <> *** frozen ***
          root@your-server.net

43h  1.7K 1bi7MY-000123-AB <> *** frozen ***
          root@your-server.net

(...)

Resumen de emails en cola

exim -bp | exiqsumm

Se mostrará

Count  Volume  Oldest  Newest  Domain
-----  ------  ------  ------  ------

   16    27KB     46h     82m  your-server.net
---------------------------------------------------------------
   16    27KB     46h     82m  TOTAL

Actividad actual de exim

exiwhat
783 daemon: -q1h, listening for SMTP on port xxx (IPv6 and IPv4) port xxx (IPv6 and IPv4) port xxx (IPv6 and IPv4) and for SMTPS on port xxx (IPv6 and IPv4)

Mostrar configuración de exim

exim -bP

Mostrar emails enviados desde remitente

exiqgrep -f usuario@dominio.tld

Mostrar emails para un destinatario

exiqgrep -r usuario@dominio.tld

Mostrar emails en cola más antiguos de n segundos (en este ejemplo 1h)

exiqgrep -o 3600

Mostrar emails en cola creados hace menos de n segundos (en este ejemplo 1h)

exiqgrep -y 3600

Comprobar la ruta de una direccion de email

exim -bt usuario@dominio.tld
test@gmail.com
  router = dnslookup, transport = remote_smtp
  host gmail-smtp-in.l.google.com      [2a00:1450:400c:c08::1a] MX=5
  host gmail-smtp-in.l.google.com      [74.125.140.27]          MX=5
  host alt1.gmail-smtp-in.l.google.com [2a00:1450:4010:c03::1a] MX=10
  host alt1.gmail-smtp-in.l.google.com [209.85.233.27]          MX=10
  host alt2.gmail-smtp-in.l.google.com [2404:6800:4003:c01::1a] MX=20
  host alt2.gmail-smtp-in.l.google.com [74.125.130.27]          MX=20
  host alt3.gmail-smtp-in.l.google.com [2404:6800:4008:c03::1a] MX=30
  host alt3.gmail-smtp-in.l.google.com [74.125.203.27]          MX=30
  host alt4.gmail-smtp-in.l.google.com [2404:6800:4008:c01::1a] MX=40
  host alt4.gmail-smtp-in.l.google.com [173.194.72.26]          MX=40

Procesar los emails en cola

exim -q -v

Eliminar un email concreto de la cola

exim -Mrm <id_email>
Message 1bi4YL-000123-AB has been removed

Congelar un email (no se enviará)

exim -Mf <id_email>

Procesar un email tanto si está congelado como si no (se enviará)

exim -M <id_email>

Forzar el fallo de un email y retornar el estado “cancelado por administrador”

exim -Mg <id_email>

Eliminar todos los emails congelados

exiqgrep -z -i | xargs exim -Mrm
Message 1bi4YL-000123-AB has been removed
(...)
Message 1bi7MY-000123-AB has been removed

Eliminar emails más antiguos de n segundos (en este ejemplo 1h)

exiqgrep -o 3600 -i | xargs exim -Mrm

Congelar todos los emails de un remitente

exiqgrep -i -f usuario@dominio.tld | xargs exim -Mf

Mostrar las cabeceras de un email

exim -Mvh <id_email>

Mostrar el contenido del email

exim -Mvb <id_email>

Mostrar el log de un email

exim -Mvl <id_email>

Añadir un destinatario a un email

exim -Mar <id_email> usuario@dominio.tld [ <usuario2@dominio.tld> [...] ]

Modificar el remitente de un email

exim -Mes <id_email> usuario@dominio.tld

Parar exim (diferentes maneras según tu sistema operativo)

systemctl stop eximd.service
service exim stop
/etc/init.d/exim stop

Iniciar exim (según tu sistema operativo)

systemctl start eximd.service
service exim start
/etc/init.d/exim start

Reiniciar exim (según tu sistema operativo)

systemctl restart eximd.service
service exim restart
/etc/init.d/exim restart

Comprobar el estado de exim (según tu sistema operativo)

systemctl status eximd.service
service exim status
/etc/init.d/exim status

Localizar enlaces rotos con wget

Ahí van un par de comandos que te ayudarán a localizar los enlaces rotos de una web tales como imágenes que ya no existen, enlaces que nos llevan a un error 404, o archivos css que no están donde deberían. Sólo haremos uso del comando wget, para identificarlos de la siguiente manera:

wget --spider -r -l 5 -nd -nv -w 5 -o output.log http://example.com

Los parámetros del comando hacen lo siguiente:

  • –spider , no almacena nada, tan sólo actúa como si de un bot de Google se tratara.
  • -r , lo hace de manera recursiva, es decir, de cada página, buscará los links que existan para seguirlos y continuar
  • -l 5 , esto seguirá recursivamente hasta 5 niveles de links (podemos omitirlo, wget por defecto usa -l 5)
  • -nd , no creará los directorios en local al escaner la web
  • -nv , hará que no muestre nada por pantalla (lo estamos almacenando en output.log)
  • -w 5 , hará que wget espere 5 segundos entre cada petición, útil si quieres que tu servidor web no quede saturado durante el proceso
  • -o output.log , guardará todo el registro de la actividad en un fichero llamado output.log
  • http://example.com , la web que queremos auditar

Una vez haya terminado wget, podremos abrir el fichero ouput.log, para ver los resultados. Para localizar los enlaces rotos fácilmente, podemos usar grep de la siguiente manera:

grep "broken link!" -B1 output.log

Las opciones que aquí tenemos son:

  • “broken link!” , la cadena de texto a buscar, en este caso filtramos por los enlaces rotos. Si usas wget en otro idioma, quizás necesitarás filtrar por otra palabra.
  • -B1 , mostrará la linea que contiene la cadena buscada y justo la anterior (Before 1)
  • output.log, el fichero en el que vamos realizar la búsqueda

Con este sencillo proceso, podremos obtener un listado de enlaces rotos que nos ayudará a localizar problemas en cualquier web.

Apache, MySQL, PHP y otros imprescindibles para mi servidor CentOS 6.6

Acabo de instalar CentOS 6.6 en mi servidor, y ahora ¿qué?

Primer login

Tras instalar CentOS 6.6 minimal, nos encontramos con un terminal de login sin entorno gráfico. Sólo tenemos un usuario (root) así que haremos login usando el password que hemos indicado durante la instalación.

Conexión a internet

Una vez dentro, podemos comprobar que no tenemos conexión a internet, ni con el cable de red contectado:

[root@server ~]# ping www.google.com
ping: unknown host www.google.com

Veamos si están detectadas las tarjetas ethernet, antes de continuar:

[root@server ~]# ifconfig -a
eth0  Link encap:Ethernet HWaddr 12:34:56:67:89:01 
      BROADCAST MULTICAST MTU:1500 Metric:1
      RX packets:0 errors:0 dropped:0 overruns:0 frame:0
      TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
      Interrupt: 16

eth1  Link encap:Ethernet HWaddr 12:34:56:67:89:01 
      BROADCAST MULTICAST MTU:1500 Metric:1
      RX packets:0 errors:0 dropped:0 overruns:0 frame:0
      TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
      Interrupt: 17

lo    Link encap:Local Loopback 
      inet addr:127.0.0.1 Mask:255.0.0.0
      inet6 addr: ::1/128 Scope:Host
      UP LOOPBACK RUNNING MTU:65536 Metric:1
      RX packets:12 errors:0 dropped:0 overruns:0 frame:0
      TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:836 (836.0 b) TX bytes:836 (836.0 b)

Perfecto, el sistema nos muestra todas las intefaces disponibles. En este caso eth0 y eth1, así como localhost. Yo he conectado el cable RJ45 en el interfaz eth0, así que vamos a intentar autoconfigurarlo mediante DCHP. Tan sencillo como lanzar dhclient.

[root@server ~]# dhclient
... cuando termine, tras algunos segundos ...
[root@server ~]# ifconfig eth0
eth0   Link encap:Ethernet HWaddr 12:34:56:67:89:01 
       inet addr:192.168.1.123 Bcast:192.168.1.255 Mask:255.255.255.0
        inet6 addr: 0123::4567:89ab:cdef:0112/64 Scope:Link
        UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
        RX packets:153 errors:0 dropped:0 overruns:0 frame:0
        TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:1000 
        RX bytes:47802 (46.6 KiB) TX bytes:1312 (1.2 KiB)
       Interrupt: 16

Actualizar el sistema

Perfecto, siguiente paso. Vamos a actualizar el sistema. Aunque acabo de instalarlo, seguramente haya actualizaciones de seguridad disponibles, así que vamos a ello.

[root@server ~]# yum -y update

... tras algunas comprobaciones nos hará un resumen de las actualizaciones disponibles ...

Transaction Summary
==========================================
Install        1 Package(s)
Upgrade       51 Package(s)

Total download size: 83 M

Escribimos y para proceder descargar e instalar las actualizaciones disponibles. Es posible que algún paquete requiera de alguna interacción, así que mejor estar delante del monitor.

Instalamos Gnome

Si, es verdad, un servidor no requiere un entorno gráfico, y aunque siempre entro mediante SSH, me resulta muy cómodo tenerlo Gnome listo en caso de necesitar usarlo.

El siguiente comando instalará todo lo necesario para disponer de X Window y Gnome

[root@server ~]# yum -y groupinstall "Desktop" "Desktop Platform" "X Window System" "Fonts"

... tras algunas comprobaciones comenzará la instalación ...
Transaction Summary
==========================================
Install 295 Package(s)

Total download size: 912 M

Esto deberá descargar 1GB aproximadamente. Usando el parámetro -y forzmos a responder siempre “si” en caso de pregunta durante la instalación.

Cuando acabe, tendremos que configurarlo para que se inicie en modo gráfico cada vez que arranque (si queremos). Hacer esto es tan sencillo como modificar la línea “id:3:initdefault:” por “id:5:initdefault:” en el fichero inittab:

[root@server ~]# vi /etc/inittab

Si no te gusta vi, puedes descargar nano: yum -y install nano

Ahora sólo queda reiniciar el sistema usando el comando

[root@server ~]# init 6

Al reiniciar, entraremos en un asistente, en el que nos guiará para crear usuarios y configurar la fecha del sistema/NTP de manera muy sencilla.

Vaya, otra vez sin conexión a internet?

Pues sí, debemos lanzar dhclient cada vez que queramos autoconfigurar la red. Aunque, ya que hemos instalado Gnome, configurar esto para que se ejecute al inicio de manera automática es muy sencillo:

  1. Editamos las conexiones de red,
  2. Seleccionamos eth0 (o el que necesites)
  3. Seleccionames el checkbox de conectar automáticamente.

eth0-auto

Para que nuestro servidor se convierta de verdad un servidor,deberemos instalar Apache, MySQL y PHP.

Instalar Apache

Facilísimo, sólo es necesario ejecutar:

[root@server ~]# yum install httpd

Ya está instalado! Ahora sólo tenemos que levantar el servicio:

[root@server ~]#  service httpd start

Y para comprobar que funciona correctamente, podemos instalar y ejecutar nuestro navegador favorito y comprobar la web por defecto:

[root@server ~]# yum -y install firefox && firefox 127.0.0.1

apache-installed

Instalando MySQL

Instalar MySQL también será muy sencillo. El siguiente comando instala y levanta el servicio MySQL.

[root@server ~]# yum -y install mysql-server && service mysqld start

Por seguridad, vamos a establecer una contraseña de root para MySQL y a eliminar usuarios anónimos:

[root@server ~]# /usr/bin/mysql_secure_installation

... tras responder a unas sencillas preguntas ... 

All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!

Instalando PHP

Instalar PHP es igual de sencillo que instalar Apache y MySQL.

[root@server ~]# yum install -y php php-mysql pgp-gd php-mbstring

Deberemos reiniciar Apache, para que cargue PHP.

[root@server ~]# service httpd restart

Vamos a ver si ha funcionado. Crearemos un pequeño archivo PHP que nos mostrará información de la versión actual y la configuración.

[root@server ~]# echo "<?php phpinfo();" > /var/www/html/phpinfo.php && firefox 127.0.0.1/phpinfo.php

Si la página carga correctamente, ya está listo.

Configurar inicio automático de MySQL y Apache

Para que al reiniciar la máquina se inicie apache y mysql, deberemos ejecutar:

[root@server ~]# chkconfig httpd on && chkconfig mysqld on

Problemas que puedes encontrar

Problem: Funciona todo, pero no puedo acceder desde una máquina remota a la página de prueba de Apache.

Es probable que debas configurar iptables.

[root@server ~]# iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
[root@server ~]# /etc/init.d/iptables save

 

Problem: Necesito otra versión de PHP, la 5.3.3 que se incluye en CentOS 6.6 no me sirve.

Yo he usado los repositorios de Remi, siguiendo este tutorial: https://www.mojowill.com/geek/howto-install-php-5-4-5-5-or-5-6-on-centos-6-and-centos-7/

Otras aplicaciones que pueden resultar útiles

[root@server ~]# yum -y install gedit nano thunderbird gnome-disk-utility gnome-utils wget gcalctool evince libreoffice libreoffice-langpack-ca libreoffice-langpack-es libreoffice-langpack-en unzip zip p7zip transmission git-gui git rsync curl filezilla htop links nmap telnet 

Bibliografía

http://wiki.centos.org/FAQ/CentOS6

*ttp://www.sysads.co.uk/2014/01/installing-gnome-gui-centos-6-5/

https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-centos-6

http://stackoverflow.com/a/19569280

(gnome-ssh-askpass:3270): Gtk-WARNING **: cannot open display:

Más que un post, es una autonota, pero allá va.

Recientemente, tras installar un servidor con CentOS 6.6 y su entorno gráfico Gnome, me he encontrado con que al usar GIT para hacer un fetch de la última versión del repositorio, desde una conexión remota con SSH, lanza el siguiente error:

[root@SERVER html]# git fetch
(gnome-ssh-askpass:3270): Gtk-WARNING **: cannot open display:

Al parecer, al haber instalado Gnome, intenta lanzar la ventana de “introduzca password” del repositorio GIT, pero al estar conectado por SSH, no tengo entorno GTK. La solución es bien sencilla. Ejecutamos el siguiente comando y listo.

[root@SERVER html]# unset SSH_ASKPASS

Cada vez que iniciemos sesión, necesitaremos desactivar el SSH_ASKPASS, por lo que os recomiendo añadirlo en .bashrc para mayor comodidad.

Cómo configurar una impresora WiFi en Linux

En mi caso, voy a configurar una impresora Brother DCP-L2520DW, que es una impresora láser monocromo multifunción (con escáner incluido). La configuración para Linux Mint y Ubuntu son exactamente iguales, y probablemente también lo sea para cualquier otra distribución basada en Debian.

La información recopilada aquí, ha sido extraída de la web oficial de Brother, aunque también he tenido que recurir a otras varias fuentes para poder configurar el escáner vía WiFi. También doy por hecho que la impresora está correctamente conectada a la red inalámbrica y que es accesible desde los PCs.

Empezaremos instalando un par de paquetes del repositorio, que serán necesarios posteriormente:

sudo apt-get install ia32-libs sane-utils

Paso 1. Descargar los drivers.

En la web de Brother, podemos encontrar todos los drivers que necesitamos. En mi caso, pra el modelo DCP-L2520DW, he tenido que descargar desde aquí los siguientes elementos:

  1. Generic LPR printer driver (deb package)
  2. Generic CUPSwrapper printer driver (deb package)
  3. Scanner driver 64bit (deb package)

Los dos primeros, son para la impresora en sí, y el último nos permitirá acceder a escáner. Recuerda seleccionar correctamente tu plataforma para descargar el paquete correcto (deb, para distribuciones basadas en Debian y rpm para distribuciones basadas en RedHat, así como paquetes 64 o 32 bits).

Paso 2. Instalar los drivers.

Una vez descargados los tres paquetes (necesarios en mi caso) .deb, vamos a instalarlos. Para ello, hay que ejecutar los siguientes comandos en un terminal (recuerda que para realizar este paso es necesario tener privilegios de root)

dpkg -i --force-all brscan4-0.4.3-0.amd64.deb
dpkg -i --force-all brgenml1lpr-3.1.0-1.i386.deb
dpkg -i --force-all brgenml1cupswrapper-3.1.0-1.i386.deb

Esto instalará los tres paquetes. Podemos verificar la instalación de los tres con el siguiente comando:

dpkg -l  |  grep  Brother

El comando anterior debería mostrar una lista similar a la siguiente:

ii brgenml1cupswrapper 3.1.0-1  i386   Brother  BrGenML1 CUPS wrapper driver
 ii brgenml1lpr         3.1.0-1  i386   Brother  BrGenML1 LPR driver
 ii brscan4             0.4.3    amd64  Brother  Scanner Driver

 Paso 3. Configuración de impresora

Una vez instalado, deberemos editar el fichero /etc/printcap para adaptarlo a nuestra configuración, de la siguiente manera:

sudo nano /etc/printcap

Y buscaremos la línea que empieza con :lp. Esta línea (sólo para la configuración WiFi) debe ser eliminada, y en su lugar deberemos escribir lo siguiente:

:rm=xx.xx.xx.xx\
 :rp=lp\

Guardamos y salimos.

Ahora añadiremos la impresora al sistema. Para ello, podemos ir a la configuración de impresoras de Mint, en el Configuración del sistema, y configurar o añadir (si no aparece) una nueva impresora.

Los parámetros necesarios para que funcione son:

Si añades una nueva, el dispositivo tiene que ser de tipo:

LPD/LPR Host or Printer" or "AppSocket/HP JetDirect"

Device URI, en el que se debe escribir:

lpd://xx.xx.xx.xx/binary_p1

Guardamos y ya podemos hacer una prueba de impresión. Si todo ha ido bien, saldrá una bonita página de prueba.

Paso 4. Configuración de escáner

Ya tenemos casi todo listo, vayamos a configurar el escáner. Para ello, debemos tener instalado brsaneconfig4 que debería venir dentro del paquete instalado al inicio sane-utils.

Configurar el escáner es facil. Sólo hay que ejecutar:

brsaneconfig4 -a name=scanner model=DCP-L2520DW ip=xx.xx.xx.xx

Esto debería ser suficiente para que al abrir cualquier aplicación para escáner, (en mi caso, simple scan) detecte tu nuevo dispositivo.

Como nota, en los pasos en los que he escrito xx.xx.xx.xx, es necesario que sea sustituido por la IP de la impresora a configurar.

Este procedimiento, ha sido comprobado tanto en Linux Mint 17 Qiana, como en Ubuntu 14.x con la impresora Brother, aunque seguramente será muy similar en otros entornos con otras impresoras.

Próximo objetivo: Configurar la impresora en Android!

How to create a mountpoint trough SSH

For console addicted, accessing trough SSH to a server is a really common task. Under my point of view, usually console text editors like vi or nano are not the best option to work with a lot of files at the same time like we can do with any other graphic text editors.
So, I decided to make an internet search to try to find an application able to mount a SSH connection like a standard file system. The application is called sshfs, they didn’t think a lot to get the name 😛
In order to install it, if you use ubuntu, just click on sshfs or write the command below in a terminal:
pedro@pedro-laptop:~$ sudo apt-get install sshfs
Once installed, you only need this command to get it work:
pedro@pedro-laptop:~$ sshfs user@server.com:/my/directory /media/ssh
Where:
  • user, is the name of the SSH user,
  • server.com:, is the name of the server (colon is required)
  • /my/directory, is the remote directory you want to mount, and
  • /media/ssh, is the local directory where the mountpoint will be placed
That’s all, you can now open the directory /media/ssh like any other local directory and open files with your favourite text editor 🙂

Montar una unidad remota a través de SSH

Para los adictos a los terminales, acceder a través de SSH a cualquier servidor está a la orden del día. Hay que reconocer que en muchas ocasiones los editores como vi o nano, se quedan cortos a la hora de trabajar con diferentes ficheros a la vez, tal y como lo hacemos con cualquier otro editor gráfico.
Así que he rebuscado por internet, y he encontrado una aplicación capaz de montar una conexión SSH como si de un sistema de ficheros normal se tratase. La aplicación se llama sshfs, tampoco se han pensado demasiado el nombre 😛
Para instalarlo, si utilizas ubuntu, es tan sencillo como hacer clic en sshfs o escribir en un terminal lo siguiente:
pedro@pedro-laptop:~$ sudo apt-get install sshfs
Una vez instalado, sólo hay que lanzar el siguiente comando para usarlo:
pedro@pedro-laptop:~$ sshfs usuario@servidor.com:/mi/directorio /media/ssh
Donde:
  • usuario, es el nombre de usuario con el que entrar,
  • servidor.com:, es el dominio del servidor (los dos puntos son necesarios siempre)
  • /mi/directorio, es el directorio remoto que quieres montar
  • /media/ssh, es el directorio local donde se montará el sistema de archivos
Ahora ya podemos usar el directorio /media/ssh como si de un directorio local se tratase y abrir cualquier fichero con el editor que queramos 🙂

Fragmentación IP

La fragmentación IP es una técnica utilizada para dividir los datagramas IP en fragmentos de menor tamaño. Ésto es necesario ya que cuando los datagramas IP viajan de un lugar a otro, éstos pueden atravesar diferentes tipos de redes y el tamaño máximo -llamado MTU– de estos paquetes puede variar dependiendo del medio físico utilizado para la transmisión.

El valor máximo que técnicamente puede utilizarse para un datagrama IP es de 65536 bytes, aunque en la práctica se utilizan otros tamaños mucho más pequeños:

  • Ethernet: 1518 bytes (típicamente 1500 bytes).
  • PPPoE: 1492 bytes.
  • ATM: 8190 bytes.
  • FDDI: 4470 bytes.
  • PPP: 576 bytes.

Veamos cómo funciona esta técnica con más detalle. La cabecera IP, que suele tener un tamaño de 20 bytes, contendrá la siguiente información:

  • Identificador de fragmento. Cada Fragmento debe asociarse con un único identificador para que el reensamblaje en destino pueda realizarse correctamente.
  • Información sobre la posición en el paquete final.
  • Información sobre el tamaño de los datos que se transportan en el fragmento.
  • Cada fragmento debe contener el bit MF (More Fragments) para saber si el fragmento actual es el último o no.

Así que la figura de un paquete de máximo tamaño que no necesite fragmentación en una red típica Ethernet sería algo así:

Paquete de 1500 bytes
Paquete de 1500 bytes

Si sumamos la cabecera y los datos encapsulados, tenemos que en total hacen 1500 bytes, por lo que al viajar por una red Ethernet, no sería necesaria su fragmentación.

Los datos encapsulados pueden ser tanto un protocolo IP como TCP, UDP o ICMP. Veamos un ejemplo en el que se tenga que utilizar la fragmentación. Este es un ejemplo anormalmente grande, pero en el que podremos ver cómo se realiza el proceso de fragmentación. Se trata de una petición echo que pasa por una red Ethernet con MTU de 1500 bytes.

Proceso de fragmentación de un paquete de 4028 bytes
Proceso de fragmentación de un paquete de 4028 bytes

En el paquete original, la suma de las cabeceras y los datos ICMP suman 4028 bytes. Este paquete al ser transmitido en una red Ethernet deberá ser fragmentado, generandose así 3 paquetes de 1500 bytes o menos. Cada fragmento llevará obligatoriamente al menos la cabecera IP (necesaria para saber hacia dónde se dirige el fragmento), que en este caso ocupa 20 bytes, así que tendremos realmente 1480 bytes útiles.

El primer fragmento contendrá la Cabecera IP + la cabecera ICMP + la información restante para llegar a 1500 bytes, en este caso 1472 bytes. Puesto que es el primer fragmento, el valor de Offset valdrá 0 y el bit MF valdrá 1 ya que hay más paquetes.

El segundo fragmento contendrá la Cabecera IP + la información restante para llegar a 1500 bytes, en este caso 1480. Ahora el valor de Offset valdrá 1480, ya que es la posición que debe ocupar al ensamblar el fragmento (recordemos que el primer fragmento tenía 8+1472 = 1480). El bit MF valdrá 1 ya que no es el último paquete.

El tercer fragmento contendrá la Cabecera IP + la información restante, en este caso 1048 bytes (ya no hay más bytes). El valor de Offset valdrá 2960, ya que el primer y segundo fragmento ocupaban 1480 cada uno. El bit MF se establece a 0 porque es el último fragmento del paquete.

El campo Protocol sólo indica a qué tipo de protocolo corresponde el paquete original. ID fragmento indica un identificador que será igual para todos los fragmentos del paquete original, así se podrá reconstruir en destino sin confusión. El bit MF (more fragments) se establecerá a 1 siempre, excepto para el último paquete, que será 0. El Offset nos indica la posición que ocupa cada fragmento dentro del paquete original. El campo Tamaño, simplemente registra el tamaño del fragmento actual sin contar la Cabecera IP.

Una vez conocemos a grosso modo cómo funciona esto de la fragmentación, explicaré por encima, cómo un usuario malintencionado puede utilizar este procedimiento para realizar un ataque.

El ataque más conocido que explota la fragmentación IP se llama Teardrop. Este ataque usará información falseada en los fragmentos para poder confundir el reensamblaje en destino y colapsar así el sistema.

Imaginemos que tenemos un MTU de 512 bytes y un paquete que necesita ser dividido en N fragmentos y utilizamos los campos Tamaño y Offset de la siguiente manera:

Offset Tamaño
Fragmento 1 0 512
Fragmento 2 500 512
Fragmento N 10 100

Al reconstruir el paquete en destino se producirá un error de desbordamiento de buffer (buffer overrun), ya que el fragmento N apunta a un lugar en el que ya se había escrito previamente y obliga a sobreescribirse.

Otro ataque interesante es enviar cientos o miles de fragmentos manipulados con diferentes ID de fragmento contra la máquina que se desea atacar, de manera que agotemos los recursos de reensamblaje del equipo atacado; acabaremos colmando la pila en la que reconstruye estos paquetes, y no aceptará ninguno más, generando así un ataque de Denegación de Servicio (DoS).

Afortunadamente, a dia de hoy, este tipo de ataques no suelen ser efectivos. Los sistemas operativos vulnerables son Windows 3.1x, Windows 95, Windows NT y las versiones inferiores a Linux 2.0.32, así como la 2.1.63.

Otro día hablaré del famoso ping de la muerte! 🙂