domingo, 8 de junio de 2008

XMLTV

El segundo proyecto en el que colaboro se llama xmltv

xmltv consiste en un conjunto de "grabbers", que generan un fichero XML.

¿Pero para qué sirven esos ficheros?

Seguramente ya tengáis un aparatito TDT y en el mando habéis visto un botón que pone "EPG" (guía electrónica de programas), donde os muestra que están emitiendo (nombre, duración entre horas y una descripción), y los programas que se emitirán a continuación y sus horarios correspondientes.

Esto es la nueva era digital, poder saber que emitirán, en que horas y poder ponerlo a grabar.

Pero en España realmente se pasan a la torera el actualizar la guía de canales a través de TDT, o algunos canales no lo utilizan, o ponen las horas mal, etc..

XMLTV hace el mismo trabajo que EPG en la TDT, genera un fichero donde contiene información de lo que echa la televisión, por título, horario, descripción e incluso se puede organizar por distintos tipos de canales (deportes, cines, etc). Una vez generado ese fichero se puede utilizar cualquier frontend para visualizar:
- si tienes un media center: MythTV o Freevo (del que he hablado en este mismo blog), podréis acceder a la guía y programar vuestras grabaciones) o
- una aplicacion tipo freeguide

El formato del fichero es bastante simple:

<?xml version="1.0" encoding="ISO-8859-15"?>
<!DOCTYPE tv SYSTEM "xmltv.dtd">
<tv source-info-url="http://www.miguiatv.com/todos-los-canales.html" source-data-url="http://www.miguiatv.com/todos-los-canales.html" generator-info-name="XMLTV" generator-info-url="http://membled.com/work/apps/xmltv/">
<channel id="CLa-20Sexta.miguiatv.com">
<display-name>La Sexta</display-name>
</channel>

<programme start="20080608071000 +0200" channel="CLa-20Sexta.miguiatv.com">
<title lang="es">Apuesta en 20'</title>
<desc lang="es">Programa presentado por Javier Mart<ED>n.</desc>
<category lang="es">CONCURSO</category>
</programme>
</tv>


No creo que haya que explicar mucho: primero se pone la cabecera indicando de donde se genera los datos e información del generador. Luego van los donde se indica un id y el nombre de cada canal. Luego directamente se establecen los programas con , la fecha de inicio y al canal que corresponda. Dentro de se indica el título, la descripción y opcionalmente la categoría. Es importante saber que un programa acaba cuando empieza el otro. Es decir, no se establece su duración.

En freevo luce tal que así:




La instalación de XMLTV tampoco tiene mucho misterio, en debian:

apt-get install xmltv


Si quereis utilizar el que he creado yo (coge datos de miguiatv)


tv_grab_es_miguiatv --configure


Luego elegís los canales que os interesa, y luego ya cada noche sólo teneis que generar el fichero .xml para poder utilizarlo.

0 0 * * * tv_grab_es_miguiatv > /tmp/TV.xml


Para decirle a FreeVO de dónde coger la gúia de televisión, editamos /etc/freevo/local_conf.py y establecemos:

XMLTV_FILE = '/tmp/TV.xml'

domingo, 1 de junio de 2008

Shorewall

A veces las cosas complejas y difíciles se pueden hacer simples y fáciles. Esa frase es el ejemplo de Shorewall, hace fácil y simple el firewall de Linux.

IPtables sirve para packet filtering y para NAT en linux. El problema es que su sintaxis es bastante engorrosa, y muchas veces en máquinas en producción un cambio puede ocurrer muchos problemas. Un ejemplo para ver la complejidad de iptables:


iptables -t nat -A PREROUTING -p tcp -i eth0--dport 81 -j DNAT --to-destination 192.168.0.10



Por ello nace el frontend del que hablamos hoy, simplifica la creación de packet filtering, de NAT, de control de tráfico y un sinfín de cosas.

Pasemos a la acción:

apt-get install shorewall


La configuración del shorewall se guarda en: /etc/shorewall/, los ficheros principales:

- shorewall.conf -> fichero que configura el frontend, la mayoría de las veces el por defecto nos debería servir
- zones -> Declara tus zonas de internet (fw, net, loc, dmz)
- interfaces -> asocia una zona con un interface (net-> eth0, dmz -> eth1, etc..)
- rules -> fichero de reglas (packet filtering, nat, etc)
- policy -> las políticas a seguir por defecto

Un ejemplo de cada fichero (excepto shorewall.conf seria)

zones:

fw firewall
net ipv4
loc ipv4
tun ipv4



interfaces:

loc lan detect
net eth0 detect dhcp
tun tun+ dtect



rules:


ACCEPT net $FW tcp 21
ACCEPT net $FW tcp 80
ACCEPT net:85.18.14.0 $FW tcp 8080
DNAT net loc:192.168.0.10 tcp 81
DROP all net tcp 4662



policy:



net all DROP info
all all REJECT info


creo que poco más que hay que explicar, el fichero importante el rules

cuyo formato es
(accion: ACCEPT o REJECT o DNAT o DROP o REJECT) (de donde: net, loc) (a donde: $fw, loc) (protocolo: tcp, udp, all) (puerto destino) (puerto origen)

Una vez configurado podemos hacer: shorewall check /etc/shorewall para comprobar que la sintaxis está bien. Una vez que tengamos todo configurado podemos editar /etc/default/shorewall para establecer startup=1 (para que se ejecute shorewall a través de init.d)

Una vez lanzado shorewall, podemos ver su estado con shorewall status:

Shorewall is running
State:Started (Sun Jun 1 00:02:21 CEST 2008)


Si queremos hacer algun cambio, editamos los ficheros de /etc/shorewall/ y podemos hacer "shorewall try /etc/shorewall", yo recomiendo hacer una copia: cp -a /etc/shorewall /etc/shorewall_pruebas, editar los ficheros de /etc/shorewall_pruebas y hacer el shorewall try (si este falla volverá a la configuración, que debería funcionar bien de /etc/shorewall), una vez que el shorewall try compile las reglas y veas que todo funciona, copia de el fichero rules de /etc/shorewall_pruebas a /etc/shorewall y reinicia el shorewall.

Una vez visto más o menos como instalarlo y que ficheros editar, podemos observar que sólo nos debemos preocupar de meter las reglas en el fichero rules, y su síntaxis como indicaba arriba es muy fácil.

Podemos ver las diferencias:
Iptables:

iptables -t nat -A PREROUTING -p tcp -i eth0--dport 81 -j DNAT --to-destination 192.168.0.10



Shorewall:

DNAT net loc:192.168.0.10 tcp 81



Finalmente comentar algunos comandos de utilidad:
- shorewall show connections (muestra el estado de las conexiones activas, los packetes enviados, el origen, destino, etc)
- shorewall reject (rechaza una ip, cuando se reinicie el shorewall no estará bloqueada)
- shorewall drop (bloquea una ip, idem que antes)
(tambien existe logreject, logdrop)
- shorewall allow (permite el acceso a una ip bloqueada/rechazada anteriormente)
- shorewall try [timeout] (compila y prueba las reglas de un directorio, si se establece timeout, pasado ese tiempo si no se reinicia el shorewall, se coge la configuracion de nuevo de /etc/shorewall, util para compilar reglas que te puedan dejar sin conexion)
- shorewall check (comprueba la sintaxis de un directorio sin compilar las reglas)

Además, si establecemos en el policiy o en rules (ejemplo DNAT:info), que se loguee las reglas podemos ver en /var/log/syslog algo asi:


Jun 1 13:11:25 Atlantis kernel: Shorewall:net2all:DROP:IN=eth0 OUT= MAC=00:e0:7d:cb:b8:af:00:0d:29:ed:3a:37:08:00 SRC=***.211.***.27 DST=83.**.160.** LEN=485 TOS=0x00 PREC=0x00 TTL=42 ID=0 DF PROTO=UDP SPT=4637 DPT=1027 LEN=465


Para finalizar, una regla interesante:

Limit:info:SSHA,3,60 net $FW tcp 22


Esta regla establece 3 conexiones cada 60 segundos al puerto 22, si se realizan más, se bloquea durante un tiempo a la ip que supera ese límite, es muy útil para evitar ataques brute-force de contraseñas.

Hay que tener un fichero Limit dentro de /etc/shorewall (regla cogida de www.shorewall.net)

set -- $(separate_list $TAG)

[ $# -eq 3 ] || fatal_error "Rule must include ,, as the log tag"

run_iptables -A $CHAIN -m recent --name $1 --set

if [ -n "$LEVEL" ]; then
run_iptables -N $CHAIN%
log_rule_limit $LEVEL $CHAIN% $1 DROP "" "" -A
run_iptables -A $CHAIN% -j DROP
run_iptables -A $CHAIN -m recent --name $1 --update --seconds $3 --hitcount $(( $2 + 1 )) -j $CHAIN%
else
run_iptables -A $CHAIN -m recent --update --name $1 --seconds $3 --hitcount $(( $2 + 1 )) -j DROP
fi

run_iptables -A $CHAIN -j ACCEPT


Cuando se intenta 4 conexiones en un periodo menor de 60 segundos podemos ver en el /var/log/syslog algo así:


May 23 18:39:35 Atlantis kernel: Shorewall:SSHA:DROP:IN=eth0 OUT= MAC=00:e0:7d:cb:b8:af:00:0d:29:ed:3a:37:08:00 SRC=202.129.37.66 DST=**.***.***.** LEN=60 TOS=0x00 PREC=0x00 TTL=46 ID=24119 DF PROTO=TCP SPT=53578 DPT=22 WINDOW=5840 RES=0x00 SYN URGP=0


Enlaces:
Web oficial de shorewall