Uno de los problemas más comunes que se suele tener con Linux viene dado a la hora de configurarlo en dispositivos portátiles, especialmente en lo que a gasto de batería se refiere. Y es que muchas de nuestras distribuciones no habilitan por defecto la gestión inteligente de energía, y surge la duda de que el sistema de Microsoft sea más eficiente. Veamos en pocos pasos como habilitar la gestión inteligente de energía:
1.- Instalar el módulo correspondiente a nuestro procesador, según sea su fabricante:
Para Intel Mobile : modprobe speedstep-centrino
Para AMD Mobile: modprobe powernow-k7
Para AMD64 Mobile: modprobe powernow-k8
Una vez comprobado que el módulo funciona no queda más que añadirlo a nuestro /etc/modules para que se cargue en el arranque del sistema.
2.- Instalar los módulos de gestión de velocidad, que se encuentran en /lib/modules/version_de_kernel/kernel/drivers/cpufreq, los cuales podemos cargar de nuevo en /etc/modules:
freq_table
cpufreq_powersave
cpufreq_userspace
3.- Instalar el demonio que gestionará la velocidad. Aquí tenemos dos opciones cpudyn y powernowd y, aunque el segundo suena similar a la tecnología de AMD funciona igual de bien con Intel:
cpudyn: utiliza el módulo cpu_powersave y conmuta el micro entre la velocidad máxima y mínima, sin estados intermedios, con lo que el rendimiento de la máquina es bueno y en usos que no demanden de mucho proceso, el ahorro de energía es notable.
powernowd: utiliza el módulo cpu_userspace y conmuta los valores entre máximo y mínimo pasando por estados intermedios con lo que el ahorro de batería es superior a cpudyn pero la máquina se muestra más lenta.
Personalmente prefiero powernowd ya que lo que me interesa cuando estoy funcionando con baterías es que éstas se aprovechen al máximo alargando el tiempo de operatibilidad.
4.- Instalar un applet para nuestro entorno gráfico favorito que nos muestre en cada instante la velocidad del micro, como gnome-applets y kpowersave
24.7.06
23.7.06
Y quien quiere un Cisco o un Checkpoint?
Todos tenemos nuestro viejo ordenador tirado en el trastero sin hacer nada, en mi caso es un HP Intel Pentium 233MX con 32Mb de ram. Me he propuesto darle uso a base de pinguino y no hay mejor aplicación que reconvertirlo en un firewall al estilo de los Cisco Systems o Checkpoint.
Para ello simplemente debemos equipar nuestra vieja máquina con dos tarjetas de red o una tarjeta para la Lan y un módem ADSL compatible compatible con Linux (uno compatible como el de Telefónica, no como el Sagem feo que me envió a mi Wanadoo). Acto seguido podemos instalar nuestra distribución favorita y ponerle un buen script de iptables, aunque hay una forma de obtener un firewall realmente profesional y en cinco minutos.
Existen dos distribuciones ideales para este propósito como son SmoothWall e IPCop, que convierten nuestro equipo en un router potentísimo en un par de minutos. Todo con gestion gráfica remota mediante https, detección de intrusos, logs, actualizaciones remotas, VPN, etc
Para ello simplemente debemos equipar nuestra vieja máquina con dos tarjetas de red o una tarjeta para la Lan y un módem ADSL compatible compatible con Linux (uno compatible como el de Telefónica, no como el Sagem feo que me envió a mi Wanadoo). Acto seguido podemos instalar nuestra distribución favorita y ponerle un buen script de iptables, aunque hay una forma de obtener un firewall realmente profesional y en cinco minutos.
Existen dos distribuciones ideales para este propósito como son SmoothWall e IPCop, que convierten nuestro equipo en un router potentísimo en un par de minutos. Todo con gestion gráfica remota mediante https, detección de intrusos, logs, actualizaciones remotas, VPN, etc
20.7.06
Monitorización de redes con Nagios
Cada administrador de sistemas tiene sus reglas y sus políticas, más o menos acertadas en lo que a la monitorización de sus redes se refiere y utiliza unas herramientas y otras basándose en su experiencia. Lo que me dice mi experiencia es lo siguiente:
Cierto es que existen herramientas indispensables como sniffers que nos ayudan a resolver incidencias en problemas puntuales, pero acaso tendrías un sniffer corriendo todo el día? También existen los típicos "pingeadores" como Smokeping que hacen bien lo que tienen que hacer, un ping y te avisa si la máquina no responde (acaso eso no puede hacerse con bash?).
A mi entender monitorizar una red es sinónimo de monitorizar los servicios que se ofrecen, junto con aquellos dispositivos que se consideran indispensables, como por ejemplo el router y para realizar estas tareas a mi siempre me ha funcionado Nagios. Con Nagios no sólo se puede monitorizar que una máquina esté levantada sinó que podemos ver que el servidor ftp que aloja está funcionando y que el servidor bind9 acepta escuchas. Es muy útil para mantener un historial de fallas cuando ofreces servidores de servicios como: smtp, imap, pop, ftp, www, dns, etc
Existen ejemplos de configuración muy instructivos en Bulma, Deusto y Nagios-howto.
Cierto es que existen herramientas indispensables como sniffers que nos ayudan a resolver incidencias en problemas puntuales, pero acaso tendrías un sniffer corriendo todo el día? También existen los típicos "pingeadores" como Smokeping que hacen bien lo que tienen que hacer, un ping y te avisa si la máquina no responde (acaso eso no puede hacerse con bash?).
A mi entender monitorizar una red es sinónimo de monitorizar los servicios que se ofrecen, junto con aquellos dispositivos que se consideran indispensables, como por ejemplo el router y para realizar estas tareas a mi siempre me ha funcionado Nagios. Con Nagios no sólo se puede monitorizar que una máquina esté levantada sinó que podemos ver que el servidor ftp que aloja está funcionando y que el servidor bind9 acepta escuchas. Es muy útil para mantener un historial de fallas cuando ofreces servidores de servicios como: smtp, imap, pop, ftp, www, dns, etc
Existen ejemplos de configuración muy instructivos en Bulma, Deusto y Nagios-howto.
Denegar acceso a MSN Messenger / Hotmail
Para los que tengais que administrar redes corporativas probablemente os interesará evitar que los usuarios de la red interna accedan al chat del MSN Hotmail. Basándonos en el script iptables que está posteado en este mismo blog, he aquí unas pequeñas líneas complementarias para denegar el acceso a este servicio:
iptables -A tcp_outbound -p TCP -s 0/0 --destination-port 1863 -j REJECT
iptables -t mangle -A PREROUTING -p tcp --dport 1863 -j DROP
iptables -t mangle -A PREROUTING -d 63.208.13.126 -j DROP
iptables -t mangle -A PREROUTING -d 64.4.12.200 -j DROP
iptables -t mangle -A PREROUTING -d 64.4.12.201 -j DROP
iptables -t mangle -A PREROUTING -d 65.54.131.249 -j DROP
iptables -t mangle -A PREROUTING -d 65.54.194.118 -j DROP
iptables -t mangle -A PREROUTING -d 65.54.211.61 -j DROP
iptables -t mangle -A PREROUTING -d 207.46.104.20 -j DROP
iptables -t mangle -A PREROUTING -d 207.46.110.2 -j DROP
iptables -A tcp_outbound -p TCP -s 0/0 --destination-port 1863 -j REJECT
iptables -t mangle -A PREROUTING -p tcp --dport 1863 -j DROP
iptables -t mangle -A PREROUTING -d 63.208.13.126 -j DROP
iptables -t mangle -A PREROUTING -d 64.4.12.200 -j DROP
iptables -t mangle -A PREROUTING -d 64.4.12.201 -j DROP
iptables -t mangle -A PREROUTING -d 65.54.131.249 -j DROP
iptables -t mangle -A PREROUTING -d 65.54.194.118 -j DROP
iptables -t mangle -A PREROUTING -d 65.54.211.61 -j DROP
iptables -t mangle -A PREROUTING -d 207.46.104.20 -j DROP
iptables -t mangle -A PREROUTING -d 207.46.110.2 -j DROP
Kioslaves, atajos útiles en KDE
Tan bien me han hablado de Kubuntu que he tenido que probarlo en el último portátil de Hewlett Packard que ha caído en mis manos (a que si Rubén!).
Había oído hablar de las "kioslaves" unos atajos que vienen con Konqueror y que facilitan ciertas tareas al usuario. Aunque hay una gran cantidad de kioslaves, los que me han parecido más útiles son los siguientes (por cierto, para utilizarlos simplemente teclearlos en la barra de direcciones de Konqueror):
smb:/, accede a recursos compartidos windows en red
fish:/, establece una conexión ssh con un equipo remoto
pop3:/, imap:/ y smtp:/, se conectan a diferentes servidores de correo
ftp:/ y sftp:/, cliente ftp y ftp seguro
Por ejemplo, si quiero conectarme con ssh a mi otra máquina de red de forma gráfica, simplemente he de teclear fish://mi_usuario@ip_de_mi_maquina (pensar que hay gente que utiliza VNC para lo mismo). Otro ejemplo útil sería el descubrir los recursos compartidos de los windozes que hay en red, con un simple smb://
Teneis un listado más completo en Linux Magazine.
Había oído hablar de las "kioslaves" unos atajos que vienen con Konqueror y que facilitan ciertas tareas al usuario. Aunque hay una gran cantidad de kioslaves, los que me han parecido más útiles son los siguientes (por cierto, para utilizarlos simplemente teclearlos en la barra de direcciones de Konqueror):
smb:/, accede a recursos compartidos windows en red
fish:/, establece una conexión ssh con un equipo remoto
pop3:/, imap:/ y smtp:/, se conectan a diferentes servidores de correo
ftp:/ y sftp:/, cliente ftp y ftp seguro
Por ejemplo, si quiero conectarme con ssh a mi otra máquina de red de forma gráfica, simplemente he de teclear fish://mi_usuario@ip_de_mi_maquina (pensar que hay gente que utiliza VNC para lo mismo). Otro ejemplo útil sería el descubrir los recursos compartidos de los windozes que hay en red, con un simple smb://
Teneis un listado más completo en Linux Magazine.
17.7.06
pyHardware, un bot IRC escrito en Python
Como había comentado en post anteriores, es francamente sencillo implementar un simple bot IRC de ayuda utilizando pyIRClib. Este módulo nos da el protocolo totalmente másticado y además incluye el módulo pyIrcBot, muy útil para este caso.
Al bichejo en cuestión lo he llamado pyHardware y su finalidad es la de realizar búsquedas en google y mostrar los resultados en el canal. En principio tenía más comandos, como uno de aprendizaje mediante el cual los usuarios le iban enseñando cosas pero, me lo estaban maleducando con lo que decidí eliminarle esa función (en realidad no es más que manejar el comando !aprende e ir guardando en un fichero de texto o una pequeña base de datos).
Aquí podeis encontrar el código fuente del bot perfectamente indentado.
Al bichejo en cuestión lo he llamado pyHardware y su finalidad es la de realizar búsquedas en google y mostrar los resultados en el canal. En principio tenía más comandos, como uno de aprendizaje mediante el cual los usuarios le iban enseñando cosas pero, me lo estaban maleducando con lo que decidí eliminarle esa función (en realidad no es más que manejar el comando !aprende e ir guardando en un fichero de texto o una pequeña base de datos).
Aquí podeis encontrar el código fuente del bot perfectamente indentado.
13.7.06
Previniendo ataques de diccionario a nuestros servicios SSH, FTP ...
Para los que vivimos aíslados del mundo, de los virus del churros (más conocido como Windows) y de los últimos ingenios antispyware, ver como al auth.log crece sin parar nos pone nerviosos. Confieso pertenecer a ese grupo de usuarios paranoicos que vuelcan el auth.log en el tty12 (para los que no lo hacen, tail -f /va/log/auth.log > /dev/tty12) y la primera vez que vi correr líneas con intentos de login fallidos casi se me escapan unas gotitas.
Una vez me expliraron que era un virus, sabiendo que mis claves parecen sumas md5 y que no tengo definidos usuarios con shell válida salvo el mío, entonces me sentí a salvo. Aún así, no me apetece que alguien, sea ente o persona, esté machacando mi conexión y haciendo crecer mi log, con lo que aupado por el calor del momento son tiempos de plantar cara y declarar la guerra al invasor.
Se me ocurren tres soluciones:
1.- La ley marcial. Denegar el acceso a los servicios desde el exterior o limitarlos a un cierto número de ips concreto. Lo cierto es que todos los servicios sensibles como SSH deberían estar limitados pero, cuando tienes ips dinámicas es un poco complicado.
2.- DenyHosts. Se trata de un script Python configurable con una serie de reglas que va leyendo el fichero /var/log/auth.log (o /var/log/secure para los del sombrero rojo) y toma decisiones cuando detecta una actividad anormal, como por ejemplo, denegar el servicio.
3.- PortKnocking. La idea es tener todos los puertos "firewalleados" y "llamando" a una secuencia de puertos concretos abrir/cerrar puertos según políticas establecidas. Por ejemplo, podemos establecer una regla para abrir el puerto 22 que sea atacara en esta secuencia a los puertos puertos 87, 54, y 344 y acto seguido el puerto 22 será accesible. El único pero, es que se necesita la aplicación de "marcado" en cada uno de los equipos clientes (siempre se puede llevar en un lápiz usb).
Una vez me expliraron que era un virus, sabiendo que mis claves parecen sumas md5 y que no tengo definidos usuarios con shell válida salvo el mío, entonces me sentí a salvo. Aún así, no me apetece que alguien, sea ente o persona, esté machacando mi conexión y haciendo crecer mi log, con lo que aupado por el calor del momento son tiempos de plantar cara y declarar la guerra al invasor.
Se me ocurren tres soluciones:
1.- La ley marcial. Denegar el acceso a los servicios desde el exterior o limitarlos a un cierto número de ips concreto. Lo cierto es que todos los servicios sensibles como SSH deberían estar limitados pero, cuando tienes ips dinámicas es un poco complicado.
2.- DenyHosts. Se trata de un script Python configurable con una serie de reglas que va leyendo el fichero /var/log/auth.log (o /var/log/secure para los del sombrero rojo) y toma decisiones cuando detecta una actividad anormal, como por ejemplo, denegar el servicio.
3.- PortKnocking. La idea es tener todos los puertos "firewalleados" y "llamando" a una secuencia de puertos concretos abrir/cerrar puertos según políticas establecidas. Por ejemplo, podemos establecer una regla para abrir el puerto 22 que sea atacara en esta secuencia a los puertos puertos 87, 54, y 344 y acto seguido el puerto 22 será accesible. El único pero, es que se necesita la aplicación de "marcado" en cada uno de los equipos clientes (siempre se puede llevar en un lápiz usb).
DenyHosts, no más flood a mi SSHd
DenyHosts es un script escrito en Python que tiene como único fin el evitar ataques de fuerza bruta, algo más que habitual cuando tenemos una máquina corriendo un servidor SSH público. Este script monitoriza el fichero /var/log/auth.log en búsqueda de un anormal crecimiento del mismo, como por ejemplo mi propio auth.log:
Jul 9 09:20:18 firewall-one sshd[687]: Failed password for root from 222.122.160.115 port 35695 ssh2
Jul 9 09:20:21 firewall-one sshd[689]: Could not reverse map address 222.122.160.115.
Jul 9 09:20:21 firewall-one PAM_unix[689]: authentication failure; (uid=0) -> root for ssh service
Jul 9 09:20:23 firewall-one sshd[689]: Failed password for root from 222.122.160.115 port 35909 ssh2
Jul 9 09:20:26 firewall-one sshd[691]: Could not reverse map address 222.122.160.115.
Para comenzar a utilizar denyhost, un simple apt-get install denyhost y, he aquí la configuración simple para impacientes:
/etc/denyhosts.conf
DENY_THRESHOLD_INVALID = 2 #Número de intentos fallidos permitos a un usuario inexistente antes de denegar acceso
DENY_THRESHOLD_VALID = 4 #Número de intentos fallidos permitidos a un usuario existente antes de denegar acceso
Documentación más ampliada en la web de DenyHosts.
Jul 9 09:20:18 firewall-one sshd[687]: Failed password for root from 222.122.160.115 port 35695 ssh2
Jul 9 09:20:21 firewall-one sshd[689]: Could not reverse map address 222.122.160.115.
Jul 9 09:20:21 firewall-one PAM_unix[689]: authentication failure; (uid=0) -> root for ssh service
Jul 9 09:20:23 firewall-one sshd[689]: Failed password for root from 222.122.160.115 port 35909 ssh2
Jul 9 09:20:26 firewall-one sshd[691]: Could not reverse map address 222.122.160.115.
Para comenzar a utilizar denyhost, un simple apt-get install denyhost y, he aquí la configuración simple para impacientes:
/etc/denyhosts.conf
DENY_THRESHOLD_INVALID = 2 #Número de intentos fallidos permitos a un usuario inexistente antes de denegar acceso
DENY_THRESHOLD_VALID = 4 #Número de intentos fallidos permitidos a un usuario existente antes de denegar acceso
Documentación más ampliada en la web de DenyHosts.
PortKnocking, abriendo puertos bajo demanda
Se conoce como portknocking a la técnica de abrir puertos utilizando una combinación de llamadas a un grupo de puertos en concreto en una concreta secuencia, es decir, girando la rueda de nuestra caja fuerte (atacando puertos) en una secuencia de números secretos (grupo de puertos) para poder abrirla (abrir un puerto).
Partiendo de un firewall que lo deniega todo, un script perl vigila el log del firewall en busca de una secuencia de llamadas a puertos concreta que actúa a modo de password, desbloqueando la ejecución de una aplicación o una línea de comandos. La secuencia de llamadas se realiza utilizando el software cliente de la propia aplicación, la cual debe estar instalada en los equipos remotos desde los que queremos accecer al servicio oculto (también puede estar en un lápiz usb).
Veamos una configuración simple partiendo del paquete knockd disponible para Debian.
1.- Instalamos el paquete
pequerrecho:~# apt-get install knockd
....
Configurando knockd (0.4-1) ...
Not starting knockd. To enable it edit /etc/default/knockd
2.- Modificamos /etc/default/knockd para permitir que knockd arranque en el inicio de sistema
START_KNOCKD=1
3.- Editamos /etc/knockd.conf y configuramos nuestros servicios
[options]
logfile = /var/log/knockd.log
[abrirCerrarSSH]
sequence = 874, 29, 173
seq_timeout = 5
tcpflags = syn
start_command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
cmd_timeout = 10
stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
4.- Reiniciar el servicio
pequerrecho:~# /etc/init.d/knockd restart
A partir de este momento, nuestro sistema será invisible a los portscanners pero utilizando el cliente knock y la secuencia de puertos que hemos establecido, podemos abrir el puerto bajo demanda:
pequerrecho:~# knock 194.224.52.4 874 29 173
Existe un cliente portknocking para Windows, cuyo funcionamiento no he verificado llamado It's Me.
Partiendo de un firewall que lo deniega todo, un script perl vigila el log del firewall en busca de una secuencia de llamadas a puertos concreta que actúa a modo de password, desbloqueando la ejecución de una aplicación o una línea de comandos. La secuencia de llamadas se realiza utilizando el software cliente de la propia aplicación, la cual debe estar instalada en los equipos remotos desde los que queremos accecer al servicio oculto (también puede estar en un lápiz usb).
Veamos una configuración simple partiendo del paquete knockd disponible para Debian.
1.- Instalamos el paquete
pequerrecho:~# apt-get install knockd
....
Configurando knockd (0.4-1) ...
Not starting knockd. To enable it edit /etc/default/knockd
2.- Modificamos /etc/default/knockd para permitir que knockd arranque en el inicio de sistema
START_KNOCKD=1
3.- Editamos /etc/knockd.conf y configuramos nuestros servicios
[options]
logfile = /var/log/knockd.log
[abrirCerrarSSH]
sequence = 874, 29, 173
seq_timeout = 5
tcpflags = syn
start_command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
cmd_timeout = 10
stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
4.- Reiniciar el servicio
pequerrecho:~# /etc/init.d/knockd restart
A partir de este momento, nuestro sistema será invisible a los portscanners pero utilizando el cliente knock y la secuencia de puertos que hemos establecido, podemos abrir el puerto bajo demanda:
pequerrecho:~# knock 194.224.52.4 874 29 173
Existe un cliente portknocking para Windows, cuyo funcionamiento no he verificado llamado It's Me.
11.7.06
Firewalls serios con iptables
Que tiempos aquellos en que poníamos "echo 1 > /proc/sys/net/ipv4/ip_forward" para routear nuestras redes internas!
Hay muchas formas de construirse un buen firewall, una de ellas es copiando y pegando este script (la otra es leyéndose la documentación, pero seamos realistas...):
#!/bin/bash
SYSCTL="/sbin/sysctl -w"
IPT="/sbin/iptables"
INET_IFACE="eth0" #Interface conectado a Inet
INET_IP="192.168.0.2" #IP del iface conectado a Inet
LAN_IFACE="eth1" #Interface conectado a la Lan
LAN_IP="192.168.1.1" #IP del iface conectado a la Lan
LAN_NET="192.168.1.0/24"
LAN_BCAST="192.168.1.255"
LOCAL_IFACE="lo"
LOCAL_IP="127.0.0.1"
#Carga de módulos
modprobe ip_tables
modprobe ip_conntrack
modprobe ip_nat_ftp
modprobe ip_conntrack_ftp #Estos dos últimos por si tenemos un ftp no pasivo
#Parámetros del kernel
$SYSCTL net.ipv4.ip_forward="1"
$SYSCTL net.ipv4.tcp_syncookies="1"
$SYSCTL net.ipv4.conf.all.rp_filter="1"
$SYSCTL net.ipv4.icmp_echo_ignore_broadcasts="1"
$SYSCTL net.ipv4.conf.all.accept_source_route="0"
$SYSCTL net.ipv4.conf.all.secure_redirects="1"
$SYSCTL net.ipv4.conf.all.log_martians="1"
#Borrado de reglas establecidas
$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT
$IPT -t mangle -P PREROUTING ACCEPT
$IPT -t mangle -P OUTPUT ACCEPT
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X
#Política por defecto: DROP
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
$IPT -N bad_packets
$IPT -N bad_tcp_packets
$IPT -N icmp_packets
$IPT -N udp_inbound
$IPT -N icmp_packets
$IPT -N udp_inbound
$IPT -A bad_packets -p ALL -i $INET_IFACE -s $LAN_NET -j LOG --log-prefix "fp=bad_packets:2 a=DROP "
$IPT -A bad_packets -p ALL -i $INET_IFACE -s $LAN_NET -j DROP
$IPT -A bad_packets -p ALL -m state --state INVALID -j LOG --log-prefix "fp=bad_packets:1 a=DROP "
$IPT -A bad_packets -p ALL -m state --state INVALID -j DROP
$IPT -A bad_packets -p tcp -j bad_tcp_packets
$IPT -A bad_packets -p ALL -j RETURN
$IPT -A bad_tcp_packets -p tcp -i $LAN_IFACE -j RETURN
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "fp=bad_packets:1 a=DROP "
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j LOG --log-prefix "fp=bad_packets=2 a=DROP "
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j LOG --log-prefix "fp=bad_tcp_packets:3 a=DROP "
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j LOG --log-prefix "fp=bad_tcp_packets:4 a=DROP "
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j LOG --log-prefix "fp=bad_tcp_packets:5 a=DROP "
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACL,FIN,URG -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j LOG --log-prefix "fp=bad_tcp_packets:6 a=DROP "
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j LOG --log-prefix "fp=bad_tcp_packets:7 a=DROP "
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
$IPT -A bad_tcp_packets -p tcp -j RETURN
$IPT -A icmp_packets --fragment -p ICMP -j LOG --log-prefix "fp=icmp_packets:1 a=DROP "
$IPT -A icmp_packets --fragment -p ICMP -j DROP
$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j DROP
$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT
$IPT -A icmp_packets -p ICMP -j RETURN
#Denegar el acceso a Netbios
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 137 -j DROP
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 130 -j DROP
##
$IPT -A udp_inbound -p UDP -j RETURN
$IPT -A udp_outbound -p UDP -s 0/0 -j ACCEPT
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 22 -j ACCEPT #Aceptamos SSH
$IPT -A tcp_inbound -p TCP -j RETURN
$IPT -A tcp_outbound -p TCP -s 0/0 -j ACCEPT
$IPT -A INPUT -p ALL -i $LOCAL_IFACE -j ACCEPT
$IPT -A INPUT -p ALL -j bad_packets
$IPT -A INPUT -p ALL -d 224.0.0.1 -j DROP
$IPT -A INPUT -p ALL -i $LAN_IFACE -s $LAN_NET -j ACCEPT
$IPT -A INPUT -p ALL -i $LAN_IFACE -d $LAN_BCAST -j ACCEPT
$IPT -A INPUT -p ALL -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p TCP -i $INET_IFACE -j tcp_inbound
$IPT -A INPUT -p UDP -i $INET_IFACE -j udp_inbound
$IPT -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets
$IPT -A INPUT -m pkttype --pkt-type broadcast -j DROP
$IPT -A INPUT -j LOG --log-prefix "fp=INPUT:99 a=DROP "
$IPT -A FORWARD -p ALL -j bad_packets
$IPT -A FORWARD -p tcp -i $LAN_IFACE -j tcp_outbound
$IPT -A FORWARD -p udp -i $LAN_IFACE -j udp_outbound
$IPT -A FORWARD -p ALL -i $LAN_IFACE -j ACCEPT
$IPT -A FORWARD -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
#Redireccionar un puerto
#$IPT -A FORWARD -p tcp -i $INET_IFACE --destination-port 80 # --destination 192.168.1.20 -j ACCEPT
$IPT -A FORWARD -j LOG --log-prefix "fp=FORWARD:99 a=DROP "
$IPT -A OUTPUT -m state -p icmp --state INVALID -j DROP
$IPT -A OUTPUT -p ALL -s $LOCAL_IP -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LOCAL_IFACE -j ACCEPT
$IPT -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LAN_IFACE -j ACCEPT
$IPT -A OUTPUT -p ALL -o $INET_IFACE -j ACCEPT
$IPT -A OUTPUT -j LOG --log-prefix "fp=OUTPUT:99 a=DROP "
$IPT -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $INET_IP
Hay muchas formas de construirse un buen firewall, una de ellas es copiando y pegando este script (la otra es leyéndose la documentación, pero seamos realistas...):
#!/bin/bash
SYSCTL="/sbin/sysctl -w"
IPT="/sbin/iptables"
INET_IFACE="eth0" #Interface conectado a Inet
INET_IP="192.168.0.2" #IP del iface conectado a Inet
LAN_IFACE="eth1" #Interface conectado a la Lan
LAN_IP="192.168.1.1" #IP del iface conectado a la Lan
LAN_NET="192.168.1.0/24"
LAN_BCAST="192.168.1.255"
LOCAL_IFACE="lo"
LOCAL_IP="127.0.0.1"
#Carga de módulos
modprobe ip_tables
modprobe ip_conntrack
modprobe ip_nat_ftp
modprobe ip_conntrack_ftp #Estos dos últimos por si tenemos un ftp no pasivo
#Parámetros del kernel
$SYSCTL net.ipv4.ip_forward="1"
$SYSCTL net.ipv4.tcp_syncookies="1"
$SYSCTL net.ipv4.conf.all.rp_filter="1"
$SYSCTL net.ipv4.icmp_echo_ignore_broadcasts="1"
$SYSCTL net.ipv4.conf.all.accept_source_route="0"
$SYSCTL net.ipv4.conf.all.secure_redirects="1"
$SYSCTL net.ipv4.conf.all.log_martians="1"
#Borrado de reglas establecidas
$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT
$IPT -t mangle -P PREROUTING ACCEPT
$IPT -t mangle -P OUTPUT ACCEPT
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X
#Política por defecto: DROP
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
$IPT -N bad_packets
$IPT -N bad_tcp_packets
$IPT -N icmp_packets
$IPT -N udp_inbound
$IPT -N icmp_packets
$IPT -N udp_inbound
$IPT -A bad_packets -p ALL -i $INET_IFACE -s $LAN_NET -j LOG --log-prefix "fp=bad_packets:2 a=DROP "
$IPT -A bad_packets -p ALL -i $INET_IFACE -s $LAN_NET -j DROP
$IPT -A bad_packets -p ALL -m state --state INVALID -j LOG --log-prefix "fp=bad_packets:1 a=DROP "
$IPT -A bad_packets -p ALL -m state --state INVALID -j DROP
$IPT -A bad_packets -p tcp -j bad_tcp_packets
$IPT -A bad_packets -p ALL -j RETURN
$IPT -A bad_tcp_packets -p tcp -i $LAN_IFACE -j RETURN
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "fp=bad_packets:1 a=DROP "
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j LOG --log-prefix "fp=bad_packets=2 a=DROP "
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j LOG --log-prefix "fp=bad_tcp_packets:3 a=DROP "
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j LOG --log-prefix "fp=bad_tcp_packets:4 a=DROP "
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j LOG --log-prefix "fp=bad_tcp_packets:5 a=DROP "
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACL,FIN,URG -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j LOG --log-prefix "fp=bad_tcp_packets:6 a=DROP "
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j LOG --log-prefix "fp=bad_tcp_packets:7 a=DROP "
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
$IPT -A bad_tcp_packets -p tcp -j RETURN
$IPT -A icmp_packets --fragment -p ICMP -j LOG --log-prefix "fp=icmp_packets:1 a=DROP "
$IPT -A icmp_packets --fragment -p ICMP -j DROP
$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j DROP
$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT
$IPT -A icmp_packets -p ICMP -j RETURN
#Denegar el acceso a Netbios
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 137 -j DROP
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 130 -j DROP
##
$IPT -A udp_inbound -p UDP -j RETURN
$IPT -A udp_outbound -p UDP -s 0/0 -j ACCEPT
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 22 -j ACCEPT #Aceptamos SSH
$IPT -A tcp_inbound -p TCP -j RETURN
$IPT -A tcp_outbound -p TCP -s 0/0 -j ACCEPT
$IPT -A INPUT -p ALL -i $LOCAL_IFACE -j ACCEPT
$IPT -A INPUT -p ALL -j bad_packets
$IPT -A INPUT -p ALL -d 224.0.0.1 -j DROP
$IPT -A INPUT -p ALL -i $LAN_IFACE -s $LAN_NET -j ACCEPT
$IPT -A INPUT -p ALL -i $LAN_IFACE -d $LAN_BCAST -j ACCEPT
$IPT -A INPUT -p ALL -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p TCP -i $INET_IFACE -j tcp_inbound
$IPT -A INPUT -p UDP -i $INET_IFACE -j udp_inbound
$IPT -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets
$IPT -A INPUT -m pkttype --pkt-type broadcast -j DROP
$IPT -A INPUT -j LOG --log-prefix "fp=INPUT:99 a=DROP "
$IPT -A FORWARD -p ALL -j bad_packets
$IPT -A FORWARD -p tcp -i $LAN_IFACE -j tcp_outbound
$IPT -A FORWARD -p udp -i $LAN_IFACE -j udp_outbound
$IPT -A FORWARD -p ALL -i $LAN_IFACE -j ACCEPT
$IPT -A FORWARD -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
#Redireccionar un puerto
#$IPT -A FORWARD -p tcp -i $INET_IFACE --destination-port 80 # --destination 192.168.1.20 -j ACCEPT
$IPT -A FORWARD -j LOG --log-prefix "fp=FORWARD:99 a=DROP "
$IPT -A OUTPUT -m state -p icmp --state INVALID -j DROP
$IPT -A OUTPUT -p ALL -s $LOCAL_IP -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LOCAL_IFACE -j ACCEPT
$IPT -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LAN_IFACE -j ACCEPT
$IPT -A OUTPUT -p ALL -o $INET_IFACE -j ACCEPT
$IPT -A OUTPUT -j LOG --log-prefix "fp=OUTPUT:99 a=DROP "
$IPT -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $INET_IP
Psyco, python a toda máquina
Si estás escribiendo un programa bastante largo y quieres agilizar la ejecución sin revisar tu código para quitar 40 "ifs" que sobran, existe un módulo llamado Psyco que lo hace por ti.
Para los impacientes que no se van a leer la documentación, he aquí la forma más rápida de acelerar tus aplicaciones:
Para los impacientes que no se van a leer la documentación, he aquí la forma más rápida de acelerar tus aplicaciones:
import psycoY para aplicaciones con ingentes cantidades de código:
psyco.full()
import psyco
psyco.profile()
NMEA, leer datos del GPS y no morir en el intento
Esta receta es útil para quien tenga la necesidad de programar una aplicación que lea de un GPS (como es mi caso particular). La estructura de las cadenas que nos indican el posicionamiento es la siguiente:
Trama de ejemplo:
Trama de ejemplo:
$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
Donde:
GGA Datos GPS
123519 Hora del dato en horario UTC
4807.038,N Latitud
01131.000,E Longitud
1 Validez: 0 = invalido
1 = GPS valido
2 = DGPS valido
6 = estimatedo
8 = modo simulación
08 Número de satelites utilizados
0.9 Desviación horizontal
545.4,M Altitud en metros
46.9,M Geoid
(vacío) Tiempo desde última actualización
(vacío) ID estación DGPS
*47 checksum
Expresiones regulares en Python
He aquí un tutorial sobre expresiones regulares en Python.
Es bastante completo y en mi caso particular me ha sido de gran ayuda.
Expresiones regulares en Python - milugar.net
Es bastante completo y en mi caso particular me ha sido de gran ayuda.
Expresiones regulares en Python - milugar.net
Usuarios virtuales vs usuarios sin shell
Pongámonos en situación:
Tenemos que dar acceso FTP e IMAP a un cierto número de usuarios, para que puedan colgar sus ficheros y tener su correo electrónico almacenado. Nuestra política de seguridad más básica a la hora de crear los usuarios será la de darles acceso a estos servicios pero denegarles las entradas a la shell (más que básico es obvio). Para realizar esta tarea, tenemos dos opciones:
a) Crear usuarios virtuales en cada uno de los servicios con sus consecuentes políticas de acceso. Esta opción es profesional, segura pero muy lenta y tediosa de administrar.
b) Añadir los usuarios que nos interese a una shell nula, con lo que nunca podrán hacer login. Es una solución sobria y rápida. Los pasos que debemos seguir son los siguientes:
1.- Añadir la shell nula a la lista de shells permitidas: echo "/bin/false" >> /etc/shells
2.- Indicar a los usuarios la shell que deben usar: useradd -g users -s /bin/false -d /home/nombre_usuario nombre_usuario
Sencillo, rápido y efectivo!
Tenemos que dar acceso FTP e IMAP a un cierto número de usuarios, para que puedan colgar sus ficheros y tener su correo electrónico almacenado. Nuestra política de seguridad más básica a la hora de crear los usuarios será la de darles acceso a estos servicios pero denegarles las entradas a la shell (más que básico es obvio). Para realizar esta tarea, tenemos dos opciones:
a) Crear usuarios virtuales en cada uno de los servicios con sus consecuentes políticas de acceso. Esta opción es profesional, segura pero muy lenta y tediosa de administrar.
b) Añadir los usuarios que nos interese a una shell nula, con lo que nunca podrán hacer login. Es una solución sobria y rápida. Los pasos que debemos seguir son los siguientes:
1.- Añadir la shell nula a la lista de shells permitidas: echo "/bin/false" >> /etc/shells
2.- Indicar a los usuarios la shell que deben usar: useradd -g users -s /bin/false -d /home/nombre_usuario nombre_usuario
Sencillo, rápido y efectivo!
pyGoogle, búsquedas en tus programas
En ocasiones puede resultar útil el realizar búsquedas en Google desde nuestros programas escritos en Python. En mi caso, he utilizado este módulo para crear un simple bot IRC que escucha el comando !google y realiza búsquedas mostrando los dos primeros resultados en el canal.
El módulo puede obtenerse en su repositorio de SourceForge y para poder acceder al API de Google es necesario dar de alta una cuenta de desarrollador gratuíta. La forma de utilizarlo es la siguiente:
import google
parametro = "texto a buscar"
google.setLicense("mi_licencia_del_API_de_Google")
google.maxResults=2
google.language="es"
busqueda = google.doGoogleSearch(parametro)
print busqueda.results[0].URL + busqueda.results[0].title
print busqueda.results[1].URL + busqueda.results[1].title
El módulo puede obtenerse en su repositorio de SourceForge y para poder acceder al API de Google es necesario dar de alta una cuenta de desarrollador gratuíta. La forma de utilizarlo es la siguiente:
import google
parametro = "texto a buscar"
google.setLicense("mi_licencia_del_API_de_Google")
google.maxResults=2
google.language="es"
busqueda = google.doGoogleSearch(parametro)
print busqueda.results[0].URL + busqueda.results[0].title
print busqueda.results[1].URL + busqueda.results[1].title
Suscribirse a:
Entradas (Atom)