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...