MLDonkey chrooted en OpenBSD

mldonkey_server
Ya había escrito una anotación hablando de MLDonkey en OpenBSD, pero creo haberla mejorado. El problema que tuve con aquella versión eran los continuos reinicios y la instestabilidad del servidor, sin embargo parece haberse resuelto. El problema era el límite de archivos abiertos por usuario que viene impuesto en OpenBSD (ulimit(2)). De todos modos intentándolo una segunda vez me doy cuenta de que ahora mldonkey (packages y ports) requiere X para funcionar y no estoy dispuesto a pasar por ahí, se reunen motivos suficientes como para una compilación desde su código fuente. Aprovechando la conjetura vamos a enjaularlo con chroot y así todo quedará más seguro :). Nota: Hans van Leeuwen ha preparado un binario que podemos descargar desde aquí , preparado para desempaquetar en el entorno chroot, así ahorramos el proceso de compilación (más información en http://hanz.nl/p/showdoc&doc;_key=2).

Primeramente instalamos chrootuid, el cual se encargará de hacer más sencilla la tarea de ejecutar un servicio de red en un entorno restringido y con permisos limitados:
# pkg_add chrootuid-1.3.tgz
Una vez hecho esto, bajamos y desempaquetamos los binarios estáticos de mldonkey-2.7.0:
# wget http://hanz.nl/download/mldonkey-2.7.0.static.i386-OpenBSD.tar.gz
# tar xfvvz mldonkey-2.7.0.static.i386-OpenBSD.tar.gz
Ahora preparamos el entorno chroot con los directorios/archivos necesarios, dispositivos especiales... todo en su sitio:
# mkdir /var/mldonkey
# cd /var/mldonkey
# mv mldonkey-distrib-2.7.0/ core
# ls
core                                            mldonkey-2.7.0.static.i386-OpenBSD.tar.gz
# mkdir /var/mldonkey/src
# mv mldonkey-2.7.0.static.i386-OpenBSD.tar.gz src/
# mkdir /var/mldonkey/etc
# mkdir /var/mldonkey/dev
# mknod -m 666 /var/mldonkey/dev/null c 2 2
# mknod -m 644 /var/mldonkey/dev/urandom c 45 2
# cp /etc/resolv.conf /var/mldonkey/etc/
También es necesario usuario/grupo para ejecutar el demonio, con sus permisos correspondientes
# groupadd _mldonkey
# useradd -g _mldonkey -d  /var/mldonkey/ -s /bin/sh
sh    sha1
# useradd -g _mldonkey -d  /var/mldonkey/ -s /bin/sh _mldonkey
# chown -R _mldonkey:_mldonkey /var/mldonkey/
Y para finalizar, ejecutamos mlnet (el demonio) dentro del chroot con su usuario correspondiente:
# /usr/local/sbin/chrootuid /var/mldonkey/ _mldonkey core/mlnet -stdout
2006/01/09 09:41:55 Starting MLDonkey 2.7.0 ...
2006/01/09 09:41:55 Language EN, locale ASCII
2006/01/09 09:41:55 MLDonkey is working in /root/.mldonkey
2006/01/09 09:41:55 [DNS] Resolving [bromo.enlugo.com] ...
2006/01/09 09:41:56 [DNS] Resolving [www.mldonkey.net] ...
2006/01/09 09:41:56 [cCO] Options correctly saved
2006/01/09 09:41:56 Check http://www.mldonkey.net/ for updates
2006/01/09 09:41:56 enabling networks: Donkey BitTorrent FileTP
2006/01/09 09:41:56 disabled networks: Fasttrack G2 Gnutella
2006/01/09 09:41:56 [EDK] Updating options to version 1
2006/01/09 09:41:57 To command: telnet 127.0.0.1 4000
2006/01/09 09:41:57 Or with browser: http://127.0.0.1:4080
2006/01/09 09:41:57 For a GUI check out http://sancho-gui.sourceforge.net
2006/01/09 09:41:57 Connect to IP 127.0.0.1, port 4001
2006/01/09 09:41:57 If you connect from a remote machine adjust allowed_ips
2006/01/09 09:41:57 [cCO] Options correctly saved
2006/01/09 09:41:57 Core started
...
Ya tenemos mldonkey funcionando, pero ojo con pf, porque mlnet necesita tráfico en algunos puertos dependiendo de los servidores a los que nos vayamos a conectar: ml_tcp="{ 4000, 4010, 4080, 4661, 4662, 9512 }" ml_udp="{ 53, 4665, 4672, 161, 199, 9512, 6667 }" ml_range="{ 6881:6999 }" ... pass in log quick on $ext_if inet proto tcp from any to any port $ml_tcp flags S/SA keep state pass in log quick on $ext_if inet proto tcp from any to any port $ml_range flags S/SA keep state pass in log quick on $ext_if inet proto udp from any to any port $ml_udp keep state De todas formas podemos encontrar más información aquí y aquí. Como todos los servicios que instalamos, deben tener su entrada propia en rc.local: # MlDonkey if [ -x /var/mldonkey/core/mlnet ]; then echo -n ' mldonkey'; /usr/local/sbin/chrootuid /var/mldonkey/ _mldonkey core/mlnet & > /dev/null fi Para resolver el problema que anteriormente he citado sobre el nºde archivos abiertos por el usuario podemos utilizar ulimit instantaneamente o configurarlo permanentemente en login.conf. :openfiles-cur=1024:\ Y el resto ya lo sabeis de la anterior nota:
# telnet localhost 4000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Welcome to MLDonkey 2.7.0
Welcome on mldonkey command-line

Use ? for help

> add_user admin ****
Password changed

> auth admin ****
Full access enabled

> set allowed_ips "127.0.0.1 192.168.0.255"
option allowed_ips value changed

> save
options and sources saved
> q
#
Estoy contento de poder tener mldonkey en un entorno seguro y sin preocupaciones. Ahora toca disfrutar de todo esto ;).

Actualización: Hans van Leeuwen ha actualizado el binario a la versión 2.7.2, podeis encontrar más información en su howto.
openbsd sysadmin

About the author

Óscar
has doubledaddy super powers, father of Hugo and Nico, husband of Marta, *nix user, Djangonaut and open source passionate.