# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

Encapsular tráfico a través de un tunel cifrado con SSH

Hoy vamos a ver como conseguir establecer conexiones cifradas mediante SSH (Openssh) a protocolos/servicios que no están sirviendo su tráfico encriptado. La mayoría de vosotros sabréis que es sencillo “esnifar” el tráfico dentro de una misma red, gracias a este encapsulamiento de tráfico (que es muy sencillo) podemos cifrar el tráfico entre dos equipos independientemente de que el servicio lo ofrezca sin ningún tipo de cifrado. Eso sí, hay que tener conexión vía ssh al servidor destino.

Vamos a verlo con ejemplos ya que resulta más sencilla la explicación de este modo. Pongamos el caso de que queremos conectar de forma segura al sitio web http://test.com. Este sitio web no sirve el contenido por protocolo seguro así que todo el tráfico se podrá visualizar sin problemas desde cualquier equipo de esta red local, por ejemplo con el programa Wireshark (analizador de protocolos de red) lo podemos verificar.

Primero accedemos directamente desde el navegador desde http://test.com, el analizador de tráfico muestra todos los paquetes de información sin cifrar:

whireshark

Ahora, lo que vamos a hacer es crear un tunel de cifrado entre las dos máquinas. Utilizaremos el puerto local 9999 para servir el contenido que previamente encapsulamos por conexión segura desde el servidor que sirve todos los datos (test.com). Para ello creamos una conexión SSH al servidor destino y creamos un tunel entre nuestro puerto 9999 local y el puerto remoto 80 (http):

# ssh alex@test.com -L 9999:pruebas.com:80 -N

Nota: si queréis que el proceso quede en segundo plano y no aparezca la shell ssh en la consola debéis usar el parámetro

-f

.

-N

hace que no se puedan ejecutar comandos SSH en el servidor remoto.

Ahora, podemos acceder al mismo sitio web (http://test.com) desde nuestro equipo, de forma local a través del puerto 9999. Simplemente ponemos en el navegador:

http://localhost:9999

Vemos que efectivamente, al acceder de este modo estamos sirviendo el mismo contenido pero esta vez completamente cifrado:

whireshark cifrado

Una vez conocida la sintaxis del tunneling (

man ssh

) podemos aplicar este mismo recurso a cualquier otro servicio (http, ftp, smtp, pop).

Como información extra os dejo una excelente explicación de Tunel SSH poor parte de la Wikipedia:

El protocolo SSH (secure shell) se utiliza con frecuencia para tunelizar tráfico confidencial sobre Internet de una manera segura. Por ejemplo, un servidor de ficheros puede compartir archivos usando el protocolo SMB (Server Message Block), cuyos datos no viajan cifrados. Esto permitiría que una tercera parte, que tuviera acceso a la conexión (algo posible si las comunicaciones se realizan en Internet) pudiera examinar a conciencia el contenido de cada fichero trasmitido.
Para poder montar el sistema de archivo de forma segura, se establece una conexión mediante un túnel SSH que encamina todo el tráfico SMB al servidor de archivos dentro de una conexión cifrada SSH. Aunque el protocolo SMB sigue siendo inseguro, al viajar dentro de una conexión cifrada se impide el acceso al mismo.
Por ejemplo, para conectar con un servidor web de forma segura, utilizando SSH, haríamos que el cliente web, en vez de conectarse al servidor directamente, se conecte a un cliente SSH. El cliente SSH se conectaría con el servidor tunelizado, el cual a su vez se conectaría con el servidor web final. Lo atractivo de este sistema es que hemos añadido una capa de cifrado sin necesidad de alterar ni el cliente ni el servidor web.

Redirigir tráfico entre puertos TCP con tcptunnel

Tcptunnel permite redirigir tráfico desde un puerto TCP a otro, escuchando en el puerto local y redirigiendo todo el tráfico hacia el puerto remoto que le indiquemos.

Tcptunnel puede ser utilizado con protocolos basados en TCP como HTTP, SMTP, POP, IRC, etc. y ha sido probado en GNU/Linux, FreeBSD, Solaris, HP-UX, Windows XP y Windows Server 2008.

Personalmente lo he probado entre dos máquinas CentOS y por el momento ha funcionado de forma correcta. En breve lo usaré en “producción” así que esperaremos a ver que tal. Os dejo unos ejemplos de utilización y su instalación.

Instalación

# wget http://www.vakuumverpackt.de/tcptunnel/tcptunnel-0.2.tar.gz
# tar -xzvf tcptunnel-0.2.tar.gz
# cd tcptunnel-0.2
# ./configure --install-dir=/usr/local/bin
# make
# make install

Ejemplos de uso

En este ejemplo queremos redirigir todo el tráfico SMTP local contra el puerto SMTP de la máquina remota 192.168.0.100:

# tcptunnel --local-port=25 --remote-port=25 --remote-host=192.168.0.100 --stay-alive

En este ejemplo redirigimos el tráfico POP local (puerto 110) contra el puerto 111 del equipo remoto 192.168.0.100:

# tcptunnel --local-port=110 --remote-port=111 --remote-host=192.168.0.100 --stay-alive

En este ejemplo redirigimos el tráfico HTTP local (puerto 80) contra el puerto 80 del equipo remoto 192.168.0.100:

# tcptunnel --local-port=80 --remote-port=80 --remote-host=192.168.0.100 --stay-alive

Modo de uso:

# tcptunnel --help
Usage: tcptunnel [options]

Options:
  --version
  --help               this help

  --local-port=PORT    port to redirect
  --remote-port=PORT   target port
  --remote-host=HOST   target host

  --stay-alive
  --log-to-stdout

Si alguien conoce una forma más óptima de hacerlo, ¡soy todo oídos!

Cómo montar un servidor DHCP

Esta es una forma sencilla de instalar y configurar un servidor DHCP en una máquina Linux (Red-Hat, CentOS, Fedora). Voy a mostraros los pasos para hacerlo y una configuración básica para hacer funcionar el equipo como servidor DHCP.

DHCP (sigla en inglés de Dynamic Host Configuration Protocol – Protocolo Configuración Dinámica de Servidor) es un protocolo de red que permite a los nodos de una red IP obtener sus parámetros de configuración automáticamente. Se trata de un protocolo de tipo cliente/servidor en el que generalmente un servidor posee una lista de direcciones IP dinámicas y las va asignando a los clientes conforme éstas van estando libres, sabiendo en todo momento quién ha estado en posesión de esa IP, cuánto tiempo la ha tenido y a quién se la ha asignado después. (Wikipedia)

En primera instancia, instalamos el paquete necesario vía yum:

yum install dhcp.i586

Una vez instalado, podemos utilizar como base para el fichero de configuración el que nos ofrecen con la instalación. Incorpora comentarios sobre cada una de las opciones y configuraciones para hacer más sencilla la puesta en marcha del servicio:

cp /usr/share/doc/dhcp-4.1.0p1/dhcpd.conf.sample /etc/dhcp/dhcp.conf

El fichero de ejemplo es el siguiente:

# dhcpd.conf
#
# Sample configuration file for ISC dhcpd
#

# option definitions common to all supported networks...
option domain-name "example.org";
option domain-name-servers ns1.example.org, ns2.example.org;

default-lease-time 600;
max-lease-time 7200;

# Use this to enble / disable dynamic dns updates globally.
#ddns-update-style none;

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
#authoritative;

# Use this to send dhcp log messages to a different log file (you also
# have to hack syslog.conf to complete the redirection).
log-facility local7;

# No service will be given on this subnet, but declaring it helps the
# DHCP server to understand the network topology.

subnet 10.152.187.0 netmask 255.255.255.0 {
}

# This is a very basic subnet declaration.

subnet 10.254.239.0 netmask 255.255.255.224 {
 range 10.254.239.10 10.254.239.20;
 option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org;
}

# This declaration allows BOOTP clients to get dynamic addresses,
# which we don't really recommend.

subnet 10.254.239.32 netmask 255.255.255.224 {
 range dynamic-bootp 10.254.239.40 10.254.239.60;
 option broadcast-address 10.254.239.31;
 option routers rtr-239-32-1.example.org;
}

# A slightly different configuration for an internal subnet.
subnet 10.5.5.0 netmask 255.255.255.224 {
 range 10.5.5.26 10.5.5.30;
 option domain-name-servers ns1.internal.example.org;
 option domain-name "internal.example.org";
 option routers 10.5.5.1;
 option broadcast-address 10.5.5.31;
 default-lease-time 600;
 max-lease-time 7200;
}

# Hosts which require special configuration options can be listed in
# host statements.   If no address is specified, the address will be
# allocated dynamically (if possible), but the host-specific information
# will still come from the host declaration.

host passacaglia {
 hardware ethernet 0:0:c0:5d:bd:95;
 filename "vmunix.passacaglia";
 server-name "toccata.fugue.com";
}

# Fixed IP addresses can also be specified for hosts.   These addresses
# should not also be listed as being available for dynamic assignment.
# Hosts for which fixed IP addresses have been specified can boot using
# BOOTP or DHCP.   Hosts for which no fixed address is specified can only
# be booted with DHCP, unless there is an address range on the subnet
# to which a BOOTP client is connected which has the dynamic-bootp flag
# set.
host fantasia {
 hardware ethernet 08:00:07:26:c0:a5;
 fixed-address fantasia.fugue.com;
}

# You can declare a class of clients and then do address allocation
# based on that.   The example below shows a case where all clients
# in a certain class get addresses on the 10.17.224/24 subnet, and all
# other clients get addresses on the 10.0.29/24 subnet.

class "foo" {
 match if substring (option vendor-class-identifier, 0, 4) = "SUNW";
}

shared-network 224-29 {
 subnet 10.17.224.0 netmask 255.255.255.0 {
   option routers rtr-224.example.org;
 }
 subnet 10.0.29.0 netmask 255.255.255.0 {
   option routers rtr-29.example.org;
 }
 pool {
   allow members of "foo";
   range 10.17.224.10 10.17.224.250;
 }
 pool {
   deny members of "foo";
   range 10.0.29.10 10.0.29.230;
 }
}

Veréis que es un fichero con muchísimas opciones, os dejo un ejemplo más sencillo. En el siguiente dhcp.conf utilizamos la interfaz de red eth0 para las tareas de DHCP, esta interfaz tiene configurada la red 192.168.0.0/24 (subnet), sobre la cual vamos a reservar las IPs desde la 192.168.0.200 a la 192.168.0.220 para las asignaciones DHCP (range).

Esto es lo más básico, respecto a las distintas opciones añadidas en el fichero sample de configuración véis especificado lo que es cada cosa:

ddns-update-style none;
ddns-updates off;
deny client-updates;
one-lease-per-client false;
allow bootp;
option T150 code 150 = string;

subnet 192.168.0.0 netmask 255.255.255.0 {
  interface eth0;
   range 192.168.0.200 192.168.0.220;
       option subnet-mask 255.255.255.0;
       default-lease-time 6000;
       max-lease-time 7200;
       option time-offset -3600;
}

Finalmente, arrancamos el servicio:

/etc/init.d/dhcp start

Y el log (en mi caso vuelca a messages):

Oct 23 19:35:37 sylv1006 dhcpd: Internet Systems Consortium DHCP Server 4.1.0p1
Oct 23 19:35:37 sylv1006 dhcpd: Copyright 2004-2009 Internet Systems Consortium.
Oct 23 19:35:37 sylv1006 dhcpd: All rights reserved.
Oct 23 19:35:37 sylv1006 dhcpd: For info, please visit http://www.isc.org/sw/dhcp/
Oct 23 19:35:37 sylv1006 dhcpd: Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not specified in the config file
Oct 23 19:35:47 sylv1006 dhcpd: Internet Systems Consortium DHCP Server 4.1.0p1
Oct 23 19:35:47 sylv1006 dhcpd: Copyright 2004-2009 Internet Systems Consortium.
Oct 23 19:35:47 sylv1006 dhcpd: All rights reserved.
Oct 23 19:35:47 sylv1006 dhcpd: For info, please visit http://www.isc.org/sw/dhcp/
Oct 23 19:35:47 sylv1006 dhcpd: Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not specified in the config file
Oct 23 19:35:47 sylv1006 dhcpd: Wrote 0 leases to leases file.
Oct 23 19:35:47 sylv1006 dhcpd: Listening on LPF/eth0/00:16:3e:1d:36:42/192.168.0.0/24
Oct 23 19:35:47 sylv1006 dhcpd: Sending on   LPF/eth0/00:16:3e:1d:36:42/192.168.0./24
Oct 23 19:35:47 sylv1006 dhcpd: Sending on   Socket/fallback/fallback-net

Ahora que todo funciona correctamente, podemos configurar DHCP para que arranque automáticamente:

chkconfig dhcpd on

Chuletas de redes y comunicaciones

Gracias a All About Linux he encontrado una excelente recopilación de chuletas (Cheat Sheets) relacionadas con el mundo de las redes y comunicaciones. Concretamente hay de los siguientes temas:

  • Protocolos (BGP,EIGRP, First Hop Redundancy, IEEE 802.11 WLAN, IEEE 802.1X, IPsec, IPv4 Multicast, IPv6, IS-IS, OSPF, Spanning Tree).
  • Aplicaciones (tcpdump,Wireshark display filters).
  • Referencia (IOS IPv4 Access Lists, IPv4 Subnetting, Common Ports).
  • Sintaxis (Markdown, MediaWiki).
  • Tecnologías (Frame Mode MPLS, QoS, VLANs).
  • Miscelanea (Cisco IOS Versions, Physical terminations).

Sin duda muy recomendable para guardar en nuestros marcadores o incluso para imprimir y colgar en la pared. El enlace es el siguiente:

Cheat Sheets de redes y comunicaciones

Chuleta de creación de subredes (Subnetting)

Una entrada rápida para guardar en el archivo una excelente guía para hacer subnetting de redes, sobre todo para aquellos como yo que andamos un poco peces en el tema. Esta centrada en la creación de subredes para bloques de clase C.

- Enlace guía/chuleta para creación de subredes.

Estadísticas y monitorización de red con IPTraf

IPTraf
IPTraf

IPTraf es un excelente programa (para shell/consola) que permite recopilar estadísticas del tráfico de red en una máquina o LAN y además también permite monitorizar a tiempo real el tráfico de cada una de las interfaces de red del servidor, indicando el tráfico TCP/UDP, nº de paquetes recibidos/enviados, contador de bytes, etc.

Las características de la IPTraf son las siguientes:

  • Monitor de tráfico IP que muestra todo el tráfico IP que pasa a través de tu red, incluyendo información de TCP Flags, contador de paquetes y bytes, detalles ICMP y tipo de paquetes OSPF.
  • Estadísticas generales y detalladas de cada una de las interfaces de red, mostrando tráfico y contador de paquetes IP, TCP, UDP, ICMP, no-IP y otros contadores de paquetes IP, errores de IP checksum, actividad de las interfaces y contador de tamaño de paquetes.
  • Servicio de monitorización de paquetes de entrada y salida TCP y UDP de los puertos de aplicaciones comunes.
  • Estadísticas LAN, hosts activos y sus estadísticas de red
  • Filtros de vista para ver el tráfico de un determinado protocolo (TCP/UDP)
  • Sistema de logs.
  • Soporta interfaces Ethernet, FDDI, ISDN, SLIP, PPP, y loopback
  • Menú interactivo y pantalla completa.

Los protocolos que reconoce son los siguientes:

  • IP
  • TCP
  • UDP
  • ICMP
  • IGMP
  • IGP
  • IGRP
  • OSPF
  • ARP
  • RARP

IPTraf está disponible para descarga en los sistemas de paquetes de las siguientes distribuciones:

Merece la pena probarlo, os va a permitir monitorizar la red del servidor o LAN de una forma muy sencilla y con multitud de información al alcance de un par de teclas.

Configurar tarjeta de red en modo promiscuo

En informática, el modo promiscuo es aquel en el que una computadora conectada a una red compartida, tanto la basada en cable de cobre como la basada en tecnología inalámbrica, captura todo el tráfico que circula por ella. Este modo está muy relacionado con los sniffers que se basan en este modo para realizar su tarea.

Wikipedia

Si necesitáis configurar una tarjeta de red en modo promiscuo dentro de sistemas Red Hat o derivados, a la hora de configurar la interfaz de red debéis añadir el parámetro “-promisc”:

ifconfig eth0 -promisc

CentOS & Red-Hat: Configurar interfaz de red para trabajar en Full Duplex con ETHTOOL_OPTS

Ya hace un tiempo os dije las distintas formas de configurar una interfaz de red en sistemas Red-Hat, CentOS y derivados. Yendo un poco más lejos es posible que necesitemos configurar la interfaz para que trabaje en un modo de transimisión determinado, por ejemplo Full Duplex, Half Duplex, etc. y con un determinado caudal, 100Mb 10Mb, etc.

Esto se puede configurar a través del parámetro ETHTOOL_OPTS, que debemos añadir dentro del fichero de configuración de la interfaz de red (ifcfg), ver manual de configuración de interfaz de red.

Os dejo un ejemplo de la línea que tendríamos que añadir al fichero de configuración de la interfaz para configurarla sin autonegociación, a una velocidad de 100Mb y en Full Duplex:

ETHTOOL_OPTS="autoneg off speed 100 duplex full"

Definiciones Wikipedia:

Full dúplex (dúplex)

Una simple ilustración de un sistema de comunicación full-duplex.

La mayoría de los sistemas y redes de comunicaciones modernos funcionan en modo dúplex permitiendo canales de envío y recepción simultáneos. Podemos conseguir esa simultaneidad de varias formas:

  • Empleo de frecuencias separadas (multiplexación en frecuencia)
  • Cables separados

Nota: No existen colisiones en Ethernet en el modo full-duplex.

Half dúplex (semidúplex)

Una simple ilustración de un sistema de comunicación half-duplex.

En ocasiones encontramos sistemas que pueden transmitir en los dos sentidos, pero no de forma simultánea. Puede darse el caso de una comunicación por equipos de radio, si los equipos no son full dúplex, uno no podría transmitir (hablar) si la otra persona está también transmitiendo (hablando) porque su equipo estaría recibiendo (escuchando) en ese momento. En radiodifusión, se da por hecho que todo duplex ha de poder ser bidireccional y simultáneo, pues de esta manera, se puede realizar un programa de radio desde dos estudios de lugares diferente.