Archivo de Etiquetas de 'Internet'

Registros NS, A, CNAME, MX y SPF de un DNS: ¿y eso qué es lo que es?

Tras enfrentarme por primera vez a la gestión de un registro DNS (uooooh :cool: :lol: ) voy a hacer un pequeño resumen de los principales campos que lo componen de cara a un usuario (tenéis una referencia rápida de todos los posibles en, como no, la wikipedia).

  • Registro NS (name server): indica los servidores de DNS autorizados para el dominio, es decir, a quién tengo que preguntar para saber acerca de los registros de dominio.com.
    Ejemplo: toharia.com NS ns15.ovh.net
  • Registro A (address): indica la dirección IP a la que se debe traducir ese nombre de dominio.
    Ejemplo: toharia.com A 94.23.62.64
  • Registro CNAME (canonical name): permite definir alias o nombres de domino equivalentes. Normalmente, se usa para definir subdominios (que casi siempre apuntarán al dominio principal, aunque no es obligatorio).
    Ejemplo: mail.toharia.com CNAME toharia.com, pero también diego.toharia.com CNAME deigote.com
  • Registro MX (mail exchange): permite definir a qué servidor se envía el correo electrónico del dominio en cuestión. Cuenta con un campo prioridad, por lo que para un mismo dominio se pueden definir varios registros MX con distinta prioridad, escogiéndose el primero que esté disponible en cada momento.
    Ejemplo: toharia.com MX 1 aspmx.l.google.com, toharia.com MX 5 alt1.aspmx.l.google.com. En la práctica, cuando un servidor SMTP (es decir, que envía correo) tiene que enviar un correo a diego@toharia.com, inspecciona los registros MX para toharia.com, y envía el correo al de mayor prioridad que encuentre disponible (en este caso, empezaría por alt1.aspmx.l.google.com, y luego seguiría con el resto).
  • Registro SPF (sender policy framework): permite definir qué servidores están autorizados para enviar correo electrónico del dominio. Su uso surgió como propuesta para acabar o al menos dificultar el spam (correos no deseados con publicidad, phishing, etcétera). Normalmente, los spammers envían correo electrónico desde direcciones recopiladas en internet (y a direcciones recopiladas en internet :D ), para que sea más difícil indentificar el correo como spam. Sin embargo, si el filtro antispam está bien implementado, mirará el registro SPF del dominio del remitente de un correo entrante, y si la dirección IP origen del correo no está entre las adminitidas en dicho registro, lo marcará como spam. Podéis aprender más sobre SPF en el sitio web oficial.
    Ejemplo: toharia.com SPF v=spf1 a mx include:aspmx.googlemail.com ~all. Si os fijáis, lo que viene a decir es que el campo spf incluye el registro A, el registro MX y el servidor aspmx.googlemail.com. Esto es porque los correos los enviaré desde el propio servidor que aloja toharia.com, desde los servidores de recepción de correo MX, y desde aspmx.googlemail.com (en mi caso sería redundante ya que los registros MX ya incluyen este servidor).

Nota: mis registros MX y SPF incluyen direcciones MX de Google porque el correo de ese dominio lo tengo gestionado con Google Apps. Por tanto, la recepción del correo siempre la hago en sus servidores, mientras que el envío la hago tanto desde sus servidores (cuando lo hago desde la aplicación web de correo electrónico de Google) como desde el servidor que aloja ese dominio (cuando lo hace alguna aplicación que corre en el mismo).

Subdominio o subdirectorio, esa era la cuestión

Mis lectores más observadores (y el único con el que he hablado del tema no ha demostrado serlo :P te espero en los comentarios) habrán notado que el nuevo blog está alojado en una URL distinta al anterior: ahora está en blog.deigote.com mientras que antes era deigote.com/blog.

Sin embargo, es muy probable que la entrada en la que se anuncia el nuevo blog, la cual está en el nuevo blog ( :roll: ). ¿Cómo es posible que si la URL ha cambiado los enlaces para el feed sigan siendo válidos? O una de dos: o mis lectores son muy poco observadores o pasotas, o tengo muy pocos lectores :-D (yo pienso que es una mezcla de los dos :cry: )

Volviendo a la pregunta anterior, la respuesta es haber usado un simple URL rewriting gracias al módulo mod_rewrite de Apache. Gracias a este módulo, es posible reescribir una URL cuando esta llega al servidor web, cambiando las cabeceras de la petición, y redirigiéndola a donde corresponde tras realizar el cambio.

En mi caso, he necesitado las siguientes reglas para el dominio deigote.com:

RewriteRule ^blog$ http://blog.deigote.com [L]
RewriteRule ^blog/(.*) http://blog.deigote.com/$1 [L]

La primera de ellas sirve para cuando la URL entrante es http://deigote.com/blog (sin un slash o barra del siete :-) al final). La segunda sirve para el resto de URLs que comiencen por http://deigote.com/blog. Seguro que algún lector (la esperanza es lo último que se pierde :lol: ) está pensando que ambas reglas se podrían fusionar en una como la siguiente:

RewriteRule ^blog(.*) http://blog.deigote.com$1 [L]

Es decir, eliminando los slash en la segunda regla para que englobe también el primer caso. El problema de hacer esto es que una URL del tipo http://deigote.com/blogstats sería redirigida a http://blog.deigote.comstats. Por ello, es mejor proteger todas las URLs con un slash al final y añadir una regla para el único caso en que no hace falta poner dicha barra (aunque quizá algún lector me corrija en este punto dándome una solución para unificar ambas reglas :-) ).

De esta manera, todos los enlaces anteriores, ya sean los del feed, entradas, comentarios, etcétera… siguen funcionando correctamente :-) .

PD: Si, tampoco es algo tan increible como para hacer una entrada tan larga, pero bueno, a mi me ha costado lo mío :-P .

Firewalling/accounting con iptables, averiguar la IP y algunas cosas más

Bueno. Creo que ya va tocando un poco de iptables, mi tema linuxero favorito :P. Pues nada, simplemente después de cierta pereza me he decidido a hacer un “firewall” con iptables para mi máquina. Pongo “firewall” entre comillas porque no hago filtrado en absoluto: estoy detrás del router, así que pocos ataques recibo. Encima los switches que comunican mis PC’s , al ser precisamente switches y no hub’s, separan los dominios de colisión y no recibo trafico ethernet de ninguna otra máquina. En fin, que no hay lugar para mucha experimentación. Sin embargo, un amante de las estadísticas de red como yo no puede dejar pasar la ocasión que brinda iptables de contar todo el tráfico que pasa por mi PC , por lo que he hecho el siguiente firewall, que pongo a continuación a trozos para comentar el propósito de cada cosa.

  • Para empezar, algunas variables. El nombre del script, la localización del mandato iptables, el puerto que uso para el emule y los puertos que uso para el bittorrent. Poca cosa :):
    
    #!/bin/sh
    # An extended firewall script.
    # Diego Toharia
    
    # Some vars
    N=/etc/init.d/firewall
    IPTABLES=/sbin/iptables
    EMULE_PORT=6889
    BT_PORT=6881:6888
    
  • Aquí esta la chicha de iptables. Las reglas, metidas dentro de una función. Como se puede ver hay poca cosa, y ni una sola acción de salto (-j, jump ). Así, por cada regla sólo se cuentan los paquetes que enlazan con la misma. Si quisíeramos filtrar alguna de ellas, añadimos -j DROP y listo :). Principalmente lo que hago es, primeramente, crear contadores de conexiones entrantes (es decir, el número de paquetes/bytes que generan las nuevas conexiones de clientes a programas con socket en estado LISTEN o en escucha), y luego añado varios contadores del tráfico generado tanto entrante como saliente por el emule, bittorrent, web, y globales (dentro y fuera de la LAN y en total). Como ya he comentado, no hay mucho más, ya que es una máquina detrás de un router y que no es router a su vez:
    
    # Rules definitions
    rules_def() {
        ############ CONNECTIONS COUNTERS ##################################
        # Count Emule connections
        $IPTABLES -A INPUT -m state --state NEW -p tcp --dport $EMULE_PORT
        # Count Bittorrent connections
        $IPTABLES -A INPUT -m state --state NEW -p tcp --dport $BT_PORT
        # Count Ssh connections
        $IPTABLES -A INPUT -m state --state NEW -p tcp --dport ssh
        # Count Http connections
        $IPTABLES -A INPUT -m state --state NEW -p tcp --dport http
        ############ TRAFIC COUNTERS #######################################
        # Count Emule input traffic
        $IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED         -p tcp --dport $EMULE_PORT
        # Count Bittorrent input traffic
        $IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED         -p tcp --dport $BT_PORT
        # Count Http traffic
        $IPTABLES -A INPUT  -p tcp --sport http
        $IPTABLES -A OUTPUT -p tcp --dport http
        # Count LAN traffic
        $IPTABLES -A INPUT -s 192.168.0.0/24
        $IPTABLES -A OUTPUT -d 192.168.0.0/24
        # Count inet traffic
        $IPTABLES -A INPUT -s ! 192.168.0.0/24
        $IPTABLES -A OUTPUT -d ! 192.168.0.0/24
        # Count all traffic
        $IPTABLES -A INPUT
        $IPTABLES -A OUTPUT
        ####################################################################
    }
    
  • Aquí pongo una función que averigua cuál es la dirección IP con la que navegamos por Internet, y cuales son las direcciones IP configuradas en nuestra máquina. Para hacerla, he usado la información del siguiente enlace: http://blog.enrique.barbeito.org/. Lo he encontrado usando Google, como no. Muchas gracias a Enrique Barbeito y su blog.
    
    # IP finder
    ipfinder() {
            IP_PUB=`lynx -dump www.cualesmiip.net | grep Tu | awk '{print $5}'`
            IP_PRIVS=`ifconfig | grep "inet addr" | cut -f2 -d: | cut -f1 -d' '`
            export IP_PUB=$IP_PUB
            export IP_PRIV=$IP_PRIVS
            echo "Public IP"
            echo $IP_PUB
            echo "Private IPs"
            echo $IP_PRIVS
    }
    
  • A continuación hago una función que, a partir de información guardada por el resto del script, calcula unas tasas de transferencia desde que se puso en marcha el script hasta que se paró (siempre que estas operaciones se hagan de forma correcta, es decir, arrancando y parando el script con las propias opciones del script). Esta funcionalidad, es, sin duda, la que más me gusta :P, todos los días consulto el trafico del dia anterior y me congratulo, jejeje:
    
    # Traffic rates
    traffic_rates() {
        START_TIME=`cat /var/run/firewall.start`
        FINISH_TIME=`cat /proc/uptime | awk '{print $1}' | cut -d'.' -f 1`
        UPTIME=`expr $FINISH_TIME - $START_TIME`
        INPUT_TRAFFIC=`sudo iptables -L INPUT -v -x | grep \!localnet | awk '{print $2}'`
        INPUT_RATE=`expr $INPUT_TRAFFIC / 1024 / $UPTIME`
        OUTPUT_TRAFFIC=`sudo iptables -L OUTPUT -v -x | grep \!localnet | awk '{print $2}'`
        OUTPUT_RATE=`expr $OUTPUT_TRAFFIC / 1024 / $UPTIME`
        echo "Input rate: $INPUT_RATE KB/s (`expr $INPUT_TRAFFIC / 1048576` MB)"
        echo "Output rate: $OUTPUT_RATE KB/s (`expr $OUTPUT_TRAFFIC / 1048576` MB)"
    }
    
  • Por último, el “programa principal” del script. Está hecho a modo de script de los del init.d, para ser arrancado por el mismo (luego explicaré cómo hacerlo). Se encarga de coordinar lo anterior para, por cada start y stop, guardar en un log el accounting, la direccion IP , y las tasas de tráfico del intervalo de tiempo entre los mismos:
    
    case "$1" in
      start)
            cat /proc/uptime | awk '{print $1}' | cut -d'.' -f 1             > /var/run/firewall.start
            echo "Firewall: setting up iptables rules.."
            echo "###############################################"             > /var/run/firewall
            echo -n "Traffic from " >> /var/run/firewall
            date +%k:%M" of "%A' '%D >> /var/run/firewall
            rules_def
            ipfinder >> /var/run/ipfinder
            ;;
        stop)
            echo "Firewall: saving counters.."
            echo -n "To " >> /var/run/firewall
            date +%k:%M" of "%A' '%D >> /var/run/firewall
            echo "###############################################"             >> /var/run/firewall
            iptables -L -v >> /var/run/firewall
            echo "###############################################"             >> /var/run/firewall
            ipfinder >> /var/run/firewall
            echo "###############################################"             >> /var/run/firewall
            traffic_rates >> /var/run/firewall
            echo "###############################################"             >> /var/run/firewall
            mv /var/run/firewall /var/log/firewall/log.`date +%d_%m_%y_%H_%M`
            echo "Firewall: flushing iptables rules.."
            iptables -F
            iptables -X
            rm /var/run/ipfinder
            rm /var/run/firewall.start
            ;;
        reload|restart|force-reload)
            $N stop
            $N start
            ;;
      *)
            echo "Usage: $N {start|stop|restart|force-reload}" >&2
            exit 1
            ;;
    esac
    
    exit 0
    

Si poneis cada parte del código seguida, tendreis el script completo. Durante la ejecución del mismo podeis encontrar vuestra ip en el fichero /var/run/ipfinder, quedando los logs almacenados en el directorio /var/log/firewall que previamente debeis crear. Poniendo este fichero en /etc/init.d/ con el nombre firewall y ejecutando rcconf, o el mandato update_rec.d firewall defaults, lo tendreis todo funcionando, y podreis disponer de unas sencillas estadísticas para los que no queremos complicarnos la vida (para los que si quieran, a conjugar iptables con ntop, que me ha parecido potentisimo, y snort, que no lo he usado más que como sniffer pero es un potente detector de intrusos). Sigo buscando cómo hacer accounting del resto de máquinas, ya que aunque ponga la interfaz en modo promiscuo, iptables no procesa el tráfico que llega de otros PC’s . Mis posteriores descubrimientos, aquí, en próximas ediciones ;). No puedo terminar el artículo sin agradecer a Oskar Andreasson su magnifico trabajo con el tutorial de iptables, con el que yo me inicie y que es mi referencia para este tema.

Por supuesto, sólo para Linux.