lunes, 3 de diciembre de 2012

recoleción de dominio en un buzón


Se sabe poco sobre los orígenes de ese aborto de la naturaleza que es conocido por alguno como "recolección aPOP" o por otros como "DomainPOP" . Haciendo referencia al hecho de bajar todo el correo para un dominio de un pop remoto. La historia se remonta a un popular, potente y hermoso servidor de correo, para windows llamado MDeamon (pronunciado como "emodimons") creado por la compañía Alt-New Technolgy, muy conocido por su simple pero elegante cliente web, el World Client. Entre sus features, podemos ver el almacenamiento de TODO el correo de un dominio en un mismo buzón. Esto, sumado a que en cuba todo el software es gratis :D lo convirtió en la herramienta definitiva para las redes conmutadas.

Por otra parte, no todo se le impugna windows. Cuando aún el morro era de palo, ya citmatel usaba un  CuciPOP (vean que clase de nombre "Cubic Circles = CuCiPOP") para depositar el correo de sus clientes por lineas conmutadas; una clara implementación de aPOP. Esto resolvió ser la manera mas burda pero eficiente de resolver el problema de correo en lineas conmutadas.

Lo único que perturba este barato panorama, es el hecho de que si el correo no tiene un To: bien claro, se jode todo y te ves obligado a usar MDeamon, que en ese aspecto se saca todos los premios, porque su puesto, el es una de la principales implementaciones de este modelo. A menudo nos encontramos con que al
bajar el correo con fetchmail, uno o varios correos como los de las listas, no van a su destino, por el contrario, van al postmaster sin tener coincidencias de usuarios locales.

Hay quien esta acostumbrado a que el postmaster este LLENO de correos y eso le parece normal, cuando el buen funcionamiento de un servidor, se mide por el postmaster vacío.

Si un correo tiene un To: o un Cc: cuando fetchmail lo parsea (del infintivo "parsear"), entonces localiza una dirección de nuestro dominio basándose en que tiene el dominio en la configuración. Como le dijimos 'is * here' buscará cual nombre que este delante de lo que se parezca a nuestro dominio y lo entregara.

Pero: Qué pasa si el To: o el Cc: NO tienen una dirección de nuestro dominio?

Supongamos que el correo viene Bcc: (blink carbon copy) o que proviene de una lista. Donde el destino es la dirección de la lista. En ese caso los destinos se especifican en la orden RCPTO durante la sesión SMTP. Algunos servidores incluyen encabezados como: "Delivery-To","Envelope-To" o "X-Orignial-To" En mi opinión todos están de más, porque el Received: tiene esta información; pero bueno, podríamos decirle a fetchmail que ademas de esos, parsee encabezados Received:

Eso parecería una solución, el único problema es que no pincha :-P

Lo ideal sería un "algo" que parcee los Received uno a uno en busca de coincidencias locales. Por ejemplo, veamos el aspecto de un conveniente Received.

Received: from mx.jovenclub.cu (unknown [200.55.152.25]) by
mailserver.tudominio.cu (Postfix) with ESMTP id 6ADEC35055E
for <fulano@tudominio.cu>; Wed, 28 Nov 2012 15:44:53 -0500 (CST)

Es tan simple como detectar un Received: con nuestro dominio involucrado y ver que hay con el nombre de usuario. NO ENTIENDO por que carajo no funciona en fetchmail. El parametro include sería definitivamente un batazo si pinchara.

PERO!

Con este script

He parseado los Received: e incluso, sin parsear los To: no falla. La versión actual también incluye el parseo de todos los pertinentes encabezados, aunque hasta el momento, lo resuelve solamente con lo Received: sin problemas. Solo tienes que dárselo a fetchmail como "mda" y configurar tu dominio. En las primeras lineas del fichero están las configuraciones e instrucciones para la instalación.

jueves, 29 de noviembre de 2012

MRTG y SNMP


MRTG es una herramienta que nos permite graficar el uso de laz interfaces; tener una idea visual de como se explota el canal. Pero; todos sabemos que el ancho de banda no alcanza, veremos un gráfico verde completo en lugar de picos. En mi opinión, no tiene ningún sentido instalar MRTG para saber algo que es tan obvio, pero como está la moda, TODO el mundo la considera una herramienta definitiva :-P

MRTG es solamente un graficar que procesa el protocolo SNMP. Por tanto, necesitamos priemro un servicio snmp. Creamos un fichero de configuracion nuevo

aptitude install snmp snmpd
cd /etc/snmp
mv snmpd.conf snmpd.conf.old
touch snmpd.conf

y al fichero le escribimos


com2sec paranoid   default                 public
com2sec readonly  192.168.1.0/24      public
com2sec readwrite default                  private

group MyROSystem v1        paranoid
group MyROSystem v2c       paranoid
group MyROSystem usm       paranoid
group MyROGroup v1         readonly
group MyROGroup v2c        readonly
group MyROGroup usm        readonly
group MyRWGroup v1         readwrite
group MyRWGroup v2c        readwrite
group MyRWGroup usm        readwrite

view all    included  .1                               80
view system included  .iso.org.dod.internet.mgmt.mib-2.system

access MyROSystem ""     any       noauth    exact  all    none   none
access MyROGroup ""      any       noauth    exact  all    none   none
access MyRWGroup ""      any       noauth    exact  all    all    none

syslocation TUDOMINIO
syscontact lazarito <tucorreo@tudominio.tld> 


# EOF

Salvamos y cerramos. Ahora, no se porque, esto da palo.
Vamos a /etc/default/snmpd

y lo dejamos solamente la liena que dice:

TRAPDOPTS='-Lsd -p /var/run/snmptrapd.pid'


las demas las comentamos y reiniciamos snmp

/etc/init.d/snmpd restart

Lo probamos

snmpwalk -v 1 192.168.1.1 -c public system

Ahora, en la máquina donde tenemos el servidor web (quizas la misma), vamos instalar mrtg

 aptitude install mrtg

Ahora el directorio en www

mkdir -p /var/www/mrtg/enlace
cp /etc/mrtg.cfg /etc/mrtg.cfg-OLD

Ahora utilizamos la herramienta de configuracion de mrtg ejecutando.

cfgmaker \
--global "workdir: /var/www/mrtg/" \
--global "Options[_]: bits,growright" \
--output /etc/mrtg.cfg \
--community=public \
192.168.1.1 \

MRTG corre solo por el cron, pero para empezar lo corremos manual

mrtg

y buscamos en la carpeta /var/www/mrtg/

Facilíto verdad?

lunes, 12 de noviembre de 2012

eliminar logs

Supuestamente logrotate lleva el control de los logs que se almacenan, pero en mas de una ocasión se me desborda la carpeta de logs en maquinas cuya configuracion de logrotate no he tocado, es decir, en las NO servidor. Solucion sucia y económica:

echo '''
rm /var/log/*.[0-9]
rm /var/log/*/*.[0-9]''' >> /etc/cron.daily/standard

martes, 6 de noviembre de 2012

paquetes húerfanos


Aveces tenemos un carretón de librerías que se quedan instaladas en nuestro sistema de cuando instalamos paquetes. Peor aún cuando upgradeamos un sistema de una versión hacia otra. En mi opinión, lo gestores de dependencias aún deben mejorar en ese aspecto. Pero de aquí a que eso suceda, la gente con poco espacio en disco llora por 150 megas.

El paquete "deborphan" contiene una aplicacion llamada *orphaner* que al correrlo, limpia nuestro sistema de librerías huérfanas que nadie depende de ellas. Lo recomiendo mucho después de upgradear el sistema de una versión a otra. Todo parece indicar que funciona bien y seguro...

lunes, 5 de noviembre de 2012

luchando contra los apagones


En la entrada anterior hablamos sobre apcupsd, un software usado para gestionar los backups inteligentes de APC. Dijimos que podíamos usar el software para gestionar backups aún cuando tuviéramos un backup APC solamente.

Podemos tener un solo backup inteligente con su cable y usarlo como servidor. A este le conectaremos los apcupsd como clientes y sabremos cuando se fue la luz. Esto es útil en lugares muy hostiles con el fluido eléctrico ya que con un cable todo el mundo sabe que situación hay.

Podemos medir el tiempo que dura nuestro backup, por ejemplo, si dura 10 tristes minutos, podemos decirle que se apague a los 8 minutos, asumiendo que tardará dos minutos en las tareas de apagar por la
buenas. Para lograr esto, instalaremos apcupds como si tuviéramos un APC conectado, es decir, ya tenemos uno conectado en la máquina servidor como dije en la entrada anterior.

aptitude install apcupsd

Este software emite reportes de correos con toda la situación de la UPS, así que para no confundirnos le podremos un nombre a cada una. En este caso, supongamos que trabajamos con el servidor de correo. Localizaremos el fichero /etc/apcupsd/apcupsd.conf y le podremos el parámetro: UPSNAME mail
Esta es la UPS de mail. Si no lo hacemos, la ups tendrá el nombre del host así que esto no es algo muy relevante.

Vamos al localizar los parámetros: UPSTYPE y DEVICE, para que nos queden así:

UPSTYPE net
DEVICE 192.168.1.1:3551

En este caso, el tipo de UPS es "net" es decir, una UPS remota en un servidor atravéz de la red. Qué  abroso, verdad? En mi caso, master está en 192.168.1.1 usted, claramente, le podrá las dirección de su
"master". Recomiendo usar IP y no nombres, no sea que con el apagón, el servidor DNS se apague primero o simplemente no sea alcanzable porque el router se apaga. Mejor usar la dirección. Otro parámetro a tener en cuenta es POLLTIME, en caso de que su UPS dure menos de 5 minutos, un minuto le sería valioso. En caso de esa pésima UPS le pondremos el POLLTIME en 10, para que encueste al servidor cada 10 segundos. Es decir, cada segundos le preguntará como está la batería y si hay luz o no.

El parámetro mas importante en este caso, es el parámetro TIMEOUT, este parámetro le hace la vida más fácil al administrador. Por ejemplo: Medimos el backup y vimos que su carga dura  aproximadamente 20 minutos. En este caso, setearemos TIMEOUT a 18, así cuando el apcupsd sea informado de que se fue la luz, comenzará a contar 18 minutos, de esta forma, cuando solo queden 2 minutos para que se agote la carga, apcupsd dará instrucciones de apagado. La estrategia que se busca es la integridad del sistema de archivo, no la durabilidad del servidor durante un apagón, aún así tenemos la esperanza de que en 18 minutos la luz llegue otra vez, por tanto dos minutos para apagarse me parece bastante poco, les podríamos poner el timeout en 16 y dejar otros 4 minutos para el apagado. Cada día el rendimiento del bakcup se acortará mas y con este sistema dejaremos de pensar en el asunto así que mejor precaver.

Como este backup no es la gran cosa, no necesitamos que este repitiendo la información del servidor, por tanto, podemos deshabilitar el parámetro que rige si será o no servidor.

NETSERVER off

A menos puertos tengamos abiertos, mejor.No olvide ajustar el
parámetro ISCONFIGURED=yes con /etc/defualt/apcupsd y por supuesto
reiniciar el servicio /etc/init.d/apcupsd restart

Con eso no nos preocuparemos más por el sistema de archivo cuando se
va la luz.

que hable el backup


Algunos Backups APC vienen con un cable de los mas curioso. En un extremo tienen una toma de red RJ-45 con solo dos pelos conectados mientras que en el otro extremo tienen un puerto USB. Es que cuando adquieres un backup APC del tipo smart, obtienes algo más que un backup, obtienes la herramienta que le informará a tu computadora sobre el estado de la energía eléctrica en tu entorno.
Por ejemplo, si tenemos uno solo de esos cables. Podemos instalar un software que monitoree el  backup y mantenga a todos los servidores en la red informados de las situación con el fluído eléctrico. Si sabemos que el backup del servidor dura aproximadamente 20 minutos, podemos decirle que se apague en 10 minutos. Ese servidor no tiene un backup con cable inteligente pero se guiará por lo que le indique el servidor que si lo tiene.

Este software se llama "apcupsd" El daemon de las UPC de APC, que es software libre!

Primero conectamos el cable debidamente, es decir, el puerto de red raro en el backup y el USB en el servidor. Entonces instalamos el software mágico.

 aptitude install apcupsd

Sin grandes complicaciones. Ahora localizamos el fichero /etc/default/apcupsd y le cambiamos la linea "ISCONFIGURED=yes" porque si no no arranca. Realmente no le hemos configurado aún pero después podría olvidarse. A este apcupsd que tiene el cable conectado al backup, le llamaremos "master".  Este será el que servirá la información por la red.

Localizamos el fichero /etc/apcupsd/apcupsd.conf y le diremos donde está nuestro backup.

Localizamos la linea: UPSNAME y le ponemos master para ubicarnos con el nombre como mencioné anteriormente.

UPSNAME master

Ahora le diremos que nuestro backup está en el puerto USB.

UPSCABLE usb


El resto de los parámetros los dejaremos como están hasta llegar al parámetro "ONBATTERYDELAY" Este parámetro es muy útil para los lugares donde el voltaje falla pero la luz no llega a irse del todo. En mi caso lo tengo en 10

ONBATTERYDELAY 10

Por ejemplo, si la luz pestańea unos un instante, el software no se inmutara. Si se fue la luz y sabemos que en 10 segundos la planta arrancará reponiendo el fluido eléctrico, el software no le dará ninguna instrucción de apagado al sistema. PERO! pasados los 10 segundos, apcupsd reaccionará y ejecutara el script de apagado o comenzara a considerarse "trabajando con baterías" y contando atras para apagar.

Entonces surge la interrogante. ¿De cuanto tiempo disponemos para empezar el apagado? Eso depende de su backup, el que este conectado al cable (el master) puede tomar esa desición sin basarse en tiempo. Podemos especificarle el nivel en % al que deberá proceder un apagado. Pero en el caso del apcupsd que trabaja por la red, NO podemos especificarle un apagado porque responderá a los % del master y este podría no ser igual. En el caso del master, tenemos el parámetro:

BATTERYLEVEL = 10

Esto quiere decir que cuando el % de batería remanente decienda del 10%, apcupsd dará instrucciones de apagado. En caso de que NO desee hacerlo por % puede usar el parámetros MINUTES pero en el caso de la UPS master, los mejor es con %. En los que trabajan por red podría jugar con el parámetro MINUTES pero veremos algo aún mas interesante; sigamos por ahora con master para no perder el hilo.

Decíamos que este será el que dará instrucciones las demás UPS en la red, aún cuando estas NO tengan un cablecito inteligente o simplemente no sean APC, si no un backup normalito, por tanto, master será el servidor que dirigirá la orquesta.

NETSERVER on
NISIP 0.0.0.0

Podría usar 0.0.0.0 ó simplemente la ip de su DMZ, si usa 0.0.0.0 no olvide usar iptables después, no le querremos dar a un posible atacante la posibilidad de encuestarnos nuestro servidor una y otra vez (entiéndase ataque DoS)

El resto de los parámetros no son muy interesantes. En la próxima entrada hablaremos de la UPS que NO tienen el cable, aquellas que se subordinan por la red. Si tiene un MTA correctamente configurado (interfaz de sendmail) recibirá los datos exactos en los que se va la luz, para luego decir con mas presición que nadie, a que hora falló la corriente. También puede ver el voltaje de la linea y mucha información detallada que solo vería conectando un voltímetro a un enchufe de la pared.

jueves, 6 de septiembre de 2012

QRcode

Los QRcode fueron inventados por los japoneses, como casi todas las ideas locas. Resulta que en esa imagen se puede almacenar texto. No que sea muy útil pero esta muy de moda. lo unico bueno que le veo es la posibilidad de almacenar texto, imprimirlo y escanearlo luego con el celular. Hasta ahora no me ha sido muy útil :-P.

Creando un qrcode:

Necesitamos una herramienta llamada "qrencode". En debian es muy fácil.

aptitude install qrcode

Ahora creamos el código dándole un texto por ejemplo:

qrcode -o code.png "bla bla bla"

Para leer códigos qr necesitamos una herramienta mas.

aptitude install zbar-tools

Esto da para leer de webcam y de imagen. Probemos con el que generamos:

zbarimg  -q --raw code.png

Devolverá el texto "bla bla bla". En un script combinado con curl puede ser muy útil.


martes, 24 de julio de 2012

git

Git, es un increíble software creado nada mas y nada menos que por el mismísimo Linus Torvals. Si esta primera oración no te convence, pasemos a la explicación formal.

Git es un programa de control de versiones. Aveces; sobre todo los programadores; van generando código y modificando sus aplicaciones, para bien o para mal. Si tienes la costumbre de ir haciendo copias de tu código antes de trabajar, ya tiene tu mente lista para git y veras que es la herramienta que siempre has soñado.

Yo por mi parte no programo pero me muy util para las configuraciones. Mis carpetas home y etc tienen un repo git. También me creo escritor y lo uso para mis porquerías. En muchas ocaciones he querido retroceder la historia porque no me a gustado un matiz y git es muy útil como verán pronto.

Para no volvernos locos con la configuracion, hagamos un sencilla. Creamos un fichero en nuestro home con el nombre ~/.gitconfig y le ponemos esto:


[user]
name = Tunombre
email = tudireccion@dominio.tld

[alias]
co = checkout
cm = commit
st = status
br = branch
hist = log --pretty=format:\"%h %ad | %s%d [%an]\" --graph --date=short

[color]
status = auto
branch = auto
diff = auto
interactive = auto

La linea user es vital. Las demás son opcionales. El caso de los alias noten el alias "hist". Con estamos listo para irle a arriba a la caliente.

Primero y principioso: Crear el repositorio git.

:~$ git init

Eso nos creara en el directorio que lo ejecutamos, todo un carreton de
cosas en un directorio nombrado: .git/ es decir, oculto y ente
directorio. Dicho directorio no nos interesa en lo absoluto.

Para ver a git en accion. Podemos probar un ejemplo sencillo.

:~$ echo "una linea" > fichero.txt
:~$ git add fichero.txt

Aparentemente no paso nada. Pero si paso. Git está pendiente a todos
nuestros cambios continuamente. En este momento le dijismos que añada y
vigile el fichero fichero.txt. Ahora volvemos a escribir en el fichero.

:~$ echo "otra linea" >> fichero.txt

Nuestor fichero esta ahora así:

:~$ cat fichero.txt
una linea
otra linea

Entonces veamos que dicen git al respecto.

:~$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#       new file:   fichero.txt
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   fichero.txt
#

Dice que fichero.txt ha sido modificado. Bueno pues nada, le diremos a
git que esos cambios queremos almacenarlos. Simplemente esa sera nuestra
primera version del archivo.

:~$ git commit

Ahi nos tirara a un editor de texto para agregar una linea con la descripción del camio. Pongamosle a esa linea "mi primer cambio". Al salvar y cerrar, los cambios habrán sido conciliados con el repositorio.

[master (root-commit) e0070b3] mi primer cambio
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 fichero.txt

Dique que la versio se llama e0070b3, que un fichero ha sido cambiado, con una linea insertada y cero borradas. Esto puede verse así.

:~$ git hist
* e0070b3 2012-07-23 | mi primer cambio (HEAD, master) [lazaro]

Ahi tenemos lo que acabamos de hacer. Pero sigamos cacharreando.

:~$ echo "esta linea no me gusta" >> fichero.txt
:~$ git add fichero.txt
:~$ git commit -a -m "meti la pata"
[master 50c33c2] meti la pata
 1 files changed, 2 insertions(+), 0 deletions(-)


Al usar el parametro "-m" git No nos mostrara el editor de texto, por el contrario, insertara los cambios directo con el texto entrecomillado. La "-a" es para que todos los ficheros añadidos se concilien. Ahora veamos que situación tenemos...

:~$ git hist
* 50c33c2 2012-07-23 | meti la pata (HEAD, master) [lazaro]
* e0070b3 2012-07-23 | mi primer cambio [lazaro]

Ahora tenemos dos versiones. Note que hay una que dice HEAD y master entre paréntesis. Esto se debe a que master es nuestro branch, algo así como la distribución actual, una señal que dice "este punto es estable"
o "hasta aqui llega una version lista"

Por otra parte, tenemos un "HEAD". Eso nos indica en donde estamos parados. Actualmente estamos en 50c33c2.

Digamos que queremos virar para la versio anterior, porque los nuevos cambios no nos gustaron. Eso lo hacemos así:

:~$ git checkout e0070b3
Note: checking out 'e0070b3'.


You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.


If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:


  git checkout -b new_branch_name


HEAD is now at e0070b3... mi primer cambio

Dice que ahora el HEAD esta en mi primer cambio. Veamos:

:~$ git hist
* e0070b3 2012-07-23 | mi primer cambio (HEAD) [lazaro]

En efecto, viramos para e0070b3. Miren:

:~$ cat fichero.txt
una linea

Tal y como los conciliamos la primera vez. Bueno pero... y la segunda linea? Se perdio?

:~$ git hist
* e0070b3 2012-07-23 | mi primer cambio (HEAD) [lazaro]

OH! DIOS MIO, no tengo la version anterior! Eso es una gran porqueria en mi opinón, pero no se preocupen ahí está, solo que no se ve. Solo es cuestion de volver de donde vinimos. Pero antes de irnos. Marcaremos esta versión porque el numero es muy complicado de recordar.

:~$ git tag 0.1

Ahora vallamos de regreso al futuro a buscar la segunda linea.

:~$  git checkout master
Previous HEAD position was e0070b3... mi primer cambio
Switched to branch 'master'

:~$ cat fichero.txt
una linea
otra linea
esta linea no me gusta

Copiamos la segunda linea (hagase la idea que es una funcion de 40lineas) y la llevamos a nuestra versión que mas nos gusta; la que habíamos etiquetado como 0.1. Con la linea copiada podemos volver.

:~$ git co 0.1
Note: checking out '0.1'.


You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.


If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:


git checkout -b new_branch_name


HEAD is now at e0070b3... mi primer cambio

Bueno usamos el comando "co" pero no es mas que un alias que le declaramos a checkout en el fichero .gitconf .Ahora que estamos como queremos, hagamos nuestra valiosa linea.

:~$ echo "otra linea" >> fichero.txt

y creamos una nueva version

:~$ cat fichero.txt
una linea
otra linea
:~$ git add fichero.txt
:~$ git cm -a -m "primera version estable"
:~$ git tag 1.0

Ahora que esta lieta la version 1.0 de nuestro software. Podemos crear un branch con el nombre.

:~$ git branch uno_punto_cero
:~$ git co uno_punto_cero

Ya estamos con la vesion catual en el branch uno_punto_cero, podemos seguir creando a partir de aquí, seguros que de que uno_punto_cero es nuestra ultima versión estable. Cuando querramos darle nuestro software a alguien, solo tenemos que empaquetar el ultimo que funciono.

:~$ git archive -o paquete_verion-1.zip

Y no creara un fichero .zip con el contenido de los fichero en el branch estable, sin importar en que metedura de pata andemos en este momento.

Con esto ya vimos mas menos la dinamica base. En proximas entradas veremos este negocio de empujar y alar repos. Git tiene muchas herramientas, si es amante de diff, encontrara una potente herramienta
en git.

lunes, 16 de julio de 2012

IPv6 forwarding /64

En la entrada anterior dejamos radvd funcionando. También tenemos nuestro rango de IPv6 local y el de Hurricane Electric. Ahora tenemos que asegurar y poner todo junto para que funcione bien.

Primero, tenga en cuenta que la maquina ruteador le hace forwarding a TODO el que este dentro del rango "visible desde el exterior" Este rango fue el rango que nos dio Hurricane Electric. Supongamos que aunque toda la red use ese rango, queremos solamente dos maquinas "expuestas". Con ip6tables en el router, hacemos esto:


# forward el server de correo
ip6tables -A FORWARD -s 2001:470:8:175::2 -j ACCEPT
ip6tables -A FORWARD -d 2001:470:8:175::2 -j ACCEPT

# el esto decarte
ip6tables -A FORWARD -j DROP

De esta forma, solo seran externos los servidores que usted determine. Ahora bien, repito, esos servidores:

NO ESTAN PROTEGIDOS POR EL FIREWALL DEL ROUTER

Deben tener su propio firewall ipv6. Como esto de IPv6 es nuevo, debe haber una pila de hackers por ahi buscandole las cuatro patas al gato. Mejor andarse claro; y un firewall restrictivo es lo mejor. Permitiremos
echo ipv6 porque supuestamente no son tan vulnerables como los del 4.

 # el lo pasa 
ip6tables -A INPUT -i lo -j ACCEPT


 # permitir el ECHO ICMP
ip6tables -A INPUT -p ipv6-icmp -j ACCEPT


# trafico local, pasa
ip6tables -A INPUT -s 2001:db8::/64 -j ACCEPT


 # abro puerto 25
ip6tables -A INPUT -p tcp -d 2001:470:8:175::2 --destination-port 25 -j ACCEPT


# loguea y descarta el resto
ip6tables -A INPUT -j LOG
ip6tables -A INPUT -j DROP
ip6tables -A FORWARD -j DRO

Con eso, habremos cerrado y defendido la interfaz expuesta. Recuerdo que ambas (o todas) la direcciones están en la misma interfaz económico pero también peligroso. Ahora bien, el server tiene varios IPv6. En la entrada que habla de radvd, vimos que podiamos tener dos variantes. La primera es ponerle el rango de Electric Hurricante y la segunda era poner un rango local

Si puso un rango local como es mi caso, necesitará aclararle a su interfaz por donde debe coger para alcanzar una IP. Asumimos que 2001:db8::16 es la interfaz local de la LAN. La ruta nos quedaria asi:

# mi lan local
route -A inet6 add 2001:db8::/64 dev eth0
# gatewat por defecto es mi proxy
route -A inet6 add ::/0 gw 2001:470:8:175::1

Asi tratara de alcanzar las direcciones local desde la interfaz eth0 directamente pero el resto no alcanzable saldrá a buscarlo por la IPv6 del túnel, situado en el ruoter.

ipv6 y radvd

En la entrada anterior, dijimos que la direcicones IPv6 con prefijos /64 podrían ser públicas, a pesar de están dentro de la LAN, con un simple forward se vuelven públicas. Esto puede ser útil para unos y peligroso para otros. A gusto del consumidor.

Para lograr esta marvilla, necesitaremos la intervención de un una aplicación especial. Hablamos de "radvd" Esto podría verse como una especie de DHCP ya que genera direcciones IPv6 basados en las MAC y se las asigna a los clientes. En inglés se denomina como:


Esa es la piedra maestra para armar todo el aparateje y conseguir que las máquinas dentro de la red se vean desde afuera. Además; cumple un buen trabajo sustituyendo al DHCP. Para que funcione, primero ponemos el bit de forwarding en nuestro sistema.

aptitude install radvd
echo "net.ipv6.conf.default.forwarding=1" >> /etc/sysctl.conf 
sysctl -p

Con eso ya tenemos el forwarding funcionando. En teoría debe arrancar, pero; en debian6 da un que otro bateo cuando se arranca con init.d, yo recomiendo arrancarlo manualmente y/o ponerlo /etc/rc.local en caso de bateos. Tmabién si solo desea usarlo como DHCP y no hacer forward, le recomiendo que lo corra manualmente.

Poco a poco los links de las targetas iran haciendo su trabajo. Hablando de los links. Hagamos una pausa para explicar esto. Con ifconfig pueden ver direcciones como esta:

inet6 addr: fe80::250:4ff:fe8a:f283/64 Scope:Link

NO LO QUITE. Si la quita con ifconfig, no podra hacer muchas funciones básicas de IPv6. A eso es a lo que yo le digo "un link" y es simplemente una dirección IPv6 especial que NO conduce a niguna parte. Eso busca los advertisement daemon por la red y se encarga de decir "hola, tengo IPv6, estoy aquí" No le haga ping, porque no llega a ninguna parte. Note que siempre empieza por "fe" y dice "Scope:Link"

Pero volviendo con radvd. Si quiere y puede que todas las máquinas de su LAN esten de cara a internet con una IPv6 pública, puede decirle a radvd que reparta el rango asignado por Electric Hurricane. Quien cae en el
saco del forward y quien no, lo puede controlar con su firewall de ip6tables en la máquina routeador, es decir, en la que tiene el túnel. Eso lo explicaremos despues. Asumiré ahora que used NO quiere ese relajo.

La configuracion de radvd esta en /etc/radvd.conf y la mas simple es así:


interface eth0
{
   AdvSendAdvert on;
   prefix 2001:db8::/64
   {
   };
};


Si desea "exponer" la máquinas. Sustituya "2001:db8::/64" por el rango que le dio Hurricane Electric.

En mi caso yo uso 2001:db8::/64 como mi rango porque es una dirección para mi LAN, dejando así el rango de Hurricane Electric para aquellas máquinas que serán "expuestas" a internet. Simplemente, crear una LAN
ipv6 y sustituir al DHCP. La IPv6 públicas las asigno yo manualmente.

En caso de que quiera exponer varias máquinas (o toda lared), por ejemplo, una zona desmilitarizada fisicamente o un cybercafeé; puede configurar a radvd con el rango público como expliqué arriba.

También puede usar un "esquema hibrido"  Usando el rango de Hurricane Electric, como el de su LAN y controlar el forward con el firewall, esta variante me parece un poco arriesgada, paranóicamente arriesgada. Claro; eso le ahorraría tener múltiples redes y se quita de encima muchos lios de enrutamiento.

Ahora bien, recuerde que las IPv6 "expuesta" es pública y que el firewall del Router NO LA DEFIENDE.

Veamos la próxima entrada para ver como lidiar con esta situación.

IPv6

Desde que suena IPv6 ha muchos le ha despertado la curiosidad. Hasta el otro día para mi no era más que una cantaleta como la del fin del mundo. Mi aporte a la lucha por la causa no pasaba de asignar una dirección a mano para luego usar ping6 y decir "mira que lindo!". Hay quien tiene uno que otro servidor web, ssh y correo que lo usan con IPv6 a nivel de LAN solamente; y con eso se creen IPv6seros de élite.

Pero... de ahí pa afuera que bola?

Relamente se habla de las solución para el problema de la escaces de IPv4. Aún no hemos llegado al cataclismo informático. Realmente IPv6 es un protocolo inutil que se niega a reconocer el fracaso. NADIE LO USA como algo verdaderamente útil.

PERO! Hay una ventaja que yo le veo a esto. Si tienes varios servidores dentro de una LAN y quieres que lo cinco sean alcanzables, REALES desde y hacia Internet: Esta entrada es tu solución. Tengamos cuenta que una IPv6 con prefijo /64 puede estar dentro de la LAN y ser publica, aun estando detrás de Router (sigue sin ser útil)

Dicen que lo que te den gratis lo cojas. Lo mejor de todo esto es que hay un sitio llamado "Hurricane Electric" que te regala un burujón de IPv6, de echo TODO un rango para ti solito. IPv6 se jacta de tener más direcciones disponibles que interfaces en el mundo.

VAMOS! coge tu Rango de IPv6 GRATIS aquí:

Solo necesitamos una IPv4 publica. Con eso vamos a tunnelbroker y creamos una cuenta (gratis) luego creamos un túnel en el meno de creación de túneles. Ellos nos daran los datos del túnel. Con esto, nos darán una ipv6 cliente y servidor que usaremos para la creacion de nuestro túnel.

Así mas o menos es la IPv6 del túnel y el rango /64 que no asignaron.

Una vez que te hallas suscrito a tunnelbroker.net, tendras un túnel 4to6. Crearas un túnel directo con ellos, tendrás una IPv6 publica y un rango de IPv6 a tus dispoición. El drama es que eso conlleva una pila de interfaces y de rutas. Para resolver esto, yo le puse lo siguiente a mi /etc/rc.local

# bring the tunnel
ifconfig sit0 up
ifconfig sit0 inet6 tunnel ::216.66.22.2


# tunnel client side end point
ifconfig sit1 up
# aqui la direccion cliente
ifconfig sit1 inet6 add 2001:XXX:7:YYY::2/64


# interfa de 64 de tu rango regalado
ifconfig eth1 inet6 add 2001:ZZZ:8:BBB::1/64


# la perta de enlace, es el server remoto
route -A inet6 add ::/0 gw 2001:XXX:7:YYY::1

Con ya estamos como quien dice, dentro de la red IPv6; pero aun falta un largo camino por recorrer. Como les decia, IPv6 permite a las maquinas dentro de la LAN ser vista desde el exterior pero antes de llegar a eso,
debemos tener ese relajo controlado.

En la proxima entrada hablaré del tema del forward, la IPv6 pública dentro de la LAN e introduciremos una aplicacion llamada radvd. Necesitamos todo esto para armar nuestro juguete completo.

lunes, 9 de julio de 2012

proxychains

Hay una aplicacion llamada proxychains. En mi opinion es imprescindible en Cuba.

aptitude install proxychains

lazaromagnox:~$ cat /etc/proxychains.conf

# Each connection will be done via chained proxies


strict_chain

# Proxy DNS requests - no leak for DNS data
proxy_dns
# Some timeouts in milliseconds
tcp_read_time_out 15000
tcp_connect_time_out 8000
# proxy definitions under ProxyList:
# proto    adress    port    user   pass
[ProxyList]
http  proxy.dominio.tld 3128 tusuario tupassword
# EOF

Ejecutamos la aplicación como parametro de proxychains

proxychains kopete

..y si tu proxy usa autenticacion basic y/o ntlm todo el trafico de dicha aplicación es atravez del proxy. Lo que quiere decir que NO te conectara a direcciones locales.

Aplicaciones como kopete, fetchmail o ssh; no soportan proxy. Esta es una buena solución

viernes, 6 de julio de 2012

OCS inventory

Es muy importante mantener el control sobre las partes y piezas de todas las computadoras en nuestra red. Realmente este trabajo puede llegar a ser tedioso. Ya alguien ha escrito una BUENA aplicación para esto. Hablamos de OCS inventory.

Está aplicación, funciona corriendo un servidor central mientras que un agente instalado en cada máquina se ocupa de mantener una lista en el servidor con casi todo lo que tiene la máquina. Esto incluye, configuración de hardware, lista de programas instalados, bios, usuarios corriendo el sistema, etc... Todo lo que necesitas y más.

El agente está disponible en su versión para windows, linux y Mac. La aplicación cliente para windows puede descargarse aquí y de la página de descargas oficial donde puede descargar todas las versiones.

Comenzando... instalamos el servidor. En debian todo es muy fácil.


aptitude install ocsinventory-server

Ahora localizamos el fichero /etc/ocsinventory/htpasswd.setup y establecemos el password del admin.

htpasswd htpasswd.setup admin

Con eso salimos de la autenticacion basic que nos pide apache sin previo aviso. También puede ir al fichero /etc/apache2/conf.d/ocsreports.conf y comentar la parte que pide autenticación.

Cuando este instalando le pedirá un usuario para osc, por defecto es "osc" con password "osc". Ese será el usuario que usaremos para instalar la base de datos. Ahi vamos a:

http://tuservidor/ocsreports/install.php

Donde tuservidor es la dirección de tu server, claro está. Corremos el instalador y listo. Ahora vamos a:

http://tuservidor/ocsreports

y entramos con usuario admin y contraseña admin. Lo primero que hacemos es cambiar el usuario. Yo le borre admin y le cree uno administrador nuevo. Lo demás sería crear usuarios normales.

Más información puede verlo en este enlace del sitio original. Incluso de como desplegar desde el active directory para no tener que ir máquina por máquina instalando el cliente.

Gracias al camarada Nestor Alonso que fue el que me dió la luz esta.

jueves, 5 de julio de 2012

dovecot y el cambio de tiempo

En la entrada anterior hablaba de mantener el server en hora. Resulta que dovecot es alérgico al cambio de tiempo y se para cada vez que cambian la hora. No es un error, incluso loguea la parada y te dice el porque.

Es un verdadero caso perdido!

Para torear esta situación, podemos usar un script en el cron que corra cada un minuto y chequee cada un minuto si dovecot NO esta corriendo. En caso de que no este corriendo lo echara a andar usando los scripts de /etc/init.d/

El script es así:


#!/bin/sh
netstat -an|grep -ce ':110.*LISTEN' >/dev/null 2>&1
if [ $? = 0 ]
then
exit 0
else
echo 'Reiniciando dovecot'
/etc/init.d/dovecot restart
logger -p mail.info dovecot_keepalive: Dovecot is down, restarting...

miércoles, 27 de junio de 2012

chrony

El tiempo es muy importante. En las computadoras lo es más aun. Por ejemplo, 3 satélites que hacen una triangulación (GPS) deben tener una presición bestial, ya que un segundo de diferencia entre uno y otro, sería el equivalente a posicionar mal un objeto en la tierra. Cada segundo de diferencia allá arriba, daría un metro de diferencia a una persona caminando en la tierra cuando se intente de ubicar. Los yumas quieren que sus misiles caigan justo donde lo manden, no un metro más al lado. Por eso usan relojes atómicos y un sofisticado sistema de sincronización.

PERO! eso es en lo celajes; que poco me importan porque no los administro yo. Poniendo los pies en la tierra:

Muchos de mis camaradas me preguntan: Para que un servidor de tiempo?

Imaginense un servidor de correo con la hora mal puesta... ALABAO! que crisis, no quiero ni pensarlo. Por ejemplo, buscamos en los logs un evento que sucedió ayer a las 10 de la mañana, pero para nuestro servidor a esa hora eran las 3 de la tarde y el grep no sirve de mucho. También tenemos las pentium dos del año del 3 cuya batería del CMOS hace años dejo de almacenar la hora. También está en la LAN el típico usuario de window que no para de decir "la hora de mi máquina está mal puesta"

Aveces el canal está a todo lo que da y No nos da el ancho de banda, entonces NTPd dice que es demasiado drift y NO sincroniza. También supongamos que tenemos una red local y no queremos fajarnos con eso de los stratum 0 al 9. Pues chrony es la solución.

En debian:

aptitude install chrony

Por defecto, sincronizara con los NTP de debian. Si no tiene acceso a los mismos, puede usar el que desee. Especifíquelo en el fichero:

/etc/chrony/chrony.conf

Localizando la linea:

server

Puede poner cuantas lineas "server" quiera.

server 0.unstratum.org
server 0.otrostratum.org
server 192.168.1.4
server 0.debian.pool.ntp.org

Cuanto más tenga más presición tendrán los nanosegundos, pero bueno, les recuerdo que No administro satélites.

lunes, 25 de junio de 2012

abajo el Caps_Lock

Si hay una tecla que sobra es el el bloque capital, no la tecla de windows. Aún no logro ver donde esta la famosa tecla "any" que dice windows que apretemos cuando falla pero supongo que tampoco falte. En cambio, el Tabuladorsufer exceso de carga.

Poir fin, he conseguido resolver ambos problemas.Convirtiendo el Caps_Lock en un Tabulador con este simple par de comandos.



xmodmap -e "remove Lock = Caps_Lock"
xmodmap -e "keysym Caps_Lock = Tab"

miércoles, 13 de junio de 2012

extenciones de chrome en Cuba

Desde que surgió chorme me ha llamado la atención, pero los yankis nos han cerrado las puertas.

Recientemente google no nos deja descargar cosas de google-code, para colmo bajarse extensiones de chrome tambien da 403 y el robosito desarmado. Siempre estamos pidiendo alguna amigo del exterior que nos descargue algoq ue los yankis nos bloquean.

Pero siempre es posible tirarse de culo en el pajal e incarse con la aguja, resulta que si componemos la URL asi:

https://clients2.google.com/service/update2/crx?response=redirect&x=id%3D[IDE_DEL_APP_AQUI]%26uc

Note la parte claramente destacada en rojo. Ahi situaremos el ID de la extencion, una vez parado en la extensión deseada, la url seria:

 https://chrome.google.com/webstore/detail/oiigbmnaadbkfbmpbfijlflahbdhdgdf

Tomamos la parte señalado en negrita y la URL final quedaría así:


https://clients2.google.com/service/update2/crx?response=redirect&x=id%3Doiigbmnaadbkfbmpbfijlflahbdhdgdf%26uc



Esa URL se la damos a nuestro amable colega en el exterior y el decimos que la abra con algo que no sea chrome, con firefox por ejemplo o con el gran wget.

Simple verdad? Gracias el camarada Janne Kaikkonen, los finlandeses siempre con la lumbrera encendida. Kiitos apuasi Janen.

redirector de squid

dRealmente squid es un caballo pero en temas de redirección no se lleva todos los puntos pero por suerte un tipo inteligente inventó un redictor para squid. Ademas de eso, squid por diseño ya había dejado una ventana abierto para esto.
El software se llama squirm y lo descargaremos aquí:

http://squirm.foote.com.au/squirm-1.26.tgz

Compilarlo es todo un poema. Tras desempaquetarlo, nos posicionamos en su carpeta y ejecutamos:

 cd regex
./configure
make clean
make
cp -p regex.o regex.h ..

Con eso ya tenemos regex listo, ahora vamos a compilar squirm como tal:

make
make install

Ahora viene el redirector en el fichero /etc/squid/squid.conf y deba tener claro que la ruta en redirect_program debe ser la ruta donde esta el squirm.

redirect_program /usr/local/squirm/bin/squirm
redirect_children 10

Ahora viene la configuración. Por defecto ira en /usr/local/squirm/etc/ copiamos los ficheros de ejemplo

cp squirm.local.dist /usr/local/squirm/etc/squirm.local
cp squirm.patterns.dist /usr/local/squirm/etc/squirm.patterns

En el fichero squirm.patterns le ponemos expresiones regulares que matcheen las URL que queremos redireccionar: por ejemplo:

regexi ^http://www\.xxx\.com/.* http://www/notallowed.html

Así cuando el usuario valla a www.xxx.com se redireccionará a notallowed.html. Más ejemplos de ese fichero pueden verlo aquí y del otro fichero aquí

jueves, 31 de mayo de 2012

proxy inverso con nginx

En Cuba se ha puesto de moda el asunto este de el proxy inverso. Generalmente los hacen con squid y yo para no quedarme cheo decidí implementar uno. Los resultados fueron nefastos en cuanto a seguridad. Eso de tener un servidor proxy como proxy inverso no me gusto ni un poquito. Cuando lo terminé, es una herramienta par detectar vulnerabilidades web (cuyo nombre escapa de mi memoria) y por favor la vida. El proxy inverso llego a pedir autenticación para navegar y hasta mostró mi phpmyadmin y en fin, las nalgas en el cristal de la ventana como quien dicen.

Nginx, es un servidor web muy seguro y ligero creado por los rusos. Resulta que el hombre tiene soporte para proxy inverso.

El fichero /etc/nginx/nginx.conf queda así:


user                www-data www-data;
worker_processes    2;
error_log           /var/log/nginx/error.log warn;
pid                 /var/run/nginx.pid;
events {
    worker_connections  1024;
    use epoll;
}
http {
    # allow long server names
    server_names_hash_bucket_size 64;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    log_format main '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
    access_log          /var/log/nginx/access.log;
    # spool uploads to disk instead of clobbering downstream servers
    client_body_temp_path /var/spool/nginx-client-body 1 2;
    client_max_body_size 32m;
    client_body_buffer_size    128k;
    server_tokens       off;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         off;
    keepalive_timeout   5;
    ## Compression
    gzip on;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_proxied any;
    gzip_min_length  1100;
    gzip_buffers 16 8k;
    gzip_types text/plain text/html text/css application/x-javascript \
        text/xml application/xml application/xml+rss text/javascript;
    # Some version of IE 6 don't handle compression well on some mime-types, 
    # so just disable for them
    gzip_disable "MSIE [1-6].(?!.*SV1)";
    # Set a vary header so downstream proxies don't send cached gzipped 
    # content to IE6
    gzip_vary on;
    # proxy settings
    proxy_redirect     off;
    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    proxy_max_temp_file_size 0;
    proxy_connect_timeout      90;
    proxy_send_timeout         90;
    proxy_read_timeout         90;
    proxy_buffer_size          4k;
    proxy_buffers              4 32k;
    proxy_busy_buffers_size    64k;
    proxy_temp_file_write_size 64k;
    include             /etc/nginx/sites-enabled/*;
}

y el fichero /etc/nginx/sites-enabled/proxy
queda así:


server {
    listen       80;
    server_name  lexsa-proxy.lex-sa.cu;
    access_log  /var/log/nginx/proxy.access.log;
    error_log   /var/log/nginx/proxy.error.log;
    # proxy to Apache 2 and mod_python
    location / {
        proxy_pass         http://192.168.1.3:8080/;
        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_max_temp_file_size 0;
        client_max_body_size       10m;
        client_body_buffer_size    128k;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
    }
}

Ojo con la linea señalada en rojo, indica a donde estará redireccionado el tráfico. 

Simple, seguro y ligero... esto si es vida.

jueves, 24 de mayo de 2012

enviar por piezas

Aveces queremos mandar algo por correo muy grande (por "N" motivos) y nos vemos obligados a divir el archivo en pedazos. Para los amantes de Mutt aquí les dejo un script que hace esa tarea muy bien. Pues divide, envía y luego confirma que todo fue enviado; e incluso cual fue la última pieza enviada. Solo es cuestión de correr:

script.sh /path/fichero.ext direcion@dominio.tld


#!/bin/bash
rm -rf /tmp/splitter/
When a FIRE monster(s) on your side of the field is destroyed and sent to the Graveyard, inflict 500 points of damage to your opponent's Life Points.mkdir /tmp/splitter
split -b 312000 $1
mv x* /tmp/splitter/
cd /tmp/splitter/
ALIST=( `ls -w1 /tmp/splitter/` )
RANGE=${#ALIST[@]}
for i in x* ; do
    ULTIMO=$i
    echo """
    Envio a las $(date +%H:%M)
    md5sum: $(md5sum $i)
    longitud $(du -h $i) """ |mutt -a $i -s "Envio: $i" -- $2
    echo $i enviado
    rm $i
    sleep 5
done
echo "Completo!"
echo """
Todos los pedazos fueron enviados.


  Nombre del ultimo: $ULTIMO


  Archivos enviados: $RANGE


Para armar el archivo, coloquelos todos en una carpeta.
Deben tener un nombre relativo a x??, luego ejecute:


cat x* > $1


Donde $1 sera el nombre del archivo resultante
luego de armar los $RANGE pedazos. Suerte!


"""| mutt -s "el ultimo fue $i" -- $2




Así de simple, niin helpompaa

lunes, 23 de abril de 2012

borrar correo en buzon remoto


Para los usuarios de Apop:

Ahora si tengo la ultima cocacola del desierto! El santo grial de la recoleccion aPOP.

Borrar un correo grande DESDE EL BUZON SIN BAJARLO.

aptitude install mailutils

Creen un fichero, yo le puse "sieve.sc" y pongale dentro esto:

    require ["fileinto", "reject"];
    if size :over 10K {discard; stop;}

Ademas! si desea descartar correos segun el remitente, pongalo así:

    if header :contains ["From"] "nomescribas@dominio.com" {discard; stop;}

Entonces corran sieve asi:

sieve -f imap://usuario:password@servidor/ sieve.sc

Por supuesto, corran eso ANTES de fetchmail

miércoles, 11 de abril de 2012

unix time

Despues de pasar mucho trabajo tratando de convertir la fecha a segundos, me di cuanta que había perdido tiempo. Digo esto porque aveces queremos hacer operaciones de tiempo.

El tiempo de unix, es decir la cantidad de segundos transcurridos desde la medianoche UTC del 1 de enero de1970, sin contar segundos intercalares (afirmó Wikipedia). Es un tipo de horario que se usa para ciertas y determinadas operaciones. En fin, con:

date +%s

Puede verse la hora de unix y con:

date -d "2011-10-02" "+%s"

Puede calcular cualquier hora de unix pertienente a una fecha dada. Así se pueden escribir shell script que calculen fechas sumando y restando tiempo.