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

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

¿Qué es APIPA/zeroconf y cómo deshabilitarlo en CentOS/RHEL (169.254.x.y)?

Seguro que muchos os habéis fijado que tanto en sistemas Linux Debian, RHEL, etc como en Windows, algunas veces el propio sistema os asigna una IP del rango 169.254.x.y e incluso que ese rango aparece en la tabla de rutas incluso en circunstancias normales, junto con los que sabemos que tienen que estar ahí:

$ route -n
Tabla de rutas IP del núcleo
Destino         Pasarela        Genmask         Indic Métric Ref    Uso Interfaz
192.168.1.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0

Bien, hay que saber que se trata de la característica Automatic Private IP Address (APIPA), y es la asignación automática por parte del sistema operativo de una IP en ese rango (máscara de red 255.255.0.0) cuando no consigue contactar con el servidor DHCP que tiene que asignarnos una IP. En un hipotético caso de una red privada en la que fallara el servidor DHCP, esto permitiría que las máquinas conectadas a esa red tuvieran asignada una IP dentro del mismo rango y se pudieran comunicar, no así con el exterior ya que no se configura gateway.

Si queremos prescindir de esta funcionalidad en sistemas RHEL, CentOS, Scientific Linux, etc. Debemos añadir la directiva “NOZEROCONF=yes” al fichero “/etc/sysconfig/network”.

NOZEROCONF=yes

Después reiniciamos la red:

# /etc/init.d/network restart

Nmap Online para tu IP o Clase C

Nmap Online nos permite utilizar Nmap directamente desde el navegador para poder analizar los puertos abiertos de nuestro equipo y toda la información que sabéis que puede ofrecer Nmap. Eso sí, la limitación es que podemos lanzarlo únicamente contra nuestra IP pública de salida y toda su clase C (/24) correspondiente.

Básicamente, la idea es utilizarlo como herramienta durante la securización de nuestro sistema cuando no tenemos la posibilidad de utilizar una máquina remota para lanzar pruebas de seguridad de red y escaneos de puertos, algo necesario cuando estamos realizando configuraciones en nuestro firewall. No voy a entrar en posibles usos maliciosos que se le puedan dar a la herramienta. Es recomendable leer los TOS para tener claro que y que no se puede hacer, lo que se guardan en los registros de ese servidor, el tiempo que permanecen ahí esos datos, si son públicos, etc.

Como veis en la imagen, podemos realizar un escaneo rápido, completo o personalizado, especificando los parámetros de Nmap igual que lo haríamos en la línea de comandos.

Nmap Online

Subnetting y cálculo de netmask desde línea de comandos

Si se os da tan mal como a mí el cálculo de subredes o simplemente queréis una herramienta rápida para hacerlo aquí tenéis ipcalc o sipcalc. A través de este comando podremos calcular subredes directamente desde la línea de comandos. La principal diferencia entre ambos es que sipcalc acepta IPV6 y permite subnetting.

Para instalarlos utilizamos los gestores de paquetes correspondientes, apt, yum…

$ sudo apt-get install ipcalc
$ sudo yum install ipcalc

Nota: en RHEL y CentOS hay que activar el repositorio rpmforge.

La utilización es bien sencilla, podemos pasar como parámetro la subred en formato CIDR y nos devuelve toda la información de la misma, máscara, red, nº de hosts, etc:

$ ipcalc 10.0.0.0/24
Address:   10.0.0.0             00001010.00000000.00000000. 00000000
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
=>
Network:   10.0.0.0/24          00001010.00000000.00000000. 00000000
HostMin:   10.0.0.1             00001010.00000000.00000000. 00000001
HostMax:   10.0.0.254           00001010.00000000.00000000. 11111110
Broadcast: 10.0.0.255           00001010.00000000.00000000. 11111111
Hosts/Net: 254                   Class A, Private Internet

IPV6 con sipcalc:

$ sipcalc 2001:DB8::/24
-[ipv6 : 2001:DB8::/24] - 0

[IPV6 INFO]
Expanded Address	- 2001:0db8:0000:0000:0000:0000:0000:0000
Compressed address	- 2001:db8::
Subnet prefix (masked)	- 2001:d00:0:0:0:0:0:0/24
Address ID (masked)	- 0:b8:0:0:0:0:0:0/24
Prefix address		- ffff:ff00:0:0:0:0:0:0
Prefix length		- 24
Address type		- Aggregatable Global Unicast Addresses
Network range		- 2001:0d00:0000:0000:0000:0000:0000:0000 -
			  2001:0dff:ffff:ffff:ffff:ffff:ffff:ffff

Otra característica interesante es la posibilidad de sipcalc de especificar una red y hacer subneting con ella, si por ejemplo queremos dividir un /21 en redes /22 o /24:

$ sipcalc -s24 10.0.0.0/21
-[ipv4 : 10.0.0.0/21] - 0

[Split network]
Network			- 10.0.0.0        - 10.0.0.255
Network			- 10.0.1.0        - 10.0.1.255
Network			- 10.0.2.0        - 10.0.2.255
Network			- 10.0.3.0        - 10.0.3.255
Network			- 10.0.4.0        - 10.0.4.255
Network			- 10.0.5.0        - 10.0.5.255
Network			- 10.0.6.0        - 10.0.6.255
Network			- 10.0.7.0        - 10.0.7.255

-
$ sipcalc -s22 10.0.0.0/21
-[ipv4 : 10.0.0.0/21] - 0

[Split network]
Network			- 10.0.0.0        - 10.0.3.255
Network			- 10.0.4.0        - 10.0.7.255

Si revisáis la ayuda del comando encontraréis otras posibilidades de interés.

Bonding/Teaming/Trunking en RHEL y CentOS

bonding linux

El Bonding (también conocido como teaming, y en switching como trunking) es, básicamente, la unión de varias interfaces de red para que trabajen como una única interfaz lógica. Esta configuración permite establecer configuraciones de activo-pasivo, balanceo de carga o crear un agregado de interfaces con un ancho de banda que supone la suma del de todas las interfaces asignadas.

Antes de comenzar la configuración, nos aseguramos de tener cargado el módulo bonding:

# lsmod | grep bonding
bonding               109558  0
ipv6                  264641  29 bonding,ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6,cnic

En caso de no estar lo cargamos:

# modprobe bonding

Tenemos que configurar unos parámetros de kernel para añadir esta nueva interfaz/funcionalidad:

# vi /etc/modprobe.conf
alias bond0 bonding
options bond0 mode=6 miimon=100

El valor mode, especificado en 6 indica que el tipo de bonding va a ser de balanceo de carga. Los posibles valores son de 0 a 6:

  • 0: round robin policy, defecto
  • 1: active backup policy
  • 2: XOR
  • 3: brodcast
  • 4: 802.3ad
  • 5:  balance-tlb
  • 6:  balance-alb

El valor miimon indica con un valor entero la frecuencia de monitorización del link. Para conocer todos estos parámetros en condiciones os recomiendo revisar la documentación del kernel sobre bonding

Ahora vamos a crear el fichero de configuración para la interfaz Bond0, que será la que en nuestro caso creará el bonding de eth0 y eth1. El fichero de configuración se crea en la misma ruta que el resto /etc/sysconfig/network-scripts/ifcfg-XXX. Este fichero es el que contendrá la configuración IP, NETMASK, etc.

# vim /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
ONBOOT=yes
IPADDR=192.168.1.190
NETMASK=255.255.255.0
BROADCAST=192.168.1.255
NETWORK=192.168.1.0
USERCTL=no
BOOTPROTO=none

Ahora configuramos eth0 y eth1, en ellas no establecemos ninguna configuración IP, sino que especificamos que es una interfaz esclavo (slave) y que su master es bond0:

vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
USERCTL=no
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
vi /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
USERCTL=no
BOOTPROTO=none
MASTER=bond0
SLAVE=yes

Una vez configurado, reiniciamos el servicio de red:

# /etc/init.d/network restart

Si todo ha ido bien ya veremos la interfaz bond0 en ifconfig:

# ifconfig
bond0     Link encap:Ethernet  HWaddr 08:00:27:00:C8:7A
          inet addr:192.168.1.190  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe00:c87a/64 Scope:Link
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:1029 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1198 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:101972 (99.5 KiB)  TX bytes:182347 (178.0 KiB)

eth0      Link encap:Ethernet  HWaddr 08:00:27:00:C8:7A
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:946 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1144 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:90003 (87.8 KiB)  TX bytes:175136 (171.0 KiB)
          Interrupt:11 Base address:0xc020 

eth1      Link encap:Ethernet  HWaddr 08:00:27:00:C8:7A
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:94 errors:0 dropped:0 overruns:0 frame:0
          TX packets:59 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:12695 (12.3 KiB)  TX bytes:8325 (8.1 KiB)
          Interrupt:10 Base address:0xc060 

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:1241 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1241 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:170253 (166.2 KiB)  TX bytes:170253 (166.2 KiB)

Podemos monitorizar el estado del bonding desde /proc/net/bonding/bond0:

# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009)

Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 0
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth0
MII Status: up
Speed: 100 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 08:00:27:00:c8:7a
Slave queue ID: 0

Slave Interface: eth1
MII Status: up
Speed: 100 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 08:00:27:fd:48:08
Slave queue ID: 0

Múltiples VLAN por interfaz en Windows Server

broadcom advanced control suiteDe forma nativa (que yo sepa) Windows Server no ofrece la posibilidad de configurar múltiples VLAN por interfaz de red. Esto nos obliga a recurrir a las utilidades que el fabricante del dispositivo de red nos facilite.

Broadcom por ejemplo nos ofrece la utilidad “Broadcom Advanced Control Suite” que nos permite, además de crear VLANs virtuales, hacer balanceo de carga o Ethernet bonding. Podéis leer la guía de utilización en este enlace y descargar la suite desde el sitio web de Broadcom. Por supuesto se presupone que la configuración de red en los switches para las VLAN (trunk, etc) es la correcta. En el caso de esta utilidad, todo se puede configurar a través de los asistentes de forma gráfica y/o en modo experto así que no tiene demasiada complejidad.

Básicamente, primero se crea un Team, se le asignan las intefaces de red que queramos y a partir de ahí se configuran las VLAN virtuales, el balanceo de carga o lo que necesitemos. Una vez finalizado el asistente, si hemos creado VLAN virtuales, los nuevos dispositivos virtuales aparecerán en el centro de redes de Windows, donde podremos asignarle la IP correspondiente como si un dispositivo estándar se tratara.

Si necesitáis este tipo de configuraciones no perdáis el tiempo e id a buscar directamente las utilidades del proveedor de las tarjetas de red.

Configurar una VLAN en Linux con vconfig

La forma más conocida de configurar una VLAN en Linux es la de copiar el fichero de configuración de la interfaz y añadir/cambiar ciertos parámetros, ejemplo en RHEL asumiendo el ID 80 para la VLAN:

# cp -p /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0.80
# vim /etc/sysconfig/network-scripts/ifcfg-eth0.80
    # Añadimos:
    VLAN=yes
    # Cambiamos el dispositivo:
    DEVICE=eth0.80
# /etc/init.d/network restart

El comando vconfig nos simplifica un poco la tarea de gestionar una o varias VLAN. Para el ejemplo anterior, sería tan sencillo como:

# vconfig add eth0 80
Added VLAN with VID == 80 to IF -:eth0:-

Ya tenemos la interfaz creada:

# ifconfig eth0.80
eth0.80   Link encap:Ethernet  HWaddr 08:00:27:E7:48:CC
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

Podemos ver información detallada sobre ella en /proc/net/vlan/:

# cat /proc/net/vlan/eth0.80
eth0.80  VID: 80	 REORDER_HDR: 1  dev->priv_flags: 1
         total frames received            0
          total bytes received            0
      Broadcast/Multicast Rcvd            0

      total frames transmitted            0
       total bytes transmitted            0
            total headroom inc            0
           total encap on xmit            0
Device: eth0
INGRESS priority mappings: 0:0  1:0  2:0  3:0  4:0  5:0  6:0 7:0
 EGRESS priority mappings:

Podríamos asignarle la IP con el comando ifconfig:

# ifconfig eth0.80 192.168.1.222 netmask 255.255.255.0

Y si quisiéramos eliminar la interfaz:

# ifconfig eth0.80 down && vconfig rem eth0.80

Recordad que tiene que estar cargado en el kernel el módulo 8021q:

# lsmod | grep 8021q
8021q                  19491  0
garp                    5901  1 8021q

En fin, ¡para gustos los colores!

Routing Tables: ‘netstat -rn’ y ‘route -n’

Algo importante en los sistemas Linux (o Unix) y todo lo relacionado con networking es conocer el estado y configuración de las tablas de rutas IP (routing tables), que nos indican cómo y a través de donde se envía un paquete en las distintas redes.

Para visualizar la tabla de rutas tenemos dos posibilidades, utilizar el comando netstat -rn o route -n, ambos nos ofrecen la misma salida:

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0
0.0.0.0         192.168.1.1     0.0.0.0         UG        0 0          0 eth0

Las tres primeras columnas nos indican, por un lado las redes de destino (Destination), la puerta de enlace que utilizan (Gateway) y la máscara de red (Genmask). En las Flags vemos “U”, que significa que la interfaz de red está levantada y G que indica que esa ruta utiliza la puerta de enlace. 0.0.0.0 es tratado como un wildcard (también se suele representar con un *) y especifica el destino a cualquier red no especificada.

Explicando la salida del comando route anterior, vemos en primer lugar que todo paquete dirigido a las redes 192.168.1.0/255.255.255.0 y 169.254.0.0/255.255.0.0 serán enviados a través de redes LAN (vemos que no hay flag de gateway) por lo que no harán uso de puerta de enlace. En cambio todo paquete con destino 0.0.0.0, es decir, el resto de redes sí que pasará por nuestra puerta de enlace 192.168.1.1. Todas estas rutas trabajan bajo la interfaz de red eth0, si tuviéramos más interfaces levantadas aparecerían marcadas como ethX en la columna Iface.

GNS3: simulador gráfico de redes

Para todos aquellos que necesitéis crear entornos de redes virtuales, topologías de red complejas y además tener la posibilidad de integrarlos con simuladores de IOS (Dynamips/Dynagen) y entornos de virtualización (Quemu, emulador de PIX.GNS3), GNS3 os puede ser de gran utilidad.

La instalación en Debian/Ubuntu y otras distro Linux es sencilla, la hacéis por gestor de paquetes:

$ sudo apt-get install gns3

Una vez arrancada la aplicación tenéis un asistente que os permite subir las imágenes IOS que dispongáis (podéis encontrarlas buscando por Google) y comenzar a trabajar. Simplemente se trata de crear la topología de red arrastrando elementos al cuadro central y configurarlos. Posteriormente se pueden arrancar/parar, acceder por consola, etc.

Si estás en proceso de pasar un CCNA, CCNP, CCIE o similar, o simplemente quieres tener la posibilidad de crear entornos de red sin necesidad de adquirir hardware costoso, esta es tu oportunidad.

GNS3

Consola IOS GNS3