LinuxParty

NUESTRO SITIO necesita la publicidad para costear hosting y el dominio. Por favor considera deshabilitar tu AdBlock en nuestro sitio. También puedes hacernos una donación entrando en linuxparty.es, en la columna de la derecha.

Ratio: 5 / 5

Inicio activadoInicio activadoInicio activadoInicio activadoInicio activado
 

LPIC-1 Capítulo 8

 

EN ESTE CAPÍTULO SE ABARCAN LOS SIGUIENTES OBJETIVOS DEL EXAMEN:

  • 109.1: Fundamentos de los protocolos de Internet (4)
  • 109.2: Configuración básica de redes (4)
  • 109.3: Resolución de problemas básicos de red (4)
  • 109.4: Configuración DNS en el lado del cliente (2)

 Configuración básica de redes TCP/IP

 Configurar la red en Linux

Durante la instalación de una distribución de Linux, lo mas normal es que se pida que realicemos la configuración de la tarjeta de red de forma casi automática, con una serie de parámetros que nos permitan conectarnos a Internet o bien mantener comunicación con los dispositivos de nuestra red local. Normalmente basta con marcar que queremos recibir unos parámetros de forma automática vía DHCP. No obstante podremos introducir de forma manual y personalizada esos valores si indicamos que queremos conservar una configuración estática.

Los parámetros mínimos para que una red pueda tener comunicación con el resto de dispositivos son: la dirección IP del host, la máscara de red, la puerta de acceso y un servidor DNS. Veremos estos y otros parámetros en la sección de “configuración de red con parámetros estáticos

Para aprender a configurar la red desde 0 vamos a suponer que no la hemos configurado ya durante la instalación y que además no vamos a usar las herramientas GUI que se nos ofrecen para tal fin. Dicho esto comencemos.

Instalando el hardware de red

Lo primero que deberemos de hacer en caso de que nuestro equipo no cuente con un hardware de red interno, será instalar una tarjeta de red en la placa base o vía USB. Una vez tengamos la tarjeta instalada y el sistema en funcionamiento, deberemos de asegurarnos de que el módulo de la tarjeta está cargado. Esta operación de carga normalmente la lleva a cabo el propio sistema mediante scripts de inicio, pero si nuestro sistema no ha detectado nuestro hardware, podremos cargar nosotros mimos el controlador. Para cargar el módulo de la tarjeta será necesario contar con dicho módulo y conocer su nombre. A continuación pasaremos a cargarlo con el comando modprobe:

# modprobe <módulo>

Con la tarjeta ya instalada y cargado so módulo e incluso configurado para ser cargado al inicio pasaremos a configurarla.

Nota: De compilar un kernel deberemos de asegurarnos que incluimos el módulo para la tarjeta de red.

Configurando el hardware de red

Podemos configurar la tarjeta de red para que acceda a Internet o se comunique con el resto de dispositivos de la red local de varias maneras. Si descartamos como ya dijimos anteriormente las herramientas GUI, podremos configurar la red vía DHCP o con parámetros estáticos a través de los archivos de configuración.

Configurar la red con DHCP

Es la forma mas sencilla de configurar un ordenador para que utilice una red TCP/IP. Básicamente el funcionamiento con DHCP es el siguiente: En la red existirá un ordenador que ejecuta un servidor DHCP o bien un router, el cual tiene configurado los parámetros necesarios para que los ordenadores de la red puedan acceder a ella. Estos parámetros son normalmente una IP de red, un rango de IP dentro de la red, un servidor DNS, una máscara de red y una puerta de acceso. Es posible añadir otros parámetros como nombres de hosts o servidores DNS secundarios.

Todas las distribuciones Linux tienen como mínimo un cliente DHCP por defecto que inicia al arranque del sistema a través de su script de inicio o desde el archivo principal de configuración de la red. Cuando este arranca, el cliente DHCP envía una multidifusión en busca de un servidor DHCP. El servidor responde utilizando únicamente la dirección de hardware del cliente (es decir la MAC de la tarjeta de red) con la información de configuración que el cliente necesita para poder comunicarse con los demás ordenadores. De esta manera el cliente tendrá asignada una IP temporal (en caso de no ser renovada, esta puede pasar a utilizarse por otro dispositivo de la red) una puerta de enlace y aquellos parámetros configurados en el servidor o router.

Nota: En Linux hay tres clientes DHCP de uso habitual que son pump, dhclient y dhcpcd. Los tres pueden ser ejecutados además de por sus archivos de inicio o de configuración de red, como herramientas corrientes del sistema bajo el usuario root (# dhclient eth0). Por defecto en la gran mayoría de distribuciones el nombre de la interfaz es eth0, aunque esto puede cambiar

Ahora que conocemos el funcionamiento de DHCP, vamos a configurar nuestro ordenador para que haga uso de este servicio. Para esto solo tendremos que acudir al archivo de configuración de la interfaz de red y modificar una línea. Para sistemas Red-Hat y Fedora este archivo suele encontrarse en /etc/sysconfig/network-scripts/ifcfg-<nombre_interfaz>, mientras que para sistemas Debian y derivados puede que el archivo en cuestión sea /etc/network/interfaces cuyo objetivos son similares pero los detalles quizás difieran.

Una vez localizado el archivo de configuración de interfaz en nuestro sistema deberemos de modificar la siguiente línea:

  • Para Red-Hat y Fedora:
BOOTPROTO=dhcp
  • Para Debian y derivados:
iface eth0 inet dhcp

Nota: Como ya avisamos antes, el nombre de la interfaz puede cambiar.

Configurar la red con valores estáticos

Si una red carece de servidor DHCP o simplemente queremos que nuestro ordenador que va a funcionar como un servidor web mantenga su IP de forma estática, deberemos de configurar los valores IP mediante su archivo de configuración, uno a uno.

  • Archivo de configuración de Red-Hat y Fedora (otros como CentOS, derivado de Red-Hat usan el mismo formato y archivo):
$ sudo cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="static"
IPADDR="192.168.1.32"
NETMASK="255.255.255.0"
NETWORK="192.168.1.0"
BROADCAST="192.168.1.255"
GATEWAY="192.168.1.1"
ONBOOT="yes"

Los parámetros de configuración son ya conocidos (si hemos seguido el estudio de secciones anteriores), pero vamos a destacar DEVICE el cual es el identificador del dispositivo, BOOTPROTO que como vemos a diferencia de la configuración anterior, en este caso es estática, la GATEWAY que además de configurarse en este archivo podrá ser configurada igualmente mediante el comando route o de forma permanente en otro archivo como /etc/sysconfig/network/routes (Red-Hat y Fedora) y ONBOOT que al estar en ‘yes‘ lo que hará será arrancar la configuración al momento del inicio del sistema. Podemos preguntar que donde se encuentran configuradas las IP de los DNS, la respuesta es en el archivo /etc/resolv.conf, el cual admite hasta tres servidores y son definidos uno por línea con el siguiente formato:

namserver <ip-servidor>

También podemos definir en este archivo el nombre de nuestro dominio local utilizando la línea:

domain <nombre-de-nuestro-dominio>

Nota: La gateway no es necesaria en sistemas que no se vayan a conectar a redes mas grandes, es decir que sólo se encuentren trabajando en una red local que no contiene router.

  • Archivo de configuración Debian y derivados:
$ sudo cat /etc/network/interfaces
iface eth0 inet static
address 192.168.1.23
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.1
hwaddress 81:ab:1c:59:aa:7b
up <comando>

Nota: Como curiosidad debemos mencionar la posibilidad de ejecutar comandos desde este archivo de configuración. En este ejemplo se a utilizando up <comando> para ejecutar un comando al ‘levantar‘ la tarjeta de red, pero existe la posibilidad de ejecutarlo al ‘bajarla‘ o antes y después de levantarla/bajarla con down, pre-up, pre-down, post-up y post-down respectivamente.

Importante: Es importante saber que si estamos utilizando herramientas GUI como NetworkManager para la configuración de nuestros hardware de red, nos encontremos que los archivos anteriormente mencionados están vacios o sus líneas comentadas. Esto se debe a que estas aplicaciones guardan sus configuraciones en otros archivos. Por ejemplo el archivo de configuración para LinuxMint (derivado de Debian) es /etc/NetworkManager/system-connections/<nombre-conexión> y su contenido puede ser parecido al siguiente:

[802-3-ethernet]
mac-address=88:AE:1D:69:5A:5A

[connection]
id=wired-11
uuid=212274c7-08bc-4586-9h49-c1u218p9239f
type=802-3-ethernet
timestamp=1424866869

[ipv6]
method=auto

[ipv4]
method=manual
dns=8.8.8.8;8.8.4.4;
address1=192.168.1.50/24,192.168.1.1 

Mostrar información sobre la configuración de la red

Con el comando ifconfig ya mencionado en secciones anteriores podremos mostrar la configuración de la red. Basta con escribir $ ifconfig y será mostrada la información de todas las interfaces configuradas. Si queremos mostrar solo una, deberemos de pasar su identificador como parámetro de ifconfig:

$ ifconfig eth0

El comando ifconfig nos permite ademas configurar una interfaz de red directamente desde la línea de comandos, siempre y cuando se siga su sintaxis y especifiquemos en ella los valores pertinentes:

# ifconfig eth0 up 192.168.50 netmask 255.255.255.0

Para añadir la puerta de acceso podemos usar route:

# route add default gw 192.168.1.1

Además, podemos utilizar route para efectuar un diagnóstico de la configuración de red, por ejemplo:

route

La primera línea indica que todo el tráfico saliente hacia Internet desde eth0 saldrá por la puerta de acceso 192.168.1.1 mientras que la segunda línea indica que los datos destinados a cualquier ordenador dentro de nuestra red local pasan directamente por eth0.

Una vez configurada la tarjeta de red y con esto la conexión a Internet o red del equipo, podremos hacer uso del comando ifup para levantar la red. ifup es también útil para comprobar la configuración, ya que de no levantar la red podríamos sospechar de que algo anda mal y posteriormente usar ifconfig o route para depurar la configuración. De la misma manera podremos usar ifdown para cerrar las conexiones. Ambos comandos se implementan como scripts que consultan los archivos de configuración y ejecutan entre bastidores comandos relevantes de bajo nivel.

Configurar el nombre de un equipo

Es importante dar un nombre a nuestro equipo, ya sea de forma local o dependiendo de servidores DNS de nuestra red. Podemos dar un nombre a nuestro equipo en la red para que sea reconocido por el resto de dispositivos de dos formas diferentes, bien a través de una entrada en la base de datos DNS o bien modificando los archivos /etc/hosts de todos los dispositivos de la red. Los equipos con Windows también disponen de este archivo solo que evidentemente en otra ruta.

Si por el contrario queremos dar un nombre a nuestro equipo de forma local podremos usar la herramienta hostname, la cual sirve tanto para cambiar el nombre de forma temporal, es decir al reiniciar volveremos al nombre anterior o, mostrar el nombre actual del equipo. Para mostrar el nombre bastará con escribir el comando sin parámetro alguno. Para cambiar el nombre deberemos hacer lo siguiente:

# hostname <equipo.dominio>

Si lo que queremos es nombrarlo de forma permanente deberemos de editar el archivo /etc/hostname o /etc/HOSTNAME (dependiendo de la distribución) y añadiendo una línea con el nombre del equipo y dominio.

Nota: Tanto en el uso de hostname como en la edición del archivo, el nombre del dominio es opcional.

Ya que nos hemos decidido a cambiar el nombre de forma permanente, una vez modificado el archivo /etc/hostname o /etc/HOSTNAME es recomendable cambiar los siguientes archivos:

  • /etc/hosts: Añadir una línea con nuestra IP y nombre:

myhost

  • /etc/sysconfig/network: En distribuciones como Fedora o CentOS puede ser interesante cambiar el nombre de cara a la red. Podremos modificar el valor de la variable HOSTNAME por nuestro nombre

Existen dos comandos con los que mostrar o cambiar el nombre del dominio del ordenador. Si queremos modificar el nombre del dominio del ordenador utilizado por NIS (Network Information System, Sistema de información de red) utilizaremos el comando domainname, mientras que con dnsdomainname definiremos el nombre del dominio utilizado por DNS.

Advertencia: Estos comando no afectan a los servidores remotos, solo al nombre dato a los programas que emplean llamadas a estos servidores.

Configuración del enrutamiento

Como regla general los encargados de redirigir el tráfico en una red son los routers. Estos routers disponen de una tabla de enrutamiento o tabla de reglas compleja en la que se definen las rutas a tomar por los paquetes. No obstante nuestro Linux dispone de una tabla de reglas básica como ya vimos anteriormente con el comando route por lo que podremos redirigir tráfico a determinadas redes. Antes de nada, debemos de saber que esto no es una opción que venga por defecto en el sistema si no que deberemos de editar un archivo para que Linux comience a aceptar paquetes que van a otra red y sea el quien los redirija a esta. Podremos hacer esto de la siguiente forma:

# echo "1" > /proc/sys/net/ipv4/ip_forward

Si queremos hacer este cambio permanente deberemos de localizar el archivo /etc/sysctl.conf o /etc/sysconfig/sysctl (dependiendo de la distribución esto puede cambiar). Una vez localizado lo editaremos con nuestro editor de texto favorito y cambiaremos el valor del parámetro ‘net.ipv4.ip_forward = 0‘ por 1.

Nota: Si tenemos problemas para localizar este archivo en nuestra distribución, recodemos que disponemos de grep para localizar cadena de texto. Podemos usar como patrón ip_forward o similar.

Ahora que ya tenemos el sistema configurado para redirigir tráfico, tendremos que utilizar una herramienta para configurar una nueva puerta de acceso y ruta. Para esto usaremos el comando route.

Por defecto nuestra red tiene su propia puerta de enlace, la cual es la dirección del router (normalmente 192.168.1.1). Por esta puerta pasarán todos los paquetes proveniente de nuestra red con destino al exterior. Pero como queremos que ciertos paquetes destinados por ejemplo a la red 172.20.8.0/16 sean filtrado por otra puerta de acceso, configuraremos esta ruta tal que así:

# route add -net 172.20.8.0 netmask 255.255.0.0 gw 172.20.9.1

Donde:

  • -net 172.20.8.0: Indica el destino. En este caso una red (-net) con IP. Podríamos haber usado -host si el destino fuese un equipo concreto
  • 172.20.90.1: Es el router (puerta de acceso) por el que deberán de pasar los paquetes.

El archivo /etc/sysctl.conf y el comando sysctl

Este archivo es especialmente importante y aunque no se abarca en los propósitos del LPIC-1 no está de más que sepamos ahora que lo hemos modificado para hacer el reenvío de paquetes, que función es la que desempeña y como poder cambiar los parámetros que se encuentran definidos en él. El archivo /etc/sysctl.conf es usado para pasarle parámetros de configuración al kernel en tiempo de ejecución, es decir, se utiliza para configurar o cambiar el comportamiento del kernel que se está ejecutando. Equivale a modificar los valores de los archivos del sistema de archivos virtual /proc y mas concretamente a los del directorio /proc/sys solo que de hacerlo a través de los archivos, al reiniciar estos cambios no serán conservados, mientras que si modificamos los parámetros directamente desde /etc/sysctl.sys los cambios permanecerán. Para cambiar los valores de este archivo una vez que el sistema se encuentra arrancado usaremos el comando sysctl, el cual sirve tanto para visualizar parámetros como para modificarlos. Los parámetros a modificar se encuentran como ya hemos comentado en /proc/sys y los mas significativos suelen ser:

  • dev : Establece los parámetros de configuración de los dispositivos conectados.
  • fs : Parámetros relacionados con los sistemas de ficheros como los inodes, quotas, etc..
  • kernel : Comportamiento general del kernel
  • net : Los relacionados con la configuración de la red.
  • vm : Utilizados para configurar la memoria virtual

La sintaxis de sysctl es sencilla, como casi todo comando este acepta una serie de opciones y se le pasa la variable/parámetro a modificar junto con su valor:

sysctl [opciones] variable=valor

Alguna de las opciones mas habituales para sysctl son: -a (muestra todos los parámetros y sus valores asignados que se encuentran configurados en el sistema), -w (establece un valor indicado, no será permanente pero nos ayudará a comprobar sus resultados. En caso de ser favorables podremos hacer posteriormente los cambios permanentes modificando sysctl.conf) y -p (carga los valores de sysctl.conf)

El comando IP

Para terminar esta larga sección sobre “Configuración del hardware de red” vamos a comentar sobre el comando ip. El comando ip es el comando que pretende sustituir a ifconfig y route, y por supuesto a ifup y ifdown, vamos que es la navaja suiza con respecto a la configuración de la red. A día de hoy seguimos utilizando estos comandos pero sin duda con el paso del tiempo iremos haciéndonos a ip.

El comando ip forma parte de la iproute2 suite. Su uso está destinado a mostrar información sobre la configuración de los dispositivos de red, configurar rutas, políticas de rutas y túneles.  Veremos este comando mas a fondo como siempre en la sección de comandos correspondiente a este capítulo – 7. No obstante y como venimos haciendo a lo largo de la guía de estudios, vamos a nombrar sus principales funciones.

  • Mostrar la configuración de las interfaces de red (parecido a ifconfig):
$ ip addr [list|show] [dispositivo]
  • Activar o desactivar una interfaz:
$ ip link set eth0 up | down
  • Configurar un dispositivo de red:
$ ip addr add 192.168.1.25/24 broadcast 192.168.1.255 dev eth0
  • Eliminar la configuración IP de un dispositivo:
$ ip addr del 192.168.1.25/24 dev eth0
  • Activar el modo multicast para eth0:
$ ip link set dev eth0 multicast on
  • Informar sobre la tabla de rutas:
$ ip route [list|show]

En realidad la sintaxis de ip es sencilla, admite pocas opciones tras el comando y luego indicamos el objeto (link, addr, route, tunnel, etc…) sobre el que realizaremos una determinada acción (set, show, on, etc..) para un dispositivo (dev) concreto (eth0). Existen casos donde detrás del dispositivo se indica un parámetro como en el caso de activar (on) una interfaz. Podremos recurrir a la man de ip o también podemos obtener información sobre un objeto concreto mediante help:

$ ip link help

Diagnóstico de red

Cuando configuramos una red en ocasiones las cosas no siempre funcionan como se planean, es por ello que necesitamos recurrir a ciertas herramientas de diagnóstico o depuración de red para encontrar posibles fallas o simplemente porque deseamos auditar una red en busca de errores o funcionamientos poco fiables. Linux ofrece gran variedad de utilidades destinadas a este tipo de tareas. Vamos a estudiar en las siguientes secciones aquellas que son requisito imprescindible para hacernos con la certificación LPI 1.

  • Verificar la conectividad con un host remoto: ping (ping6)
  • Rastrear una ruta entre dos puntos: traceroute (traceroute6) y tracepath (tracepath6)
  • Auditar la red: netcat (o nc), netstat, iptraf, lsof y nmap
  • Sniffer, husmeador de red: tcpdump y Wireshark
  • Herramientas de diagnóstico adicionales (aunque no estén diseñadas para tal fin): Telnet y FTP

Nota: Las variantes “nombre6” están diseñadas para trabajar con IPv6. Por lo general suelen funcionar casi idénticamente a las de IPv4.

Verificar la conectividad básica

Uno de los primeros pasos que podemos dar para verificar si nuestra red tiene una buena configuración, o al menos la suficiente como para llegar a un destino especificado es usar el comando ping o ping6, este último es el análogo de ping pero para direcciones IPv6

Información: A partir de este momento cuando hablemos de ping6, traceroute6 o tracepath6 estaremos refiriendonós a los comandos usados para direcciones IPv6.

Con ping podremos verificar la conectividad con otros puntos de la red. Para ello el comando envía un paquete ICMP al sistema remoto y espera una respuesta. Esto lo hace de forma reiterada y sin cesar pero podremos limitar el número de envíos mediante la opción -c <num>, donde num es el número de envíos que queremos realizar o bien detener los envíos pulsando Control-C, lo que cancelará la ejecución del comando.

# ping -c 4 80.25.32.18 | unequipo | unequipo.sudominio | www.unservidor.edu

Podremos usar cualquiera de las opciones anteriores para indicar el host, pero solo una. En este caso ping enviará cuatro paquetes. Una respuesta al comando ping podría ser la siguiente:

PING google.es (216.58.211.195) 56(84) bytes of data.
64 bytes from mad01s25-in-f3.1e100.net (216.58.211.195): icmp_seq=1 ttl=55 time=37.5 ms
64 bytes from mad01s25-in-f3.1e100.net (216.58.211.195): icmp_seq=2 ttl=55 time=37.7 ms
64 bytes from mad01s25-in-f3.1e100.net (216.58.211.195): icmp_seq=3 ttl=55 time=38.1 ms
64 bytes from mad01s25-in-f3.1e100.net (216.58.211.195): icmp_seq=4 ttl=55 time=37.7 ms
--- google.es ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 37.571/37.829/38.164/0.213 ms

Podemos ver que los 4 paquetes fueron recibidos por el host y que ninguno se perdió y todo en un tiempo de 3004ms, lo que indica que tenemos conectividad con el host remoto.

Otras opciones como -i, -f, -n, -l, -p o -s pueden ser usadas tanto con ping como con ping6. La opción -i nos permite indicar un intervalo de tiempo entre el envío de cada paquete ICMP al host remoto, con -f podemos hacer un envío masivo de ping, esta opción es incompatible con la opción -i y lo que hace por defecto es envíar los paquetes con la misma velocidad que los recibe o cien veces por segundo, dependiendo de cual de ellos es mayor. El parámetro -n muestra solo salidas numéricas, es decir no hace ningún intento por buscar nombres simbólicos para los host remotos. Con -l ping intentará envia tantos paquetes tan rápido como le sea posible antes de volver a su comportamiento normal. La opción -p resulta útil para diagnosticar problemas de red relacionados con los datos, nos permite mediante un patrón -p <patrón> se puede completar un paquete con mas 16 bytes. Por su parte -s especifica el número de bytes que se van a enviar. La cantidad por defecto es 56 que sumando los 8 de la cabecera de paquetes ICMP pasan a ser 64 bytes. Existen otras opciones pero son poco usuales.

Una de las conclusiones que podemos sacar de la respuesta de ping es que si podemos hacer ping a máquinas dentro de nuestra red local pero no a máquinas externas a esta, es que tenemos un problema de configuración hacia el exterior, o si podemos hacer ping a una máquina mediante su IP pero no a su nombre, quizás el servicio DNS esté experimentando problemas.

Rastrear una ruta

Una vez comprobada la conectividad con un host remoto, quizás nos interese conocer la traza o ruta que sigue el paquete hasta llegar al destino o bien determinar si existe un problema en la conectividad de la red. Esto podemos hacerlos con los comandostracepath (tracepath6)  o traceroute (traceroute6).

El comando traceroute envía una serie de tres paquetes de prueba a cada ordenador entre nuestro sistema y el host remoto especificado, mostrando todos los routers que existen de por medio y los tiempos de respuesta. Su uso es básico, aunque admite algunas opciones. Podemos ejecutar traceroute con su opción -n para mostrar las direcciones IP de los ordenadores de destino en vez de sus nombres, lo que puede acelerar el proceso, aunque en ocasiones es igualmente imporante conocer los nombres de estos. Aún así -n hace la salida mas legible en la mayoría de los casos

$ traceroute -n 82.123.78.50

Con traceroute podemos localizar también problemas de conectividad en la red, por ejemplo una alta variabilidad en los tiempos de respuestas o la ausencia de algunos de estos, lo cual se indica mediante asteríscos ‘‘, puede indicar que el router en el que nos encontramos el ‘‘ está sobrecargado o que tiene una conexión poco fiable. Un salto considerable en los tiempos, suele significar que existe una enorme distancia entre los dos router (habitual en conexiones entre continentes). No obstante si los dos sistemas están lo bastante cerca como para que este salto enorme carezca de sentido deberemos de realizar comprobaciones sobre la red, pues lo mas seguro es que existan problemas sin determinar.

El comando traceroute6 es equivalente a traceroute -6 y con ellos podremos usar opciones como -i que nos permite especificar por cual interfaz de red queremos enviar los paquetes, especificar el número máximo de saltos con -m <hops> (por defecto es 30), indicar una gateway alternativa con -g <gateway> o indicar el tiempo límite de espera para una respuesta, -w

Una alternativa a traceroute es tracepath. A diferencia de traceroute, tracepath genera una línea de salida por cada paquete de prueba, por lo que su salida es más extensa. tracepath admite menos opciones, aun así coinciden en su opción -n, dándonos además la posibilidad de mostrar tanto la dirección IP como el nombre de host mediante la opción -b. De la misma manera podemos especificar el número de saltos máximos con -m e indicar el puerto inicial de destino con -p, algo que también nos permite hace traceroute y que no hemos comentado. El puerto de destino se va incrementando en uno a medida que se envían paquetes de pruebas.

Nota: Igualmente tracepath6 admite las opciones de tracepath solo que en este caso, debemos de escribir tracepaht6 y no tracepath -6.

Auditar  la red

Existen multitud de redes para diagnosticar el estado de la red pero aquí solo abarcaremos las siguientes:

  • netcat o nc: Es una de las herramientas de diagnostico y seguridad mas populares dentro de la comunidad GNU/Linux. Trabaja tanto con conexiones TCP como UDP y permite hacer cosas como por ejemplo abrir puertos en host remoto quedándose a la escucha de posibles conexiones, rastrear puertos abiertos o realizar transferencias de archivos bit a bit entre dos equipos. Funciona tanto para IPv4 como para IPv6.

Para dejar a nc como servidor a la escucha (-l, listen) en un determinado puerto. nc aceptará la conexión de un único cliente y se cerrará:

# nc -l <unpuerto>

Para abrir una conexión como cliente del servidor del ejemplo anterior:

# nc <equiposervidor> <unpuerto>

Abrir una conexión en el servidor para recibir datos desde un cliente:

# nc -l <unpuerto> > <archivo-donde-se-vuelva-el-contenido>

Enviar desde el cliente un archivo para que sea volcado en la conexión del ejemplo anterior:

# nc <equiposervidor> <unpuerto> < <archivo-que-será-volcado-en-el-servidor>

Revisar que puertos TCP (opción por defecto) están abiertos dentro de un ranto de puertos determinado (para nuestro ejemplo usaremos el rango 10-50) en un sistema:

# nc -vz <unequipo> 10-50

Netcat acepta algunas opciones entre las que destacamos (a parte de -l, listen y -vz) -p para especificar un puerto, -k para cambiar el comportamiento de escucha del primero de los ejemplos, es decir aceptar infinitas conexiones y evitar que la conexión se cierre, cambiar el protocolo de puerto por defecto TCP a UDP con -u, especificar un retraso (delay) en el envío o recepción de mensajes -i.

  • netstat: Puede considerarse la herramienta por excelencia para el diagnóstico de red. Dependiendo de los parámetros que le pasemos podrá utilizarse en lugar de muchas otras. Si queremos recibir información sobre nuestras interfaces de red (similar a ifconfig) podemos pasar el parámetro -i, –interface. Para obtener un listado de la tabla de enrutamiento (similar a route) usamos la opción -r, –route. La opción -N o –masquerade nos informará sobre las conexiones en las que intervenga las funciones de NAT. Un uso de netstat sin opciones puede mostrarnos gran información, como por ejemplo los puertos que tenemos abiertos con conexiones establecidas o cerrados y ademas los hosts y servicios que se conectan a ellos. Podremos usar la siguiente línea para indicar valores específicos:
# netstat -punta <host>

Donde:

-p muestra el PID y el servicio que hace uso del puerto, -u informa de los puertos UDP (además de los TCP, opción por defecto), -n expresa los host y puertos mediante números (útil si queremos redireccionar la salida con una pipe para buscar un puerto específico con grep), -t muestra el estado de la conexión (LISTEN, ESTABLISHED, CLOSE, CLOSE_WAIT, etc..) y -a muestra todas las conexiones y puertos de escucha. Si queremos encontrar directamente servidores que escuchan conexiones podemos agregar -l a -p

Importante: El uso de la opción -p suele desplegar líneas de mas de 80 caracteres, podemos abrir una terminal adecuada para estas líneas o redirigir la salida a un archivo, para su comodo estudio.
Algo que conviene comentar sobre la salida del comando netstat es el significado por ejemplo de las columnas “Local Address” y “Foreign Address” que mas o menos queda claro que refieren a la dirección local y dirección remota respectivamente de la conexión. Otro aspecto es el uso del asterísco ‘*‘ en el campo de las direcciones IP o puertos. Este metacaracter representa que no hay activamente una conexión para un determinado servicio, el cual si que se encuentra en ejecución y es posiblre contactar con él.

Nota: Con el comando netstat podremos averiguar quien está conectado a un puerto determinado o si es necesario tener algunos puertos abiertos o servicios corriendo innecesariamente en nuestro sistema.

  • iptraf : Herramienta basada en consola que proporciona estadísticas de red a partir del trafico TCP de nuestras interfaces de red. Es parecida a netstat pero posee ciertas ventajas y características que la hacen bastante útil, como por ejemplo la posibilidad de medir el ancho de banda utilizado en cada conexión, monitorizar el tráfico IP,  posee un módulo de estadísticas sobre LAN que permite descubrir hosts en la red además de mostrar los datos de su actividad, admite la audición de múltiples protocolos como IP, TCP, UDP, ICMP, ARP y OSPF entre otros.

Podemos descargar iptraf desde los repositorios oficiales de nuestra distribución.

  • lsof: La utilidad lsof no está diseñada precisamente para el diagnóstico de la red pero al ser una herramienta desarrollada para la monitorización del sistema podremos utilizarla igualmente para monitorizar ciertos aspectos de la red. En realidad lo que hace lsof es identificar que archivos están abiertos en el sistema: archivos regulares, directorios, tuberías, librerías o socket de red entre otros, quién accede a ellos, nombre e ID del proceso, la ruta absoluta del archivo, su descriptor, etc… útil por ejemplo si queremos desmontar un sistemas de archivos (incluso los de red) pero existen conexiones abiertas a determinados archivos y queremos tener información al respecto

Nota: En el apartado de comandos estudiaremos las opciones de lsof, a continuación solo mostraremos el uso de la opción -i que es la que nos interesa en este momento.

Podremos usar lsof en lugar de netstat para determinadas tareas, entre las que se incluye localizar los servidores que se encuentran en uso gracias a su opción -i. En su forma más básica este comando acompañado de está opción nos motrarán conexiones entre hosts. Estas conexiones se indican mediante la sintaxis host:puerto->hostremoto:puerto. Al igual que con netstat si encontramos líneas que contengan un asterísco en el nombre del host seguido de un nombre de puerto tal que así *:ftp indicará en nuestro caso que estamos corriendo el servicio ftp pero con ninguna conexión activa en ese momento.

Si queremos restringir la salida a una determinada dirección podremos hacerlo mediante la siguiente sintaxis:

# lsof -i [4 | 6] [protocolo] [@nombrehost | direcciónIP] [:servicio | puerto]

Nota: 4 o 6 indica si es IPv4 o IPv6. Para indicar un protocolo servicio o puerto podremos guiarnos por la información del archivo /etc/services

Para realizar una auditoria general de las conexiones de red del sistema, debería escribir lsof -i, sin restringir la salida. De esta manera podremos ver conexiones sospechosas a las que deberemos de prestaler especial atención.No obstante podremos restringir las salidas con comandos como:

# lsof -i :ftp

Este comando mostrará todas las conexiones entrantes o salientes del puerto 21. Si no obtenemos salida queda claro que no existen conexiones.

# lsof -i |grep LISTEN

Mediante el uso de la tubería del ejemplo anterior podremos localizar directamente que servidores se encuentran a la escucha.

Nota: Si ejecutamos lsof como usuario normal solo veremos las conexiones relacionadas con nuestra propia red. Lo ideal es ejecutarlo con root.

  • nmap: El utilitario nmap es un escaner de puertos abiertos tanto del ordenador local como de un ordenador remoto.  El comando nmap trabaja por defecto con paquetes SYN, paquetes que intentan abrir conexiones bajo TCP. Cuando escaneamos puertos con nmap podemos encontrarnos con tres estados diferentes del puerto: OPEN (abierto), CLOSE (cerrado) o FILTERED (puerto no accesible, un cortafuego lo está filtrando).

Como la gran mayoría de herramientas Linux, nmap admite varias opciones, permitiendo incluso exámenes “secretos” que probablemente no detecten la mayoría de los cortafuegos y exámenes mediante ping (# nmap -sP <IP>, si usamos la opción -n evitamos conversiones DNS por lo que el examen será mas rápido) para detectar que host están activos. Vamos a tratar las opciones de nmap como modificadores entre los que destacan -sS que realiza un escáner que no deja registro en el sistema (requiere usuario privilegiado), -sT realiza un barrido de puertos TCP (no necesita ser ejecutado con root), -sU provoca un barrido de puertos UDP útil si necesitamos conocer puertos de nivel superior que pueden estar tras un firewall (realiza exámenes mas exactos), -sA usa paquetes ACK para lograr que el sistema responda (muchos firewall no filtran estos mensajes, por lo que podemos detectar puertos abiertos mas sutilmente), -sN y -sF puedes pasar un firewall mal configurado y permitirnos ver que servicios se están ejecutando en el sistema. Por último -sV que intenta identificar los servicios en relación con los puertos abiertos (puede detectar vulnerabilidades).

Utilidades como Nessus (otro escaner de puertos montado sobre nmap) ofrecen una GUI y medios para realizar pruebas automatizadas y mas sofisticadas que las que proporciona nmap. Pueden incluso  localizar vulnerabilidades conocidas, de modo que pueden indicar si un servidor esta en riesgo. Nessus puede funcionar tanto como cliente como de servidor. Será el cliente quien controle al servidor, que es quien realmente hace el trabajo.

Nota: Cuando utilicemos un scaner de red, deberemos de tener presente que los puertos que vemos desde nuestro sistema pueden no ser los mismos que ve un atacante. Es un detalle a tener en cuenta si el sistema que estamos probando esta trás un cortafuego. Es probable que nuestro equipo de pruebas revele puertos que realmente no son accesibles desde el exterior.

 

Examinar el tráfico de red sin procesar

Para examinar el tráfico de red, lo normal es usar un sniffer (husmeador), que son herramientas avanzadas para la resolución y diagnóstico de problemas en redes, ya que proporcionan una gran cantidad de información. Linux nos ofrece muchas herramientas para tal fin, pero la que se abarca en el exámen es tcpdump, no obstante veremos alguna otra como Wireshark (antes conocido como Ethereal).

tcpdump puede interceptar paquetes de red para registrarlos o mostrarlos por pantalla o, incluso almacenar los resultados en un archivo para su posterior estudio, siempre que empleemos la opción -w.

Para ejecutar tcpdump necesitaremos ser el administrador del sistema (root) y basta con escribir el nombre del comando (# tcpdump) aunque podemos modificar la salida con algunas opciones. Si queremos mostrar el contenido de los paquetes en código ASCII deberemos de indicarlo con -A. Para mostrar una lista de interfaces en las que puede escuchar tcpdump usaremos -D. Como en muchos comandos de los anteriormente estudiados, si empleamos la opción -n obtendremos salidas con direcciones IP en lugar de nombres y al igual pasa con la opción -v (o -vv, -vvv) de otros comandos, con la que podremos ampliar la información.

Por lo general las líneas de salida del comando tcpdump suelen ser extensas e incluso pueden llegar a ocupar mas de una línea de la pantalla. Suelen incluir una marca temporal, un identificador de pila, el nombre o la IP y el puerto del sistema de origen y destino (respectivamente) e información específica del paquete. Podemos usar la opción -c <num> para que muestre solo un número determinado de paquetes y luego finalice, al igual que hacemos con el comando ping, o pulsar directamente Control+C para finalizar la ejecución del comando.

Wireshark es un analizador de protocolos utilizado para realizar análisis y solucionar problemas en redes de comunicaciones. La funcionalidad que provee es similar a la de tcpdump, pero añade una interfaz gráfica y muchas opciones de organización y filtrado de información. Permite ver todo el tráfico que pasa a través de una red (usualmente una red Ethernet, aunque es compatible con algunas otras) estableciendo la configuración en modo promiscuo. También incluye una versión basada en texto llamada tshark.

Uso de herramientas adicionales

Existen otras herramientas que aunque no fueron diseñadas para la depuración de la red, pueden resultarnos útiles para deducir cierta información sobre la configuración de aspectos particulares de cierto ordenador, como por ejemplo comprobar si tiene un puerto específico abierto. Estas herramientas pueden ser Telnet y ftp.

Telnet es una herramienta de acceso remoto. No se recomienda su uso para tal fin ya que carece de encriptación. Por regla general debería de eliminar el servidor Telnet de su sistema y no utilizar nunca el programa cliente telnet. El programa SSH es una alternativa mucho mas segura para conexiones remotas. Estudiaremos el programa SSH en el capítulo 10. No obstante vamos a utilizar telnet en este caso para comprobar si una máquina dispone de un puerto abierto, como ya adelantábamos. Por ejemplo vamos a comprobar si el equipo ‘freeser‘ permite el acceso por el puerto 25 (puerto utilizado por SMTP)

# telnet freeser 25

Si obtenemos el mensaje de error Connection refused (conexión rechazada) indicará que el servidor remoto no está en ejecución o es inaccesible (puede que un firewall esté filtrando el puerto).

Nota: Esta prueba sólo funciona con protocolos que utilizan TCP

De la misma manera, el programa ftp como ya mencionamos puede sernos util por ejemplo para comprobar si tenemos acceso a una máquina por el puerto 21, o incluso para comprobar el tiempo de transferencia y la velocidad de la red. Para esto tendremos que conectar primero con el servidor:

# ftp freeser

Nos aparecerá un prompt que aceptará comandos como (cd, get, put, ls, etc…) nosotros usaremos get y put. Una vez estemos en el directorio donde se aloja un archivo de peso (ideal para comprobar las tasas), lo descargaremos a nuestro sistema con el comando get <archivo>. Si lo que queremos es comprobar la subida usaremos put <archivo> para subir un archivo desde nuestro sistema.

Al igual que Telnet, FTP es una pobre elección como protocolo por motivos de seguridad.


 

Capítulo 8

 Notas del autor:

Licencia Creative Commons
Curso LPIC-1 400 Capítulo 8 por nebul4ck se distribuye bajo una Licencia Creative Commons Atribución-NoComercial-CompartirIgual 4.0 Internacional.

Pin It

Escribir un comentario


Código de seguridad
Refescar



Redes:



 

Suscribete / Newsletter

Suscribete a nuestras Newsletter y periódicamente recibirás un resumen de las noticias publicadas.

Donar a LinuxParty

Probablemente te niegues, pero.. ¿Podrías ayudarnos con una donación?


Tutorial de Linux

Filtro por Categorías