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.

viernes, 18 de abril de 2014

Reseteo de la contraseña de Windows usando Hiren's Boot

"¡Oh, dios, el blog sigue vivo! ¡Vivo!"

Hiren's boot es una herramienta demasiado completa que nos puede sacar a cualquiera de un aprieto. Tiene muchísimas herramientas, tales como defragmentador, testeo de unidades de disco o de RAM, recuperación de archivos vitales del sistema y antivirus.

En esta entrada usaré una aplicación que trae, muy útil para cuando olvidamos (u otra gente se olvida) las contraseñas de nuestros sistemas Windows.

La herramienta que vamos a usar se llama Offline NT/2000/XP/Vista/7 Password Changer. Dicha aplicación se encuentra en el mismo inicio del disco de rescate.


El uso de esta aplicación tiende a ser un poco "complicada" debido a que no se ajusta demasiado bien a la pantalla (sea cualesquiera, lo he probado tanto en VM como en ordenador real y se ve un poco mal, así que intentaré explicarlo de la mejor forma que pueda con el material que he recopilado de mi sistema).

Una vez iniciada la aplicación, empezará a iniciarse. Primeramente, inicializará los discos duros y nos los mostrará en pantalla para seleccionar el que queramos administrar.

El proceso consta de tres pasos: Seleccionar disco, Seleccionar el directorio de Windows y del Registro de Windows y Edición de la tabla de usuarios. También está el paso 4, que es el de guardar los cambios realizados en los usuarios.



Paso 1: Selección de disco.


En la imagen hay dos discos: Uno de 8178 MB y otro de 508 MB. En este caso, el sistema operativo que puse esta en el /dev/sda1. Por defecto, te selecciona el primer disco, así que seleccionamos el que sea (pulsando de 1 a X, donde X representa el número máximo) y le damos a Enter.

PD: El resto de opciones representadas en la imagen hace referencia a los drivers de los discos duros.Como no procede, ya que en el 99% de los casos inicializa los drivers si o si, no me centraré en ello.

Paso 2: Selección del directorio de Windows y del registro de Windows.

Una vez seleccionado el disco, el programa buscará el directorio por defecto donde suele estar instalado Windows.

Si no modificamos los directorios ni rutas por defecto, debería salir algo tal que así:


Si la ruta del directorio es correcta, aparecerá marcada debajo. Le damos a Enter y seguimos.

Una vez ejecutado, el programa nos "destripará" el registro y nos dará unas opciones.



Ahora nos dará dos opciones: Resetear contraseñas o parámetros de la consola de recuperación. Como solo nos interesa el reseteo, le damos a Reset Password, que es la opción 1 (El programa la marca como la por defecto).


Paso 3: Edición de la tabla de usuarios.

Una vez lo seleccionamos, el programa copia la tabla del SAM (que es, por así decirlo, el módulo que controla los usuarios y contraseñas del sistema) en un fichero temporal /tmp, para no machacarlo todo del tirón en el sistema.

Una vez copia todo, ofrece dos opciones: Edición de usuarios y contraseñas o edición del registro. También nos marca la q, para salir guardando datos en caso de que hayamos modificado alguna cosa. Como solo nos interesa la edición de usuarios, le damos al 1 (El programa la marcará por defecto).

Una vez ejecutado, saldrá lo siguiente.
PD: En la siguiente captura ya seleccioné el nombre de usuario a machacar, pero ustedes lo pueden seleccionar. Únicamente, una vez le den al Enter, saldrá la lista y marcará al Administrador como por defecto. Ponen el nombre del usuario que quieran editar o ponen 0xRID (con el RID que muestra el usuario)



Ahora nos mostrará las opciones de edición del usuario:

  1. Quitar contraseña.
  2. Editar la contraseña del usuario (no funciona bien en XP o superior, así que no funcionará)
  3. Promocionar usuario (Subir su rango a Administrador)
  4. Desbloquear y habilitar usuario (En caso de que esté bloqueado. Si no lo está, aparecerá entre paréntesis)
Por defecto nos muestra la "q" como opción siguiente. Como lo que queremos es quitarla, pulsamos 1 y le damos a Enter.



Una vez introducido, nos volverá a pedir el nombre de usuario que queramos editar. Como ya no queremos editar (¿O si? en ese caso, repite los pasos anteriores y listo), le damos al signo de exclamación (aquí no es la q, si no !).

Después, nos vuelve a sacar a la edición de usuarios y de recuperación de la consola. Le damos a la q para salir del menú y guardar los datos.


Paso 4: Guardar los cambios realizados.

Ahora nos salta directamente al paso 4, que es el de guardar los datos. Nos mostrará por defecto la opción n, que no guarda los datos. Le damos a la y para que guarde.


Una vez le damos a guardado, nos dice si queremos ejecutar un nuevo arranque del programa. Por defecto marca la n, así que si queremos ejecutarlo de nuevo pulsamos la y.


Una vez acabe, le damos al botón de reset del ordenador o escribimos reboot para reinciar.

Si lo hemos hecho bien, habremos conseguido resetear la contraseña.

Fuentes:
Experiencia propia (Reciclaje de apuntes del módulo)

PD: Si consigo utilizar bien el OPHCrack, publicaré como recuperarlas y no resetearlas como hacemos aquí.

Última revisión: Abril de 2014
Razón: Formato 

jueves, 13 de diciembre de 2012

Creación de archivos por lotes para pequeñas cosas. Parte 3: Script para añadir direcciones IP manualmente.

Sé que en principio iban a ser solo dos partes de esta "saga", pero he descubierto nuevas utilidades para esto. 

Hace relativamente semanas (Más bien días) decidí desempolvar mis viejos scripts que usaba en el curso para cambiar direcciones IP de manera rápida y eficaz (Véase la primera parte de ésta "coletilla de sagas". Enlace aquí.) El caso es que me puse a revisar bien los scripts y pensé "Tío, molaría un script en el que las direcciones IP las pusiera yo y no tuviera que andar entrando en el archivo para editar". Investigué un poco de programación en éste lenguaje (un cacho de nada, solamente lo importante y útil) y encontré por fin la solución.

Haciendo memoria (para los que quieran un flashback más extenso, ver el enlace anterior):

Comandos que introducimos para cambiar las direcciones:

Para IP, Máscara de red y Gateway:

netsh interface ip set address "{adaptador a usar}" static {Dirección IP} {Máscara de red} {Gateway}

Para los DNS:

netsh interface ip add dns "{adaptador a usar}" {DNS primario}

netsh interface ip add dns "{adaptador a usar}" {DNS secundario} index=2

Cómo realizar el script

Para introducir datos en el script, tendremos que utilizar una variable que permita la entrada de texto. Yo he elegido una solución "guarrera" que consiste en introducir los datos como si fueran variables de entorno y, después de introducirlas, borrarlas.

PD: Si alguien tiene una solución más limpia, favor de decírmela. Programación de éste tipo de cosas, en cmd, NUNCA ha sido lo mío.

1. Identificamos las variables a usar.

Son 5: IP, Máscara, Gateway, DNS1 y DNS2. Podemos llamarla como queramos. Yo por ejemplo, las he llamado:

IP - direccionip
Máscara de red - mascarared
Gateway - gatewayy (con dos y)
Primary DNS - primardns
SecondaryDNS - seconddns

2. Montamos el tinglado.

Para introducir los datos, haremos un "echo" intermedio. Así, nos irá preguntando el programa cada cosa a insertar. Por ejemplo:

echo "Introduce la dirección IP"

Ahora, la parte "difícil" para meter las direcciones: La entrada de datos.

Para introducir, utilizaremos el comando set /p: /p es un modificador de variable, que se utiliza para introducir la misma.

Íbamos por la IP ¿No? Montaremos el comando de ésta manera:


set /p direccionip=

En la continuación del signo igual va lo que introducimos.


Hecha la primera, hacemos lo mismo con las demás. (El ejemplo de script está más abajo, si tienes duda, consulta mas abajo)

Una vez fijadas las variables, usaremos las anteriores líneas de comando netsh para utilizar el script. Para que funcionen ahora las variables, debemos meter entre porcentajes las variables de entorno que hemos introducido. Si la variable es Pericopalito, en los comandos se utiliza con %pericopalito%

Así, por ejemplo, en la línea de netsh anterior, en donde ponemos la dirección IP debemos poner %direccionip%, o en gateway, poner %gatewayy%

Una vez tenemos todo escrito y bien configurado, pasaremos a eliminar las variables.
Para eliminarlas, debemos introducir de nuevo el comando set, pero sin el modificador /p.

El script completo

# Parte 1: Variables a introducir. 

# echo Introduce el nombre de adaptador que quieres modificar
# set /p nominterfaz=
# echo Introduce la dirección IP que quieres
# set /p direccionip=
# echo Introduce la máscara de red a usar
# set /p mascarared=
# echo Introduce el gateway
# set /p gatewayy=
# echo Introduce el DNS primario
# set /p primardns=
# echo Introduce el DNS secundario
# set /p seconddns=


# Parte 2: Comandos que se usan con las variables definidas.


# netsh interface ip set address "%nominterfaz%" static %direccionip% %mascarared% %gatewayy%
# netsh interface ip add dns "%nominterfaz%" %primardns%
# netsh interface ip add dns "%nominterfaz%" %seconddns% index=2


# Parte 3: Borrado de variables.

# set nominterfaz=
# set direccionip=
# set mascarared=
# set gatewayy=
# set primardns=
# set seconddns=


Las almohadillas las he puesto para "citar" el script. Deben borrarse para que se inicie de forma correcta.

El archivo debe tener la extensión .bat.
Si se fijan en la imagen subida, yo le tengo puesto de nombre "persoipcable.bat"

Script1sindatos

script2completo


Como ven, el script funciona bien.

Si quieren luego quitar las direcciones IP, usen el script de la otra entrada (El de poner en DHCP las interfaces).

Y como es normal, necesita derechos de administrador para ser ejecutado.

Próximamente, los programas personalizados del R.A.T 7 (cuando los acabe)


Fuentes:

Anterior entrada.
Experiencia propia.
Microsoft y sus páginas de ayuda. (No pongo el enlace porque ahora mismo no lo encuentro)

EXTRA (Actualizado el 20-12-12)

Se puede utilizar también el nombre del adaptador, para así tener uno específico. Actualizo los datos del actual (Las imágenes no las actualizo, pero funciona igual)

miércoles, 28 de noviembre de 2012

Información sobre novedades y revisiones.

En los últimos días he estado analizando algunas cosas del blog, con la intención de mejorarlo poco a poco. Los puntos que destaco son:

- Las entradas hechas hasta ahora, las cuales estoy reeditando debido a errores de lectura, alguna info contradictoria o datos que faltaban por completar. (Algunas entradas aún están sin acabar, como la de Usos del comando SC, que falta la parte de creación de servicios con el comando,y también la de Usar un SO CentOS como FTP, la cual voy a reeditar en unos días para hacerla más completa, y ya ni hablemos de la de Resolución de DHCP, la cual voy a ver si reescribo para mejorarla, que la veo muy ambigua) Si encuentran alguna información que esté mal, me gustaría que me lo dijeran para revisar y reeditar.

- El "buffer" de entradas que estoy elaborando (tengo algunas entradas para publicar como un minimanual de iptables, además de un pequeño manual-proyecto con un mouse de juegos Cyborg R.A.T 7 y sus diferentes usos). El problemilla del buffer es que siempre tardo mucho en publicar porque lo reviso muchas veces y voy cambiando palabras, o añadiendo info extra; entonces, por ése motivo, a veces tardo en publicar nuevas entradas, y también en revisar las hechas con anterioridad.

- El diseño del blog, el cual estoy adaptando para que se visualice de mejor forma (letra clara, fondos que no rompan la vista, simpleza de formato)

- La futura adición de imágenes en el blog (Hasta ahora no había subido ni una sola imagen, y me estoy dando cuenta que no puedo huir eternamente de documentarlo un poco) El motivo por el que nunca he subido imágenes es un poco nimio: Odio subir fotos y que se publiquen en Picasa (sonará estúpido, pero semos asín). Por esa razón, voy a hacer una cuenta en un servidor de imágenes externo y empezar a documentar las siguientes entradas (y si puedo, documentar las existentes lo que se pueda)

A fin de mejorar el servicio,  intentaré solucionar ésta serie de puntos para ofrecer una información más completa y detallada.

PD: También voy a probar el sistema de publicación de entradas programado. Por curiosidad.

sábado, 3 de noviembre de 2012

Área de intercambio (swap)


¿Qué es la swap?

La swap (también llamada área de intercambio) es un zona del disco duro, bien sea partición o archivo, que se usa para guardar las imágenes de los procesos que no pueden mantenerse en la memoria física o bien se transfieren para ahorrar memoria física. De este modo, por ejemplo, si tenemos un ordenador que soporta únicamente 1GB de memoria RAM, le podemos crear una partición swap de 1GB y así el ordenador pasaría a tener 2GB de memoria RAM: 1GB en la física y otro GB de memoria en el área de intercambio.

Quizá el nombre de swap nos suene a chino, Así que podemos pasar a llamarlo de igual forma, como Memoria virtual

Para tomar un ejemplo, vamos a pensar hipotéticamente que tenemos un sistema con arquitectura de 32 bits. Un sistema de ésa arquitectura puede manejar hasta 3GB de datos y no soporta más a partir de ahí. Si necesitáramos hacer uso de una capacidad de 4GB en ése ordenador, crear una swap de 1GB sería lo más acertado si no queremos reinstalar a un sistema de 64 bits.

¿Es bueno tener swap?

Siempre es bueno tener un espacio swap, por si acaso en algún momento nos faltara memoria RAM.


En los sistemas operativos, si no en la mayoría, siempre se intenta maximizar el uso de la memoria: si un ordenador tiene apenas 512 de RAM, los aproveche al máximo de su potencial. Sin embargo, si no es capaz de aguantar todos los procesos, sería bueno crear una partición swap extensa. Si por ejemplo, lo que usamos son procesos que no tienen por qué mantenerse todo el rato en la memoria física, se envían a la swap.

Además, como ejemplo práctico: Cuando iniciamos Linux hay muchos servicios y procesos que ejecutamos en el ordenador (cups, hidd, sshd, entre otros). Si el ordenador no los va a usar en ése momento, los puede pasar a la swap y dejarlos en segundo plano, y si los requiere para usar en la memoria principal, los pasaría de la swap a la física cuando fuera oportuno. 

La memoria swap ¿Es exclusiva de los sistemas Linux?

No. Windows también usa áreas de intercambio similares a las de Linux, con la diferencia de que dichas áreas se localizan en la misma partición donde se está ejecutando el sistema. Así, por ejemplo, no es necesario hacer dos o más particiones para un solo sistema Windows. Aun así, Linux también permite crear ficheros de swap, por si en nuestro disco duro no pudiéramos crear más particiones y fueramos muy justos de espacio de particionado.


¿Qué tipos de  espacio de memoria swap hay?

Existen dos tipo de espacio:

  • Partición de swap.

Está basada en la creación de una partición en disco dedicada exclusivamente para la swap.

Entre sus ventajas están que no se necesita desfragmentar nunca dicha unidad, y que si es colocada al principio de un cilindro, actuará de mejor forma.

Como desventaja está que la partición swap siempre estará ocupada y al 100% de su capacidad, lo cual no es una desventaja muy grande. Además, si nuestro espacio de particiones es muy limitado, crear una swap no siempre es un buen método.

  • Archivo swap

Es un archivo alojado en un sistema de ficheros, el cual hace de memoria swap. Normalmente se crea un archivo swap en dos casos: No tenemos espacio para una partición swap independiente, o hemos modificado las prestaciones del ordenador y necesitamos más memoria swap aparte de la adicional creada.

Entre algunas de sus ventajas se encuentra la versatilidad (crear, borrar, y editar la partición como quiera el usuario), si bien su principal desventaja es la fragmentación que puede ocasionar el fichero.



Aunque aquí no lo vaya a exponer, algunas distribuciones de Linux como CentOS permiten crear en una sola partición de disco un LVM (Logical Volume Manager). Un LVM es un administrador lógico de disco que usa, por ejemplo, 50 GB de disco como una sola partición. En esos 50 GB de disco, se pueden crear varias particiones dentro (una para /home, otra para /usr), y puede dar la opción de crear una partición swap en ellas; así, por ejemplo, puedes tener una partición de 50 GB llamada /hda1, pero que en realidad se divida en /hda2 para sistema de archivos, /hda3 para swap, /hda4 para /home/usuario... La única "pega" que puede llegar a tener es que requiera de una partición auxiliar llamada /boot para que haga el montaje del LVM, lo cual serían tres particiones en dos.

Nota: LVM es algo que no he dado mucho, así que si por algún casual estoy diciendo una barbaridad o me equivoco en la descripción, me gustaria que me lo comunicaran cuanto antes. Es una definición que se me ha ocurrido que es así, basándome en los datos que tengo, pero que no estoy convencido de si será. Mejor errar, preguntar y rectificar que errar y creer que estoy en lo correcto cuando no es así ;-)

¿Cuánto espacio de swap sería conveniente utilizar?

Antiguamente siempre ha existido un debate sobre cuánta memoria swap debe darse en un disco duro.

Una amplia mayoría expone que es bueno que la memoria swap sea el doble que la memoria real, pero eso era antes, donde la memoria RAM era un poco escasa y los ordenadores que llegaran a 1GB de RAM se consideraban una maravilla. En la actualidad, algunos informáticos siguen optando por usar este modelo.

Otra mayoría argumenta que lo mejor sería calcular un intermedio sobre lo que iríamos a hacer en el ordenador. Así, por ejemplo, si el sistema que vamos a manejar posee poca RAM, haríamos un cálculo aproximado de la memoria que podríamos llegar a utilizar y ponerla como swap (Por ejemplo, si tenemos un sistema de 512 MB y pensamos que necesitamos tener 2GB, haríamos la diferencia, la cual sería 1536 MB como swap)

Ahora, con la aparición de los portátiles y sobremesas de 4GB, 6GB y hasta 8GB, hasta podríamos prescindir de la creación de swap, pues Linux no requiere exclusivamente de que haya swap, pero sí es bueno tener la partición por si acaso.

Tengo dos sistemas linux en un mismo disco duro ¿Se puede compartir la partición swap?

Se puede, siempre que esa swap sea partición y no archivo. Como la swap corresponde a una partición determinada con su correspondiente UUID, bastará con decirle al sistema operativo al que queramos añadir la swap, en su /etc/fstab, que monte la unidad swap y la inicialice.

Existe el debate de si es bueno o no usar este método. Unos dicen que no pasa nada, debido a que el sistema cuando se apaga, borra todo lo existente en la swap, con lo que queda lista para el siguiente sistema sea uno u otro. Otros, sin embargo, explican que el SO puede crear unos registros en la swap y éstos interfieran en los demás sistemas, y además algunos sistemas son bastante reticentes en que se comparta swap.

Nunca he tenido la oportunidad de realizar el experimento, pero si se presenta la ocasión, la realizaré y les comento qué sucede. Si alguno quiere corroborar alguna de las dos teorías, es libre de hacerlo.

Fuentes:
Wikipedia.
Apuntes de clase.
Para la "explicación" de LVM me ayudé de varias páginas, aparte de la experiencia propia con ése sistema.
Experimentos realizados en entornos controlados.
Para la parte de compartición de swap, algunos blogs sobre el tema.

Ultima revisión: Abril de 2014
Razón: Correcciones ortográficas.

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.

    viernes, 27 de julio de 2012

    Feliz día del sysadmin

    Hoy, viernes 27 de julio de 2012, es el día internacional del administrador de sistemas (Sysadmin en su abreviatura internacional).

    Un sysadmin o administrador de sistemas se encarga de mantener los equipos informáticos de una empresa o local totalmente operativos, sea un solo equipo o una red de cómputo amplia. Por lo general, tiene conocimientos de todos los campos de la informática, ya sea a nivel básico o medio, y de las ramas de software y hardware, así como también diseño de redes, gestión y administración de información y seguridad y disponibilidad.

    En la página http://sysadminday.com se hace un breve resumen de las tareas principales que realiza un administrador y el por qué debemos agradecerle lo que realiza (al menos por un día al año, que no hace daño)

    Así que, si eres un sysadmin ¡Feliz día del administrador de sistemas!
    Y si no lo eres ¡Felicita a los sysadmins que conozcas! ¡Te lo agradecerán con algún escáner de puertos seguro!

    Fuentes:

    http://sysadminday.com (Página en inglés)
    Wikipedia