Mostrando entradas con la etiqueta CentOS. Mostrar todas las entradas
Mostrando entradas con la etiqueta CentOS. Mostrar todas las entradas

martes, 22 de abril de 2014

IPTABLES

¿Qué es iptables?

iptables es un cortafuegos por defecto que viene preinstalado en la práctica mayoría de las distribuciones Linux a partir de la versión 2.4 del núcleo. Es una herramienta que gestiona las conexiones que entran, vienen o pasan por el sistema operativo. Por tanto, es considerado un firewall muy versátil que puede ser utilizado para gestionar todas las conexiones que se hagan en el ordenador.

iptables tiene soporte tanto para el protocolo IPv4 como para el protocolo IPv6. Para diferenciar cuál es cual, IPv4 usa el comando iptables y IPv6 utiliza el comando ip6tables.

¿Qué puede hacer iptables?

Para definir correctamente todas las reglas de las que nos provee iptables, haremos una pequeña introducción sobre los tipos de órdenes que maneja el cortafuegos. (Entre paréntesis viene la opción que usa cada tipo)

Tipo de paquetes de datos (- A)
  • INPUT: Paquetes que llegan a nuestra máquina
  • OUTPUT: Paquetes que salen de nuestra máquina
  • FORWARD: Paquetes que pasan por nuestra máquina
Interfaces por las que entran o salen los paquetes (-i = input, -o = output)

- eth0, eth1, wlan0, ppp0... toda interfaz que tenga un sistema Linux

 IP origen y destino de los paquetes (-s = source, -d = destination)

Puede ser una IP concreta o un rango de direcciones IP acompañado de su CIDR. Ejemplos:

- 192.168.1.33 (concreta)
- 172.16.1.0/24 (rango de IP)

Protocolo de los paquetes (-p = protocol)
  • TCP,
  • UDP
  • ICMP
Haciendo enrutamiento con la tabla NAT (-t NAT)

- PREROUTING (Filtrar antes de enrutar)
- POSTROUTING (Filtrar después de enrutar)

 ¿Cómo se usa iptables? ¿Qué configuraciones puedo hacer en el mismo?

iptables es utilizado, en su amplia mayoría de casos, para filtrar las conexiones que se realizan en ordenadores Linux que son utilizados como servidores y routeres entre redes. iptables puede:
  • Denegar o aceptar conexiones:

    • Parcialmente, desactivando y activando algunos puertos o protocolos, el tráfico ICMP de ping.

    • Totalmente, habilitando o deshabilitando el acceso a equipos con una determinada dirección de red, subred, o dirección física MAC, y dando acceso total a todo, o quitándolo.
  • Utilizar tablas NAT de enrutamiento para enrutar entre dos interfaces de red enchufadas en el sistema Linux. (NOTA: debes activar el ipforward del sistema para conseguir que funcione)

  • Si se dispone de la aplicación de red Wireshark se puede monitorizar y listar aún mejor las entradas y salidas de iptables, además de que la propia aplicación dispone de tablas de listado.
iptables se utiliza mediante línea de comandos en su amplia mayoría. Como el compendio de ejecución de iptables es un poco extenso, voy a realizar la explicación de la mejor forma que se puede: Con ejemplos prácticos

  • Firewall de un ordenador o servidor.
  • Un modelo "global" de router y firewall. (O bien, podéis ir a la entrada de usar un CentOS como router y observar algunos ejemplos ya realizados para ver cómo se usa)

El modelo básico para hacer cualquier configuración es:
  • Borramos las anteriores reglas y ponemos todo el iptables a 0: Antes de realizar ninguna instrucción, lo recomendable es borrar toda la configuración anterior de iptables, para que no interfieran antiguas restricciones con las nuevas.

  • Si nuestro ordenador va a ser router entre redes, configurar la NAT: Configuraremos las tablas NAT de cero para que no haya ningún problema en la implementación.
  • Abrir o cerrar puertos y protocolos específicos: Para "rizar más el rizo" en la configuración, en caso de que necesitemos hacerlo.

Ejemplos de uso de iptables

-------------------------------------------------------------------------------------------------------------------------------------

Como Firewall en un solo ordenador/servidor:

El escenario será el siguiente:

Tenemos un servidor, por el cual debido a recientes implementaciones (Como un servidor FTP o un servicio HTTP) queremos que el resto de ordenadores se conecten al mismo. Sin embargo, queremos también que no se tenga libre albedrío y queremos cerrar y abrir una serie de puertos.

Para este ejemplo, tenemos implementado un servidor HTTP y un FTP, y queremos rechazar las conexiones por TELNET y aceptar solamente las que entran por SSH. La red será 192.168.1.0/24 y nuestro servidor tiene como IP la primera del rango.Además, no queremos que un determinado ordenador se conecte, y como va todo el rato cambiando direcciones IP para sortear el baneo, hay que cerrarlo directamente por su dirección física, que es 01:23:45:ab:cd:ef

Para configurar correctamente el iptables, haremos los dos primeros pasos del modelo: Borrado de las reglas anteriores e implementación de las que queramos poner:

1. Borrado de las reglas anteriores


Borra las anteriores reglas de iptables.

# iptables -F

Igual que la anterior, pero más rematada.

# iptables -X

Pone el contador de paquetes totales del iptables a cero.

# iptables -Z

2. Establecemos las políticas de denegación y aceptación de puertos y servicios.

Comenzamos con aceptar los tipos de paquetes que manejará el firewall, que son de entrada y de salida.

# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT

Aceptamos la entrada de localhost.

# iptables -A INPUT -i lo -j ACCEPT

Comenzamos primeramente cerrando todos los puertos establecidos (Del 1 al 1024)

# iptables -A INPUT -i eth0 -p tcp --dport 1:1024 -j DROP
# iptables -A INPUT -i eth0 -p udp --dport 1:1024 -j DROP

 Ahora establecemos las políticas de entrada.

# iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 20 -j ACCEPT
# iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 21 -j ACCEPT
# iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
# iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT

De forma auxiliar, también aceptamos los puertos esenciales para la conexión (DHCP y DNS)


DNS:

# iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 53 -j ACCEPT
# iptables -A INPUT -s 192.168.1.0/24 -p udp --dport 53 -j ACCEPT

DHCP:

# iptables -A OUTPUT -s 192.168.1.0/24 -p udp --dport 67 -j ACCEPT

# iptables -A INPUT -s 192.168.1.0/24 -p udp --dport 68 -j ACCEPT 

Rechazamos el puerto de Telnet.

# iptables -A INPUT -i eth0 -p udp --dport 23 -j ACCEPT

Y para acabar, rechazamos la dirección física de ordenador tan molesto:

# iptables -A INPUT -m mac --mac-address 01:23:45:ab:cd:ef -j DROP

Por último, guardamos la configuración:


# iptables-save

-------------------------------------------------------------------------------------------------------------------------------------

Como Firewall principal entre dos redes.

El escenario actual será siguiente:

Tenemos un ordenador con un sistema Linux que sirve de firewall. El mismo sistema tiene 3 interfaces referentes a:
  • eth0: Internet, salida directa.
  • eth1: Una red que contenga X ordenadores y que necesita Internet.
    Dirección de red: 192.168.0.0/24
    Dirección IP en la interfaz: 192.168.0.1/24
  • eth2: Un DMZ (Red desmilitarizada, con acceso total)
    Dirección de red: 192.168.1.0/24
    Dirección IP en la interfaz: 192.168.1.1/24
Queremos que en la interfaz eth1 se acepte el tráfico HTTP y HTTPS, además de otros como el puerto de Telnet y SSH. Rechazaremos el puerto 6680 en la misma red.

En eth2 queremos que se tenga acceso total, debido a su forma de ser una red desmilitarizada.

Para configurar correctamente el iptables, seguiremos un orden concreto: Borramos anteriores reglas, iniciamos la NAT y filtramos todo.

1. Borrado de las reglas definidas.

Borra las anteriores reglas de iptables.

# iptables -F

Igual que la anterior, pero más rematada.

# iptables -X

Borra las reglas establecidas en la tabla NAT.

# iptables -t NAT -F

 Pone el contador de paquetes totales del iptables a cero.

# iptables -Z

2. Inicializamos las políticas de filtrado

# iptables -P INPUT ACCEPT
# iptables -P FORWARD ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P PREROUTING ACCEPT

# iptables -P POSTROUTING ACCEPT 

Aceptamos el tráfico de localhost, para que no nos dé error.


# iptables -A input -i lo -j ACCEPT 


3. Iniciamos NAT

Después de poner el ip forward a 1, debemos implementar la siguiente regla:

# iptables -t NAT -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
# iptables -t NAT -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

(A partir de aquí no tocaremos más la red 192.168.1.0/24, ya que lo que quería era acceso total)

4. Establecemos el resto de reglas de filtrado y denegación.

Primeramente rechazamos el tráfico de ambas redes al mismo firewall (para evitar que alguien toquetee)

# iptables -A INPUT -s 192.168.0.0/24 -i eth1 -j REJECT
# iptables -A INPUT -s 192.168.1.0/24 -i eth2 -j REJECT

En la red 192.168.0.0:

Aceptar el tráfico de HTTP y HTTPS.

# iptables -A FORWARD -s 192.168.1.0/4 -p tcp --dport 80 -j ACCEPT

# iptables -A FORWARD -s 192.168.1.0/4 -p tcp --dport 443 -j ACCEPT


Aceptar el tráfico de Telnet y SSH.


# iptables -A FORWARD -s 192.168.1.0/4 -p tcp --dport 22 -j ACCEPT
# iptables -A FORWARD -s 192.168.1.0/4 -p udp --dport 23 -j ACCEPT

Rechazamos el tráfico del puerto 6680.

# iptables -A FORWARD -s 192.168.1.0/4 -p tcp --dport 6680 -j DROP
# iptables -A FORWARD -s 192.168.1.0/4 -p udp --dport 6680 -j DROP  

Después de realizar todas estas reglas, salvamos.

# iptables-save
-------------------------------------------------------------------------------------------------------------------------------------


Fuentes:
Experiencia propia.
Redes de Área local, aplicaciones y servicios Linux. Ministerio de Educación (Material docente)
Diversas entradas ya hechas de aquí manejando iptables.

martes, 21 de agosto de 2012

Utilizar un sistema operativo CentOS como servidor FTP

Hace unas cuantas entradas, publiqué en el blog cómo hacer que CentOS se convirtiera en un router para enrutar paquetes y conexiones en una red local pequeña, realizar un servidor DHCP para ésa misma red y configurar el iptables. Para aprovechar las funcionalidades de las que es capaz de dotarnos un sistema operativo libre, y para sacarle el máximo partido, hoy vamos a ver cómo instalar un servidor FTP en el sistema operativo CentOS y configurarlo a como queramos usarlo.


Si volvemos en el tiempo (a la entrada de Introducción a FTP) vemos que había distintas maneras de realizar un servidor FTP (con usuarios, usuario guest o usuario anonymous, modo activo y pasivo, control de datos). Para sacar el máximo rendimiento a la anterior entrada y así, poner un poco en práctica los conceptos, hoy, vamos a ver cómo instalar el servidor FTP en un CentOS 5.7 y lo que debemos hacer para que nos funcione perfectamente.

Para ayudarnos en la tarea y centrarnos en qué debemos hacer en el servidor, así como saber qué instalamos, qué red usaremos y más detalles, vamos a poner un escenario.

Escenario de ejemplo:

Tenemos una red local bastante extensa, de alrededor de 50 ordenadores. Para modernizar el servicio y centralizar servicios, decidimos implementar un servidor FTP para almacenar archivos, o por el contrario, ofrecérselos al resto de usuarios. Para evitar que el futuro servidor sea un caos con tanto trajín de datos arriba y abajo, se opta por establecer una política de usuarios, los cuales deben acreditar su usuario y su clave para acceder a su carpeta personal dentro del servidor.

Una vez propuesto el escenario, lo interpretaremos:

- El servidor FTP será de dirección IP estática, para evitar así posibles errores en la dirección.
- El servidor FTP tendrá usuarios y contraseñas para garantizar la correcta entrada.
- Como sabemos que nuestra red sólo tiene 50 ordenadores, limitaremos la entrada de conexiones en nuestro servidor FTP y además estableceremos que un ordenador puede utilizar una conexión al servidor como máximo.

NOTA: A modo complementario, y siguiendo éste pequeño tutorial y el listado de cláusulas que pondré más adelante, a la entrada creada con anterioridad sobre crear un router con DHCP en el mismo CentOS le podemos añadir el servidor FTP, para así tener en el mismo CentOS un servidor DHCP, FTP y enrutador de red local. Eso ya como al usuario final, que es el que está leyendo, quiera. Si decide implementarlo, recuerde abrir los puertos 20 y 21 del IPTABLES para que funcione correctamente.

Empecemos a realizar todo:

Instalaremos los paquetes necesarios del repositorio.

El paquete que debemos instalar del repositorio es vsftpd (Very Secure FTP daemon en sus siglas)

# yum install vsftpd

Tardará unos minutos en descargar el paquete del repositorio e implementarlo en nuestro servidor.

2º Configuraremos el servidor FTP a nuestro gusto.

Una vez tenemos el paquete instalado, pasaremos a configurarlo. Para ello, usaremos vim para editar el archivo de configuración. Dicho fichero se encuentra en /etc/vsftpd y su nombre es vsftpd.conf

# vi /etc/vsftpd/vsftpd.conf

Ahora, pasaremos a explicar las cláusulas presentes (Con un asterisco señalaré las que de verdad nos interesan y las que modificaremos o tendremos en cuenta, tenga puesto YES, NO o "perico de los palotes").

  • *anonymous_enable: Esta cláusula hace referencia a si queremos activar el usuario anónimo o no. En nuestro servidor, utilizaremos la opción NO

  • *local_enable: Permite que los usuarios que están dados de alta en tu máquina accedan al servidor FTP con su usuario y contraseña. Por defecto, el valor es YES. Lo dejaremos así.

  • *write_enable: Con esta opción hacemos referencia a si queremos que los usuarios puedan subir archivos. Como hemos querido hacer que sí suban, la marcaremos como YES

  • default_umask: Umask por defecto en el servidor. Por defecto es 022. No se toca a no ser que lo queramos cambiar.

  • *anon_upload_enable: Permite a los usuarios anónimos a subir archivos. Por defecto está comentada. No la descomentamos, ya que no queremos usuarios anónimos.

  • anon_mkdir_write_enable: Permite a los usuarios anónimos crear directorios. Por defecto está comentada. No se descomenta.

  • dirmessage_enable: Cada vez que un usuario entra a un directorio, se crea un mensaje informando en qué directorio está. Lo dejamos como YES.

  • *xferlog_enable:Genera un fichero log con las cosas realizadas. Lo marcamos como YES si queremos un registro completo de los movimientos (Opcional)

  • connect_from_port_20: Conectarse al servidor utilizando el puerto 20. Lo marcamos como YES.

  • chown_uploads y chown_username: Estas cláusulas no se descomentan. La primera hace referencia a que cuando un anónimo sube un archivo al servidor, lo guarda como si fuera el usuario o grupo especificado en chown_username.

  • *xferlog_file: La ruta donde estará el archivo xferlog_file.

  • *idle_session_timeout: Especifica el timeout que daremos a una conexión FTP que está inactiva. Por defecto, nosotros usaremos 600 (que equivale a 10 minutos)

  • *data_connection_timeout: Si una conexión activa de datos está en transferencia pero no hay tráfico de datos como tal (bien sea por un error u otra causa), especificaremos el timeout para no sobrecargar el servidor. Nosotros usaremos 120

  • nopriv_server: Especifica qué usuario usa por defecto el servidor FTP, así como sus privilegios o demás. Por defecto, la dejamos comentada.

  • ascii_upload_enable: Permite la subida de archivos en formato ASCII
  • ascii_download_enable: Permite la descarga de archivos en formato ASCII

  • *ftpd_banner: Especifica el banner que queramos poner a nuestro servidor, el mensaje de entrada.

  • deny_email_enable: Con esta cláusula denegamos los mensajes anónimos de correo en el servidor. La dejamos en YES. (Está comentada, asi que no la descomentamos)

  • chroot_list_enable: Esta cláusula permite que, si lo especificamos en el archivo /etc/vsftpd/chroot_list, los usuarios locales del servidor inicien en el directorio $HOME. La dejamos en YES y comentada.

  • ls_recurse_enable: Especifica si queremos activar la recursividad al listar directorios. Por defecto está comentada. La dejamos así.

  • *listen: Permite al servidor escuchar en IPv4. Por defecto está en YES. La dejamos así.

  • listen_ipv6: Igual que la anterior, pero solo si vamos a usar IPv6. Como no usaremos IPv6, la dejamos comentada.

  • *pam_service_name: Nombre del servicio. Por defecto es vsftpd.

  • userlist_enable: Si está en YES, se usará un fichero llamado userfile_list con los usuarios permitidos para entrar al FTP.

Una vez explicadas todas las cláusulas que nos pueden ser útiles en la creación de nuestro servidor FTP, modificamos las que más necesitemos acorde a nuestras necesidades. A medida que las explicaba, he ido diciendo las que habría que cambiar para nuestro escenario ejemplo, así que una vez nos hemos percatado de que todas las cláusulas han sido escritas correctamente, aceptamos y salimos del archivo de configuración guardando lo escrito.

Ahora, arrancamos el servidor FTP. Para ello, introduciremos el comando:

# service vsftpd start
Iniciando vsftpd para vsftpd: [OK]
#

3º Hacernos nuestro IPTABLES

Una vez iniciado, aún así, no nos va a funcionar el servidor a la primera, debido a que no hemos configurado correctamente el cortafuegos para que permita conexiones entrantes a través de la interfaz eth0. Para ello, vamos a pasar a configurarlo:

NOTA: Si bien es cierto que la implementación va a ser a nivel local, directamente podríamos tirar el servicio de iptables (pararlo, vamos) y ya nos los apañamos, pero eso es responsabilidad del usuario final el cómo quiera realizarlo.

Para configurar el iptables, primero debemos saber qué puertos están involucrados en nuestro servidor FTP. Como bien sabemos, los puertos que debemos abrir para la conexión son el 20 y 21.

Una vez identificados los factores, nos "hacemos" las reglas de iptables.

- Queremos políticas de entrada, debido a que lo que vamos a hacer es transmitir a nuestro servidor.

- La entrada se realiza por la interfaz eth0 y por los puertos 20 y 21

Las reglas son las siguientes:

Primero, borramos todas las reglas presentes en nuestro servidor:

# iptables -F
# iptables -X
# iptables -Z

Y ahora, las reglas que añadiremos para que el servidor se comunique con los clientes:

# iptables -P INPUT ACCEPT

# iptables -A INPUT -i eth0 -p tcp --dport 20 -j ACCEPT
# iptables -A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT

Por supuesto, una vez terminadas de hacer nuestras reglas, debemos guardarlas con el comando:

# iptables-save

NOTA: Para asegurarnos una efectividad completa en la programación del iptables (dado que a veces el comando iptables-save sólo lo guarda para ésa sesión) podemos crear un pequeño script, y luego ejecutarlo en el inicio.

En el fichero /etc/rc.d/rc.local, puedes agregarle las líneas de iptables que usarás, y nada más se ejecuten el servidor irá correctamente.


Aún habiendo realizado nuestro iptables de forma correcta, nos falta configurar el SElinux (dado que es un módulo de seguridad bastante "puñetero" con las conexiones). Si queremos subir un archivo, el SElinux nos podría tirar la conexión alegando que no tenemos permisos.

Para solventarlo, debemos escribir

# setenforce permissive

Y de esta forma, nos dejará.

PD: Se puede añadir al rc.local del inicio si queremos.
PD2 (Adicionado por un comentario): Desactiva el SElinux tiende a ser peligroso dado que tiramos todo el sistema de seguridad por el FTP. Se pueden solamente habilitar los bool del SElinux para FTP y conseguir el mismo efecto sin necesidad de ponerlo como Permissive. En unos días investigaré cómo.

4º Creación de usuarios para nuestro servidor FTP.

Para crear los usuarios de nuestro servidor FTP, los crearemos como si estuvieramos creando un usuario cualquiera (no nos vamos a complicar mucho, nuestro servidor ya está lo suficientemente seguro con el iptables)

Crearemos un usuario de prueba, por ejemplo:

  • Nombre de usuario: perico
  • Contraseña: eltuerto
Para crearlo, introduciremos los siguientes comandos:

# useradd perico
# passwd perico (despues introducimos la clave cuando indique, y listo)

Una vez creado nuestro usuario perico, veremos a ver si nos ha funcionado y podemos acceder de forma correcta al servidor con las credenciales. Para comprobarlo, usaremos el cliente FTP más sencillo de Windows: El de su línea de comandos.

Accedemos a una línea de comandos de Windows (cmd, vamos) y escribimos:

C:\> ftp (dirección IP del servidor)

Pondré un ejemplo práctico:

(20:06:23,73)[C:\Users\Admin]$ ftp 11.0.0.29
Conectado a 11.0.0.29.
220 Bienvenidos al servidor FTP VISA8080
Usuario (11.0.0.29:(none)): perico

331 Please specify the password.
Contraseña:
230 Login successful.
ftp>


NOTA: La contraseña no se muestra como introducida en el login, no es que se les haya estropeado el teclado cuando la estén escribiendo y no la ven.

5º Sacando partido a nuestro servidor FTP.


Una vez tenemos creado nuestro servidor del todo, es hora de darle uso ¿No?

Para poder acceder a los archivos de nuestro servidor FTP, la mejor manera y más comoda (siempre que no tengamos que subir archivos al mismo) es usar nuestro navegador de Internet, y con la dirección en el navegador ftp://(dirección ip):(puerto) accederemos a nuestro servidor FTP, y podremos ver de mejor forma los archivos.

Otra manera más gráfica es usando la herramienta Winscp, que ofrece una mejor visión de los archivos, así como también subir y bajar archivos del servidor de forma más sencilla.

Para finalizar, cómo no, diremos que todo esto se consigue siendo usuario root o superuser. Si no, no hay FTP

Comentarios adicionales que pueden ayudar:

De :::Jhon Castañeda::: (Comentario más abajo, en la zona de Comentarios)

Implementando un servidor FTP. Su ISP mapeó una dirección pública a una dirección privada a través de la NAT. Desde la LAN se puede conectar, pero desde fuera era imposible porque el IPTABLES que está puesto en este manual es hacia dentro (Recuerden que no puse opciones para que fuera hacia el otro lado, desde Internet). El usuario en cuestión nos da éste comando para solventar éste problema.

# iptables -A FORWARD -i eth0 -p tcp -d (dirección del servidor) -m multiport --dports 20,21 -j ACCEPT

El cual hace que el tráfico pase a través del NAT y llegue al servidor. Además, en el iptables, debemos añadir este comando.

# iptables FORWARD ACCEPT

Para que nos acepte el tráfico de forward.

Gracias por la ayuda recibida.


Fuentes:

Reciclaje de apuntes
Wiki de CentOS
Experiencia propia (y lo que me ha costado hacer el servidor virtual de referencia)

Última edición: Octubre de 2013
Razón: Correcciones ortográficas.

    jueves, 8 de diciembre de 2011

    Utilizar un sistema operativo CentOS como router en una red local.

    CentOS (Comunnity enterprise Operating System) es un sistema operativo de código libre, basado en el núcleo Red Hat, pero con código liberado. CentOS es la alternativa gratuíta a Red Hat, y por ello, suele tener bastante tirón para implementarlo como servidor en una pequeña o mediana red. CentOS puede ser usado también como servidor LAMP, servidor de correo, servidor DHCP, DNS, y un largo etcétera.


    CentOS puede ser usado también como un router, usando dos tarjetas de red, una hacia la red de área local y otra al exterior(Internet)

    Para empezar esta entrada, nos centraremos primero en una situación "de la vida real":

    Imaginemos que tenemos una red de área local de por ejemplo tres o cuatro ordenadores, todos conectados por un switch, y queremos usar un ordenador ajeno a esos como servidor, para administrar a esos ordenadores direcciones IP y servicios de red cualesquiera. El ordenador servidor se usará como router, y también como firewall, filtrando las conexiones, rechazando algunas y aceptando otros puertos, para así tener control absoluto sobre las conexiones.

    Configuración del servidor:

    • El servidor tiene para esta administración dos interfaces: eth0 y eth1
      • eth0 para local.
      • eth1 para salida a Internet.
    • La configuración del firewall de la red se administrará mediante iptables
    • El método para enrutar los paquetes será NAT.
    Éste esquema se da en bastantes empresas a nivel pequeño y mediano. La diferencia es que nosotros usaremos CentOS, mientras que en una empresa es más probable usar un Windows Server (No tengo nada contra WS, pero resulta más eficiente el uso de Linux para administración de servidores. Más control)

    Una vez planteado todo, lo iremos montando poco a poco.

    El esquema a seguir será el siguiente:

    1. Instalaremos un servidor DHCP y configuraremos las opciones del mismo.
    2. Configurar las interfaces eth0 y eth1 para su funcionamiento.
    3. Enrutar los paquetes entre las dos conexiones (IP Forward y NAT)
    4. Establecer las políticas de filtrado (iptables)
    Sugerencia: Recomiendo usar CentOS en runlevel 3 (Línea de comandos). Ganaremos rapidez en el servidor al omitir el entorno gráfico.

    Nota: Todos los comandos deben ser ejecutados como Superuser (root).

    1. Instalación del servidor DHCP y configuración del mismo.

    En primer lugar, hay que descargar de los repositorios de CentOS el servidor DHCP. El paquete actual a fecha de hoy es dhcp-3.0.5-29.el5_7.1. Para instalarlo, en la línea de comandos, escribimos

    # yum install dhcp

    El ordenador buscará en los repositorios de CentOS el paquete solicitado. Una vez lo tenga, lo bajará a nuestro ordenador, lo configurará y lo intentará inicializar sin éxito, debido a que no tiene una configuración predefinida todavía.


    Una vez tenemos bajado el servidor DHCP, vamos a proceder a configurarlo.

    En primer lugar, tenemos que tener fijada cuál va a ser nuestra política de administración de las direcciones IP, así como del rango de direcciones disponible, máscara de subred, puerta de enlace y servidor DNS. Como será un servidor único, no usaremos política de alquiler de direcciones.

    El archivo de configuración a editar se encuentra en /etc y se llama dhcpd.conf. Si lo ejecutamos con nano y vim, nos saldrá que el archivo de configuración de muestra se encuentra en /usr/share/doc/dhcp-3.0.5/dhcpd.conf.sample. Para evitar posibles fallos y autorizaciones erróneas, introduciremos nuestro propio dhcpd.conf sin copiar el archivo de muestra.

    Como ejemplo, vamos a usar la subred 172.16.1.0,  máscara de subred 255.255.255.0, puerta de enlace la 172.16.1.1, DNS el 8.8.8.8. La administración de direcciones IP va de la 20 a la 30.

    El archivo quedaría así:


    # /etc/dhcpd.conf
    ddns-update-style none;
    ignore client-updates;

    subnet 172.16.1.0 netmask 255.255.255.0 {

    option routers 172.16.1.1;
    option subnet-mask 255.255.255.0;
    option domain-name-servers 8.8.8.8;

    range dynamic-bootp 172.16.1.20 172.16.1.30;
    }



    Guardamos el archivo. Ahora tenemos configurado correctamente todas las opciones que requería nuestro servidor. Seguimos sin poder ejecutar el servicio debido a que no hemos configurado la dirección IP del interfaz a usar, pero lo arreglamos enseguida.

    PD: Las dos primeras líneas (ddns-update-style y ignore client-updates) vienen a decir que no queremos actualizaciones dns e ignoraremos las peticiones de clientes queriendo renovar su dirección IP local.

    (Corrección hecha por el usuario Juan Ortega. Comentario más abajo. Gracias por la ayuda)
    Si tenemos un equipo al que le queremos dar una IP fija, añadimos la siguiente línea:

    host (nombre máquina abreviado) {
    option host-name (nombre máquina completo);
    hardware ethernet (dirección mac);
    fixed-address (dirección ip que le damos);
    }

    El nombre abreviado o completo de máquina lo pueden poner como quieran.

    Nota: la dirección IP que le demos debe estar en la subred o subredes del servidor DHCP que definan.

    2. Configurar las interfaces eth0 y eth1

    Las interfaces eth0 y eth1, por lo general, tendrán diferente rango de direcciones IP:

    • eth0: Deberá llevar la dirección que pusimos en option-routers, ya que CentOS es nuestro servidor y puerta de enlace para la red local.
       
      • Bloque de direcciones a usar:
        • Dirección IP: 172.16.1.1
        • Máscara de subred: 255.255.255.0
        • No requiere de gateway ni DNS.
    • eth1: A gusto del consumidor. Yo utilizaré un modelo DHCP, ya que usaremos CentOS solo para enrutar la red local y servir como filtro y eth1 se conectaría a un router ADSL, pero si necesita ser implementado como red fija, especificaré donde proceda.

    En CentOS, las configuraciones de las interfaces de red no se hacen por ifconfig de forma general. En su lugar, lo haremos más eficiente.

    Hay dos modos:

    • Usando la Utilidad de configuración en modo texto (setup). Se ejecuta poniendo en la línea de comandos  # setup. Es más fácil de manejar.
    • Editando los archivos de configuración. Se encuentran en /etc/sysconfig/network-scripts/ y su nombre es ifcfg-ethx, donde x es el número de conexión
    Setup es una sencilla herramienta semigráfica que mediante un menú intuitivo nos permite configurar las interfaces fácilmente.

    La edición de los ficheros de configuración se puede realizar utilizando Vim o Nano, el que más rabia os dé.

    El fichero de configuración será algo así para eth0:

    # (Controlador del adaptador de red)


    DEVICE=eth0
    BOOTPROTO=none
    ONBOOT=yes
    HWADDR=(Dirección MAC del adaptador)
    IPADDR=172.16.1.1
    NETMASK=255.255.255.0

    Para el fichero eth1, algo tal que así:


    # (Controlador del adaptador de red)


    DEVICE=eth1
    BOOTPROTO=dhcp
    ONBOOT=yes
    HWADDR=(Dirección MAC del adaptador)

    Si queremos especificar un gateway en cualquiera de los dos adaptadores, se añadirá GATEWAY=(Dirección del gateway). Si queremos añadir un servidor DNS, debemos cambiar el archivo de configuración ubicado en /etc/resolv.conf, y en las líneas que proceden escribir.

    nameserver (dirección DNS)


    Una vez modificados los valores de los ficheros de configuración y del Setup, debemos reiniciar el servicio para que la configuración tenga efecto. Para ello, escribimos:

    # service network restart

    Una vez realizamos la siguiente acción, la dirección de las dos interfaces se cambiará a la que hayamos configurado en el Setup o los ifcfg. Acto seguido, procederemos a iniciar el servicio dhcp, para así inicializar la red local. Para ello, en la misma consola, escribimos:

    # service dhcpd start

    PD: Si falla el inicio de dhcpd, revisa los ficheros de configuración  (generalmente es que falta un punto y coma, o algo mal puesto de nombre). Si no encuentras nada, existe un fichero en /var/log/messages que nos dirá lo que nos chirría de la configuración general de dhcp o cualquiera que estemos usando. Si falla alguna cosa, revisar este archivo es lo más conveniente. se ejecuta con:


    # cat /var/log/messages

    3. Enrutar los paquetes entre las dos conexiones (IP Forward y NAT)

    Hemos configurado las dos interfaces, pero aunque hayamos configurado, nos resulta un poco "inútil", debido a que aún nos falta realizar el enrutamiento y el seguimiento de paquetes entre interfaces. Para ello, debemos activar el IP Forward y establecer NAT para realizar un enrutamiento exitoso.

    • Activar IP Forward: Para activarlo, tenemos que editar el fichero /etc/sysctl.conf, y en la línea denominada

      net.ipv4.ip_forward = 0

      Editar el 0 por un 1. Reiniciar el servidor CentOS para que los cambios hagan efecto.

    • Establecer NAT como configuración de enrutamiento: Por sí solo, el IP Forward no sirve de nada si no ejecutamos una excepción en iptables para añadir una "ruta" interna entre ambas interfaces y así poder enrutar.

      Para ello, en la consola, escribimos:

      # iptables -F
      # iptables -t nat -F


      Estos dos primeros comandos son para limpiar las configuraciones.

      # iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -d 0/0 -j MASQUERADE
    Una vez realizado ésto, CentOS podrá enrutar los paquetes que le lleguen desde eth0 a eth1 y así, dar acceso a Internet a la red local en DHCP que montamos anteriormente.

    4. Establecer las políticas de filtrado (iptables).

    Una vez todo está funcionando, es posible que solo queramos que estén abiertos determinados puertos, o denegar el acceso a un usuario concreto, permitir que pase información de un puerto... Para ello, CentOS y su iptables (cortafuegos) nos podrán ayudar para establecer qué dejamos o no pasar a través de la red.

    Lo primero de todo, antes de establecer filtros, vamos a eliminar la configuración antigua del cortafuegos. Para eso, teclearemos los siguientes comandos:


    # iptables -F (Borra todas las reglas de iptables)
    # iptables -X (Igual que -F)
    # iptables -Z (Pone el contador de paquetes de iptables a cero)
    # iptables -t nat -F (Borra la regla de enrutamiento NAT anterior)

    Una vez tecleamos todos estos comandos, procederemos a disponer nuestra propia configuración. Por ejemplo:

    • Permitiremos acceso a los puertos de Internet básicos (80 y 443, HTTP y HTTPS)
    • Permitiremos un puerto de conexión segura (22, SSH)
    • A un equipo le daremos acceso total.
    Para empezar, restauraremos la última línea de cuando usamos NAT en el servidor:

    # iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -d 0/0 -j MASQUERADE

    Para que el servidor acepte y reenvíe paquetes, debemos aceptar las políticas de uso (INPUT para enviar paquetes, FORWARD para enrutar, y POSTROUTING para enviar a la ruta)


    # iptables -P INPUT ACCEPT
    # iptables -P FORWARD ACCEPT
    # iptables -t nat -P POSTROUTING ACCEPT


    Para aceptar las políticas de HTTP y HTTPS, añadiremos la siguiente línea:

    # iptables -A FORWARD -s 172.16.1.0/24 -p tcp --dport 80 -j ACCEPT
    # iptables -A FORWARD -s 172.16.1.0/24 -p tcp --dport 443 -j ACCEPT

    Para aceptar el SSH, añadiremos la siguiente línea:

    # iptables -A INPUT -s 172.16.1.0/24 -p tcp --dport 22 -j ACCEPT

    Para rechazar los paquetes de un determinado número de puerto. 

    # iptables -I INPUT -s 172.16.1.0/24 -p tcp --dport (puerto cualesquiera) -j DROP

    Para el acceso total a un equipo, añadiremos la siguiente línea. Como ejemplo, pondré el 172.16.1.2

    # iptables -A FORWARD -s 172.16.1.2 -j ACCEPT

    Para consultar todos los cambios hechos, ejecutamos:


    # iptables -L


    Para guardar la configuración, ejecutamos:


    # iptables-save


    Nota: Para las reglas iptables, es más recomendable usar un script, para ejecutar todo a la vez y no uno a uno.

    Siguiendo estos pasos, conseguiremos tener nuestra propia red local con un CentOS como router.

    Fuentes:
    Redes de Área local. Aplicaciones y Servicios Linux [Formación del profesorado]. Instituto de Tecnologías Educativas.
    Experiencia propia.

    Revisión de artículo: Octubre de 2013
    Razón: Corrección del contexto. Adición de la cláusula de rechazo de paquetes. Corrección de la cláusula de IP fija gracias al comentario de un usuario.

      domingo, 4 de diciembre de 2011

      Desactivar la campana del sistema en CentOS

      En esta entrada voy a explicar cómo deshacerse de la tediosa Campana del sistema, o pcspkr, que la mayoría de los sistemas operativos basados en Linux carga en el kernel y puede llegar a resultar cargante para cuando trabajamos en modo texto.

      Hay dos modos para desactivarlo: Solo la sesión o definitivamente.

      • Sesión activa:

        Si queremos desactivar la campana del sistema solo en la sesión actual, debemos teclear en la terminal

        # rmmod pcspkr


        De esta forma, el sistema apaga el pcspkr y no sonará más la campana del sistema en la sesión. Si deslogueamos e iniciamos de nuevo, la excepción se quitará y el sistema volverá a emitir el sonido
      • Definitivamente:

        Para descartar definitivamente el controlador, podemos utilizar dos métodos:

        En consola de comandos, escribir:
        # rmmod -v pcspkr
        Que descarta el módulo pcspkr e inicia el ordenador sin sonido.

        Si no funcionase éste comando, modificamos el fichero /etc/rc.d/rc.local con vim o nano y añadimos la línea /sbin/rmmod pcspkr al final del documento
       De estas formas podremos desactivar el tedioso sonido de la campana del sistema.

      Fuente:
      Diversos blog de Linux sobre el problema

      Experiencia propia.