viernes, 25 de julio de 2025

Sistemas Operativos 9.- Conexión remota en Linux. Servicio SSH

  ¿Te pierdes entre tantos temas? 📚✨ Descubre todo lo que ofrece este blog en un solo vistazo [👉 Ver índice completo]

El servidor de shell seguro o SSH nos va a permitir comunicar dos ordenadores (cliente y host) de forma segura ya que desde el primer momento las comunicaciones viajan encriptadas. Primero, el servicio SSH comprueba que el servidor remoto es quien dice ser (para prevenir los ataques de man in the middle) y segundo, como ya hemos dicho, encripta las comunicaciones entre el host local y el remoto.

SSH consta de dos partes. Un servidor SSH funcionando en el host remoto, escuchando conexiones entrantes en el puerto 22, y un cliente SSH en el sistema local para comunicarnos con el servidor remoto.

Instalación del cliente y del servidor SSH.


Para instalar el servidor y el cliente de SSH debemos ejecutar el comando:

sudo apt-get install ssh

Los archivos de configuración se encuentran en:
  • Para el cliente en /etc/ssh/ssh_config
  • Para el servidor en /etc/ssh/sshd_config. (el servicio funciona sin tener que modificar nada de este fichero, la mayoria de las líneas están comentadas)
Consejo: si no tienes un servidor remoto al que conectarte pero quieres probar estos ejemplos, asegúrate de que este paquete este instalado en tu sistema y usa localhost como nombre del host remoto.

Arranque y parada manual del servidor SSH


El servidor SSh dispone de un script de arranque y parada que está en la carpeta /etc/init.d

Los comandos en función de lo que queramos hacer son:
  • sudo service ssh start //para arrancar manualmente el servicio
  • sudo servide ssh stop //para parar manualmente el servicio
  • sudo service ssh restart // reiniciar el servidor ssh
¡¡RECUERDA!! Cada vez que se modifica un fichero de configuración del servicio hay que reinicializar el servicio.

Conexión al servidor mediante SSH.


Para conectar desde un PC cliente al servidor mediante ssh, debemos ejecutar el comando ssh seguido del nombre ó dirección IP del servidor. La conexión se realizará con el mismo nombre de usuario que estemos utilizando en el PC cliente. Ejemplo, supongamos que desde mi pc windows quiero conectarme a un pc cuya ip es 192.168.1.119 y a una sesión del usuario "alumno". Aunque se puede hacer desde el Powershell de Windows también puedes utilizar un programa muy popular para realizar conexiones ssh que es puTTY. (El mismo comando se utiliza en Linux)

ssh conexión a host remoto

La primera vez que se intenta la conexión, se muestra un mensaje indicando que la autenticidad del
host remoto no puede ser establecida. Es porque el programa cliente nunca ha visto al host remoto
antes. Para aceptar las credenciales del host remoto, introduce “yes” cuando te pregunte. Una vez
que se establece la conexión, el usuario/a es preguntado/a por su contraseña.

UN MOMENTO, me he dado cuenta que mi usuario en Windows no es el mismo que el usuario a cuya sesión quiero entrar en el host. Así que tengo que repetir el proceso pero indicando que usuario se va a conectar en la máquina y en que host o ip.

conexion por ssh realizada

Como ves es posible conectarse a sistemas remotos usando un nombre de usuario diferente al del host cliente. Solo tienes que usar:

ssh nombre_usuario@ip_servidor

La sesión en el shell remoto continua hasta que introduzcas el comando exit en el promt del shell remoto, cerrando así la conexión remota.

Restringir el acceso SSH


Podemos restringir el acceso al servidor por usuarios/grupos o por máquinas. 

  • Por usuarios/grupos. Para evitar que todos los usuarios (o grupos) de la máquina servidor estén acesibles por SSH tendremos que editar como root el archivo /etc/ssh/sshd_config (en el servidor) y añadir uno de estos dos parámetros:
        a) el parámetros AllowUsers (o AllowGroups para permitir por grupos) y a continuación los usuarios que deseamos que se puedan conectar remotamente via SSH. Por ejemplo en mi equipo remoto voy a permitir solo a los usuarios "alumno" y "pedrín" conectarse por ssh.

    AllowUsers

        b) O el parámetro DenyUsers (o el parámetro DenyGroups para los grupos)  y a continuación los usuarios o grupos que NO permitimos su conexión. Por ejemplo:

        DenyUsers alvaro manuela

  • Por equipo. También podemos restringir el acceso dependiendo de las IP de los equipos que intentan acceder a nuestro servidor. Si queremos solo permitir el acceso a uno o varios equipos(en el servidor) tendremos modificar los siguientes ficheros:
           ➢/etc/hosts.allow donde, permitimos el acceso a los equipos por IP, de la siguiente manera           por ejemplo:
     sshd: 180.180.1.0/15 190.168.1.119
           ➢/etc/hosts.deny donde denegamos acceso a todos los equipos
    sshd: ALL
    Si  queremos  denegar  el  acceso  a algún equipo  basta  con  añadir  la línea correspondiente  al  fichero /etc/hosts.deny, por ejemplo
    sshd:180.180.1.24   180.180.1.67

Para saber que usuarios están conectados al servidor podemos usar en este el comando "who"

who

Como ves tengo al usuario "alumno" conectado directamente en el servidor en una sesión de usuario, y también al usuario alumno conectado desde otro ordenador (ip 192.168.1.74)

Servicios adicionales.

El paquete SSH no solo nos proporciona conexión remota, sino que proporciona otros servicios como:

- Ejecutar un comando en el servidor sin entrar en el prompt (en la terminal) de este.

El comando ssh se puede utilizar para ejecutar un comando en una máquina remota sin acceder al indicador de comandos (prompt). La sintaxis es:

ssh  IP  comando

Por ejemplo, si quieres entrar en el servidor como "alumno" y se quiere ejecutar el comando ls –al en el directorio de entrada de "alumno" en la máquina 192.168.1.119(servidor), hay que escribir el siguiente:

 
ejecución de comandos con ssh

Es posible usar esta técnica de muchas formas interesantes, como en este ejemplo en el que realizamos un ls en el sistema remoto y redirigimos la salida a un archivos en el sistema local:

ssh comando

Fíjate que se usan comillas simples en el comando anterior. Esto es porque no queremos que se produzca la expansión del nombre en la máquina local; en su lugar, queremos que se realice en el sistema remoto. Igualmente, si hubiéramos querido redirigir la salida a un archivo de la máquina remota, podríamos haber colocado el operador de redirección y el nombre de archivo dentro de las comillas simples:

ssh alumno@192.168.1.119 'ls -al > listado.txt'


Copia remota de archivos.


1) También disponemos de el comando scp que nos permite copiar, haciendo uso del túnel encriptado de SSH, archivos desde y hacia el servidor remoto desde el cliente.

Para copiar un archivo desde nuestro PC (cliente) al servidor (la carpeta de destino debe existir en el servidor):

scp nombreDelFichero    usuario@IP:donde_se_quiere_copiar

copiar archivos hacia el servidor.

Para copiar un archivo desde el servidor a nuestro PC:

scp usuario@IP:nombreDelFichero    donsequierecopiar

copiar archivos desde el servidor

El punto indica que el archivo se copie al directorio actual.

2) El segundo programa para copiado de archivos SSH es sftp, el cual, como su nombre indica, es
un sustituto seguro del programa ftp. En lugar de transmitir todo en texto plano, como hace el programa ftp, usa un túnel SSH encriptado.
sftp tiene una ventaja importante sobre el ftp convencional ya que no requiere un servidor FTP
corriendo en el host remoto. Sólo requiere el servidor SSH. Esto significa que cualquier máquina
remota que pueda conectar con el cliente SSH puede también ser usada como un servidor como-
FTP. Aquí hay una sesión de ejemplo:

ejemplo de sftp

Consejo: El protocolo SFTP es soportado por la mayoría de los gestores gráficos de archivos que
encontramos en las distribuciones Linux. Tanto si usamos Nautilus (GNOME) como Konqueror
(KDE) o thunar, podemos introducir una URI comenzando por sftp:// en la barra de direcciones y operar con archivos almacenados en un sistema remoto que esté ejecutando un servidor SSH.

Em mi caso por ejemplo sftp://alumno@192.168.1.119


Configurar el cliente (en Linux) para que el servidor no nos pida contraseña al conectar.


Puedes configurar una autenticación con claves SSH para evitar tener que ingresar la contraseña cada vez. Aquí te explico cómo hacerlo de forma sencilla y segura:

Generar un par de claves SSH (si no tienes una):
En tu máquina local, abre una terminal y ejecuta:

ssh-keygen -t rsa -b 4096

Presiona Enter para aceptar la ubicación predeterminada (~/.ssh/id_rsa) y, si quieres, configura una contraseña para la clave (o déjala vacía para no usar una).

Copiar la clave pública al servidor:
Usa el comando ssh-copy-id para enviar tu clave pública al servidor:

ssh-copy-id usuario@direccion_del_servidor

Te pedirá la contraseña del usuario del servidor una última vez. Esto copiará tu clave pública al archivo ~/.ssh/authorized_keys en el servidor.

Conectarte sin contraseña:

Ahora, al hacer ssh usuario@direccion_del_servidor, deberías conectarte directamente sin que te pida la contraseña.

(Opcional) Verificar y ajustar permisos:
Asegúrate de que los permisos de los archivos en el servidor sean correctos:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Esto garantiza que solo el usuario adecuado pueda leer los archivos.

Sincronizando Archivos y Directorios.

Una estrategia eficiente para respaldar sistemas es sincronizar directorios locales con otros ubicados en dispositivos de almacenamiento extraíbles o servidores remotos. Por ejemplo, puedes tener una versión local de un sitio web en desarrollo y sincronizarla periódicamente con la versión en producción en un servidor remoto.
En sistemas Unix/Linux, la herramienta ideal para esta tarea es rsync. Este programa permite sincronizar directorios tanto locales como remotos utilizando el protocolo remote-update, que detecta rápidamente las diferencias entre archivos y solo copia lo necesario.

Uso básico de rsync:

bash
rsync [opciones] origen destino
donde origen y destino puede ser uno de los siguientes:
  • Un archivo o directorio local.
  • Un archivo o directorio remoto [usuario@]host:ruta
  • Un servidor rsync remoto especificado con una URI  de rsync://[usuario@]host[:puerto]/ruta
Para empezar vamos a ver como sincronizar un directorio local (en mi caso Curso) que nos interese con otro directorio local también (Backup en mi caso).

bash
$ rsync -av Curso Backup

rsync


Mientras el comando se ejecuta, veremos una lista de los archivos y directorios que se están copiando. Al final vemos el mensaje que os he puesto en la imagen superior, indicando la cantidad de copia tramitada. Si ejecutamos, de nuevo el comando podemos ver lo siguiente:

comando rsync


En esta segunda ejecución no hay listado de archivos. Esto es porque rsync detectó que no había ningún archivo o directorio nuevo en el directorio de origen y por tanto no necesitaba copiar nada. Si, por ejemplo en el directorio de origen, añadimos un nuevo archivo y volvemos a ejecutar el comando:

segunda ejecución rsync

vemos que rsync detectó el cambio y copió solo el archivo actualizado.

Usando rsync a través de la red.


Podemos usar rsync para realizar copias de seguridad a través de la red. La copia remota puede hacerse de la siguiente forma.

Con otro sistema que tenga rsync instalado, a través de SSH. Imagina que en tu red local tienes un pc con mucho espacio en el disco duro y quieres realizar una copia de seguridad usando el disco de este pc. Asumiendo que el directorio de este pc tiene un directorio llamado Backup voy a realizar una copia de mi carpeta local Curso a este Pc remoto.

$ rsync -av --delete -rsh=ssh ./Curso alumno@192.168.1.119:/home/alumno/Backup


rsync en red

Las opciones que hemos utilizado son:

-a: Modo archivo. Es una combinación de varias opciones (-rlptgoD) que aseguran que los archivos se transfieran de forma recursiva, se conserven los enlaces simbólicos, se mantengan los permisos, se preserven las fechas de modificación, se conserven los grupos y propietarios, y se recreen los archivos de dispositivo y especiales.

-v: Salida detallada. Esto te mostrará los archivos que se están transfiriendo y otra información.

--delete: Esta opción le dice a rsync que elimine los archivos en el directorio de destino que no existen en el directorio de origen. Úsala con precaución, ya que puede llevar a la pérdida de datos si no se usa correctamente.

--rsh=ssh: Esto especifica que rsync debe usar ssh como su shell remoto para la comunicación entre los dos equipos. Esta es la forma estándar y más segura de usar rsync a través de una red.





miércoles, 16 de julio de 2025

Sistemas Operativos 8.- Compartir archivos mediante Samba

  ¿Te pierdes entre tantos temas? 📚✨ Descubre todo lo que ofrece este blog en un solo vistazo [👉 Ver índice completo]

 A diferencia de NFS (que comparte archivos a nivel de sistema o de equipos), Samba permite compartir carpetas por usuario, lo que lo hace ideal para entornos mixtos (Windows + Linux).

En este tutorial, veremos varios casos. El primero es cómo crear una carpeta pública en Windows (accesible desde Linux) donde todos los dispositivos de la red puedan leer y escribir sin necesidad de contraseña. Como siempre los equipos deben verse en la red así que lo primero es usar el comando ping entre las máquinas que quieras conectar y verificar que se vean. En Windows puedes ver la dirección de red con "ipconfig" y en linux con "ifconfig".

Compartir archivos entre Windows y Linux con Samba (Carpeta Pública)


1. Configurar Windows para compartir archivos

Antes de crear la carpeta pública, debemos ajustar la configuración de red en Windows:
    1. Ve a:
Panel de Control → Redes e Internet → Centro de redes y recursos compartidos → Cambiar configuración de uso compartido avanzado.
    2. Asegúrate de activar estas opciones en la sección Privado (perfil actual):
        ◦ ✔ Activar la detección de redes
        ◦ ✔ Activar la configuración automática de dispositivos conectados a la red
        ◦ ✔ Activar el uso compartido de archivos e impresoras
activación de red
    3. En la sección "Todas las redes":
        ◦ Desactivar el uso compartido con protección por contraseña (para acceso sin autenticación es decir sin usar contraseña).

desactivar contraseña


2. Crear y compartir la carpeta pública en Windows

Sigue estos pasos para configurar una carpeta compartida accesible por todos los dispositivos de la red:
Paso 1: Crear la carpeta
            ▪ Crea una carpeta nueva en el lugar que prefieras (ej. en el Escritorio o en C:\).
            ▪ Por ejemplo: C:\Compartida (o el nombre que desees).

Paso 2: Configurar el compartido en Windows
            ▪ Haz clic derecho en la carpeta → Propiedades → Pestaña "Compartir".
            ▪ Haz clic en "Compartir..." (dentro de la pestaña Compartir).
            ▪ En el desplegable, selecciona "Todos" → "Agregar".
            ▪ A la derecha, elige los permisos:
            ▪ Lectura/escritura (para permitir modificaciones).
            ▪ Pulsa "Compartir" → "Listo" (en la siguiente ventana).
compartir carpeta

            ▪ Verifica el uso compartido avanzado (opcional pero recomendado):
            ▪ En la pestaña "Compartir" de las propiedades, haz clic en "Uso compartido avanzado".
            ▪ Marca "Compartir esta carpeta".
            ▪ Pulsa "Aceptar" → "Cerrar".
uso compartido avanzado


3. Verificar la ruta de red (opcional)
Para acceder desde otro equipo (incluido Linux), necesitarás la ruta de red de la carpeta compartida:
            ▪ Normalmente sigue el formato:
             
      \\NOMBRE_PC_WINDOWS o dirección IP\Compartida

              (Reemplaza NOMBRE_PC_WINDOWS por el nombre de tu equipo en la red o también se puede usar su dirección de red).

3. Acceso desde Linux (Debian/Ubuntu)

Ahora que la carpeta está compartida en Windows, conectémonos desde Linux. Primero, instalamos los paquetes necesarios (válido tanto para cliente como en un futuro cuando Linux sea el servidor Samba):

sudo apt update
sudo apt install samba samba-common smbclient cifs-utils

a) Windows como servidor, Linux como cliente

1. Listar recursos compartidos de Windows

Para ver las carpetas compartidas por el equipo Windows, usa:

smbclient -L //IP_WINDOWS

Ejemplo:

smbclient -L //192.168.1.74

smbclient --list

Cuando pida contraseña, simplemente pulsa Enter. En el ejemplo anterior el equipo Windows tiene la dirección 192.168.1.74 y vemos que lo que comparte, entre otras cosas la carpeta pública llamada "Compartida". 

Si la carpeta no es pública como veremos más adelante, añade el usuario: -U usuario_de_windows para poder entrar en el sistema.

2. Acceder a la carpeta compartida (consola)

Para entrar en modo interactivo (similar a FTP):

sudo smbclient //IP_WINDOWS/Carpeta_Compartida

Ejemplo con carpeta pública:

sudo smbclient //192.168.1.74/Compartida

smbclient funcionando


            ▪ Cuando pida contraseña, pulsa Enter (carpeta pública).

Comandos útiles dentro de smbclient:

            ▪ ls: Listar archivos.
            ▪ get archivo: Descargar un archivo.  El archivo se descarga en el directorio actual desde donde ejecutaste el comando en tu terminal de Linux (no dentro de la carpeta compartida de Windows).
            ▪ put archivo: Subir un archivo a la carpeta compartida.
            ▪ exit: Salir.

b) Montar la carpeta en Linux (acceso permanente con permisos de usuario)


Para que la carpeta compartida de Windows sea accesible de forma permanente y con los permisos correctos para tu usuario en Linux, sigue estos pasos:

1. Crear el punto de montaje
Ejecuta:

sudo mkdir /samba

Si prefieres otra ruta (ej: /mnt/windows_share), ajusta los comandos.

2. Asignar permisos al directorio (opcional, pero recomendado)

Para evitar conflictos, asegúrate de que tu usuario (alumno en mi ejemplo) tenga control sobre /samba:

sudo chown alumno:alumnos /samba

3. Montar la carpeta compartida con permisos personalizados

Usa este comando para montar la carpeta con tu usuario y grupo, permitiendo lectura/escritura total (adapta el siguiente comando con la ip del servidor Windows, el nombre de tu carpeta pública compartida, la carpeta que sirve como punto de montaje en Linux y el nombre de tu usuario y su grupo):

montaje de la carpeta compartida

Pulsa Intro, simplemente, cuando te pida la contraseña ya que es una carpeta pública que no tiene contraseña.

Puedes ver si ha quedado montada usando el comando "df"

df


Explicación de opciones:
                • uid=alumno: Asigna la propiedad al usuario alumno.
                • gid=alumno: Asigna el grupo alumnos.
                • file_mode=0777 / dir_mode=0777: Permisos totales (ajusta a 0755 si prefieres restringir escritura).
                • username=guest: Para carpetas públicas (si Windows requiere autenticación, usa username=tu_usuario_windows,password=tu_contraseña).

4. Montaje automático al iniciar (fstab)

Para que la carpeta se monte automáticamente al arrancar el sistema, edita /etc/fstab:

sudo nano /etc/fstab

Añade esta línea al final (ajusta IP, nombres y rutas):

//192.168.1.74/Compartida  /samba  cifs uid=alumno,gid=alumno,file_mode=0777,dir_mode=0777,username=guest,password="",x-systemd.automount,nofail 0 0

Notas:
              En sistemas basados en systemd (como Raspberry Pi OS/Raspbian que es la que estoy usando para los ejemplos), el montaje de recursos de red como CIFS/SMB a veces no ocurre automáticamente en el arranque porque la red aún no está disponible cuando se procesan las entradas de fstab, (me ha ocurrido que no se montaba en el arranque y si, si lo hacia manualmente con mount -a) por lo que a las opciones anteriores he añadido:
  • x-systemd.automount: crea una unidad que se montará automáticamente al acceder a la ruta /samba
  • nofail: evita que el sistema se queje o bloquee el arranque si el recurso no está disponible.

 Los dos números al final de cada línea en /etc/fstab corresponden a estas opciones:

  1. Dump (primer número, en mi caso 0):
    Indica si se debe hacer un backup de la partición con el comando dump.

  • 0: No realizar backup.

  • 1: Incluir en backup.

Esto hoy en día casi siempre se deja en 0 porque dump ya no se suele usar.

  1. Pass (segundo número, en mi caso 0):
    Define el orden en que el sistema verifica el sistema de archivos con fsck durante el arranque:

  • 0: No verificar nunca con fsck.

  • 1: Verificar primero (usualmente reservado para / raíz).

  • 2: Verificar después del raíz, en orden.

Para sistemas de red como CIFS, este valor debe ser 0, porque no es un sistema local que fsck pueda verificar.

Prueba a reiniciar el sistema y entrar en la carpeta /samba. Debería montarse automáticamente y estar lista para utilizarse.

Acceso a Carpetas Compartidas desde el Gestor de Archivos (GUI) en Linux

Para acceder a la carpeta pública de Windows desde el gestor de archivos de Linux (como Nautilus, Thunar o Dolphin), sigue estos pasos:

1. Acceso Básico (Solo Lectura)

                • Abre el gestor de archivos (ej: Nautilus en GNOME, Thunar en XFCE).
                • En la barra de direcciones, escribe:
                 
       smb://IP_servidor_windows

smb con el admon de archivos

                 
                • Si pide credenciales:
                • Usuario: guest
                • Contraseña: (deja vacía o escribe cualquier cosa)
                  ⚠️ En algunas distribuciones, puede que no funcione con contraseña vacía. Prueba con guest + contraseña guest.
                • Verás todas las carpetas compartidas en Windows. Haz clic en la carpeta pública (Compartida).

vista de carpeta compartida



2. Acceso con Permisos de Escritura (Evitando Problemas de Permisos).

Si intentas crear, modificar o borrar archivos y recibes errores de permisos, hay dos soluciones:

Opción 1: Usar el Gestor de Archivos como Root (No recomendado para uso diario)
                • Abre una terminal y ejecuta el administrador de archivos que tengas instalado: 
                 
      sudo nautilus  # GNOME (Ubuntu/Debian)
      sudo thunar    # XFCE
      sudo dolphin   # KDE
      sudo pcmanfm (rapsbian)
                • En la ventana de root, navega a smb://IP_servidor_windows/Carpeta_compartida.
                • ⚠️ Precaución: Usar el gestor de archivos como root puede ser peligroso (borrado accidental de archivos críticos).


Opción 2: Montar la Carpeta con Permisos Correctos (Recomendado)
Sigue los pasos del apartado anterior para montar la carpeta con uid y gid de tu usuario:

sudo mount -t cifs //IP_Windows/Compartida /punto_de_montaje -o uid=tu_usuario,gid=tu_grupo,file_mode=0777,dir_mode=0777,username=guest

                • Luego accede desde el gestor de archivos a /samba sin necesidad de root.

Compartir archivos entre Windows y Linux con Samba (Carpeta Privada)

Si la carpeta la ha creado nuestro usuario de Windows, la hemos preparado para compartir pero solo ese usuario tiene permisos para leer - escribir en esa carpeta es decir cuando la carpeta compartida en Windows requiere autenticación (solo un usuario específico tiene permisos de lectura/escritura), debemos modificar los comandos para incluir las credenciales. Las opciones son todas las mismas que hemos visto anteriormente cuando la carpeta era pública, la única diferencia es que tendremos que entrar a Windows desde Linux con las opciones username=Tu_usuario y password=tu contraseña de Windows. Recuerda que Windows comparte para usuarios, mientras que Linux comparte para equipos.

Por ejemplo:

smbclient -U nombre_usuario%contraseña //IP_servidor/carpeta_compartida

o

mount -t cifs //IP_servidor/carpeta_compartida /pto_montaje -o username=nombre_usuario_windows,password=contraseña

Compartir archivos entre Linux (servidor) y Windows o Linux (clientes) con Samba 

Lo primero que tenemos que hacer es crear en Linux un directorio que será el punto de montaje y en principio, para practicar, es conveniente que le demos todos los permisos. (chmod 777)

1) Vamos a empezar creando una carpeta pública en Linux que se comparta con Windows, por ejemplo. Para ello tenemos que añadir al final del archivo /etc/samba/smb.conf una nueva sección por cada carpeta compartida:

[publica] --> Es el nombre que pondremos para acceder, aunque puedes poner el que quieras. Pero                             recuerda que es el que tendrás que utilizar para conectarte a la carpeta.
    comment = " " Comentario sobre la carpeta compartida.
    path = /ruta_absoluta_de_la_carpeta_a_compartir
    public = yes/no -> si la carpeta es publica o no
    writable = yes/no -> si se puede escribir o no en esa carpeta

otras opciones adicionales que se pueden utilizar son:
browseable = yes/no  # Visible en la red
guest ok = yes/no  # Permite acceso como invitado
create mask = 0777  # Permisos para nuevos archivos (todos los permisos)
directory mask = 0777  # Permisos para nuevos directorios (todos los permisos)

Por ejemplo:

Ejemplo de sección para samba en linux


Cada vez que añadamos una nueva sección a esta carpeta tenemos que reiniciar el servicio de samba.

service smbd start -> para iniciar el servidor samba
service smbd stop -> parar el servidor samba
service smbd restart -> cada vez que modifiquemos el archivo /etc/samba/smb.conf

El comando para ver si esta todo OK podemos utilizar el comando testparm

testparm

El ejemplo anterior es lo que saldría si todo esta bien.

Para acceder desde Windows a esta carpeta, aunque podemos hacerlo desde el explorador de Windows, lo más sencillo es hacer clic derecho, por ejemplo en el escritorio y crear un nuevo acceso directo. Al ser la carpeta pública no nos hace falta ni usuario ni contraseña. Dentro escribimos la dirección de red de la carpeta compartida.

acceso directo

Recuerda que en Windows se usan esas barras invertidas para las direcciones de red \\ y no las de Linux que son estas //.

carpeta compartida


Desde otro linux, podemos conectar con esta carpeta al igual que hicimos al principio del post. Vamos a recordarlo brevemente:
  • Desde el gestor de archivos -> smb://IPservidor/nombre_sección
  • Desde la consola -> smbclient //IPservidor/nombre_sección
    • Montándolo:
      1) Como root:
      sudo mount -t cifs //IPservidor/nombre_seccion /Pto_montaje. //Nos pedirá contraseña pero no hace falta introducirla.
      2) De forma automática o no por un usuario añadiendo la línea correspondiente en el archivo /etc/fstab
      //Ipservidor/nombre_seccion  /pto_montaje  cifs [auto/noauto],user,[rw/ro]
      Si queremos que al iniciar sesión, si hemos puesto la opción auto, (o cuando se monte como usuario) no pida la contraseña añade al final la opción password=""
2) Para acceder a una carpeta de un servidor-samba pero para determinados usuarios o grupos.

Para poder acceder a una carpeta para un usuario o grupo en Linux tenemos que tener presente dos requisitos:
  1. Tenemos que tener cuenta de usuario en el equipo que comparte, es decir en el servidor.
    sudo adduser nombre_usuario

    añadir usuario


  2. Tenemos que tener cuenta de usuario de samba también en ese equipo.
    sudo smbpasswd -a usuario (nos pedirá una nueva contraseña para usar samba)
añadir usuario a samba

Otras opciones del comando smbpasswd son:
-x Eliminar usuario de samba
-d Desabilitar usuario de samba
-e Habilitar usuario de samba.

Para ver los usuarios del equipo, que además son usuarios de samba usaremos:

pdbedit -w -L

3) Tenemos que crear la sección correspondiente de samba en el archivo /etc/samba/smb.conf. En el ejemplo anterior creare una sección para que solo pueda acceder a esa carpeta el miembro del ordenador de Linux llamado "usuario". Si fueran varios usuarios cada uno de ellos iría en el comando "valid users" separado por un espacio.

seccion samba

Para permitir el acceso a un grupo en Samba con la directiva "valid users", se usa el nombre del grupo precedido por le signo @.

4) Como siempre que se modifica un archivo de configuración tenemos que reiniciar el servicio samba.
sudo service smbd restart

y ya podemos acceder a la carpeta igual que cuando el servidor era Windows, teniendo en cuenta que necesitamos el nombre del usuario y su contraseña para poder entrar al servicio.

acceso a la carpeta samba por un usuario
credenciales de samba
Las credenciales son las de samba no las del usuario para entrar en el equipo Linux.

Si quisiéramos mostrar el estado de las conexiones actuales usaremos el comando:

sudo smbstatus 

El cual nos mostrará los usuarios conectados y los recursos compartidos.

smbstatus


viernes, 11 de julio de 2025

Sistemas operativos 7.- Compartir archivos en red mediante NFS

  ¿Te pierdes entre tantos temas? 📚✨ Descubre todo lo que ofrece este blog en un solo vistazo [👉 Ver índice completo]

NFS (network file system) o sistema de archivos en red, es un protocolo que nos va a permitir acceder a archivos y directorios en otros ordenadores como si estuvieran ubicados localmente en el nuestro. Es un sistema de archivos distribuido que opera bajo el modelo cliente servidor, sobre todo en sistemas Linux, donde un servidor NFS comparte sus archivos y directorios, y los clientes pueden acceder a ellos a través de la red. NFS comparte para equipos mientras que como veremos posteriormente otro protocolo llamado samba comparte para usuarios.

Para verlo mejor vamos a partir de dos máquina con Linux instalado y en ambas, lo primero que tenemos que hacer es instalar este protocolo. Se suele instalar en ambas máquinas el protocolo cliente y servidor porque es normal que a veces una máquina sirva unas cosas y la otra otras. Que un ordenador tenga instalado los paquetes NFS, no significa que automáticamente este compartiendo su sistema de archivos en la red. Para ello es necesario configurar y arrancar el servicio.

El ejemplo que presento lo voy a hacer entre una Rapsberry que actuará de servidor y una máquina virtual que será el PC cliente. También lo puedes hacer creando dos máquinas virtuales, con conexión de red en modo bridge. Lo importante es que ambas máquinas estén en la misma red. Para ver si están correctamente conectadas hay que probar si ambas máquinas se ven en la red utilizando el comando "ping". Para saber cual es la IP de tus máquinas usa el comando "ifconfig" y luego utiliza el comando ping para ver si ambas máquinas se ven bien en la red.

máquina haciendo ping

Cada pc tiene que hacer ping con la ip de la otra máquina correctamente, si no, no podrás compartir los archivos.

  1. Instalar NFS en ambas máquinas.

    sudo apt-get install nfs-common nfs-kernel-server

    // nfs-common es el modulo para instalar el cliente de nfs
    // nfs-kernel-server es el módulo para instalar el servidor de nfs

  2. Configurar el servicio NFS en el servidor, es decir en el equipo donde se van a compartir las carpetas. Tenemos que hacerlo como root. 
    Antes de arrancar el servicio NFS es necesario indicar que carpetas queremos compartir y si queremos que los usuarios accedan con permisos de solo lectura o de lectura y escritura. También existe la posibilidad de establecer que PC´s pueden conectarse. Estas opciones se configuran en el archivo /etc/exports

    En cada línea del archivo de configuración del servidor NFS /etc/exports, se puede especificar:
    - La carpeta que se quiere compartir.
    - Desde que PC o PC´s se permite el acceso (nombre o IP del PC o rango de IP´s)
    - El modo en el que se comparte (solo lectura 'ro' o lectura y escritura 'rw')

    Por ejemplo, compartir la carpeta /casitodos (que ya tiene que estar creada y con todos los permisos) del servidor en modo lectura y escritura para las máquinas de la dirección de red 192.168.1.0, se añade, en el fichero /etc/exports la siguiente línea:

    /casitodos    192.168.1.0/255.255.255.0(rw)

    Si queremos compartir la carpeta /sololec (que ya tiene que estar creada) del servidor en el modo solo lectura para el equipo con IP 192.168.1.118, se añade, en el fichero /etc/exports la siguiente línea:

    /sololec 192.168.1.118(ro)

    Si queremos compartir la carpeta /todos (que ya tiene que estar creada) del servidor en modo solo lectura para todos los ordenadores, se añade en el fichero /etc/exports la siguiente linea:

    /todos *(ro)

    Por lo que el fichero /etc/exports nos quedaría de la siguiente manera:

    archivo /etc/exports

    ¡¡IMPORTANTE!! Los  permisos  de  compartición  por  NFS  no  excluyen  a  los  permisos  del  sistema Linux, sino  que prevalecen los más restrictivos. Si una carpeta está compartida con permiso NFS de lectura y escritura pero en los  permisos  del  sistema  solo  disponemos  de  permiso  de  lectura,  no  podremos  escribir.  Si  una carpeta  está compartida con permisos NFS de lectura y disponemos de permisos de lectura y escritura en el sistema, tampoco podremos  escribir.  Para  poder  escribir  necesitaremos  disponer  permiso  de  lectura  y  escritura  tanto  en  los permisos del sistema como en los permisos de compartición NFS.


  3. Arranque y parada de NFS(en el equipo servidor)

    Para arrancar el servidor NFS se ejecuta el comando(como root):

    //Arranque del servidor NFS
    sudo service   nfs-kernel-server  start

    Este comando iniciará los procesos necesarios que necesita NFS para su funcionamiento.
    Si deseamos detener el servidor NFS, debemos ejecutar:

    //Parada delservidor NFS
    sudo service   nfs-kernel-server   stop

    Si deseamos reiniciar el servidor NFS, debemos ejecutar:

    //Reinicio delservidor NFS
    sudo service   nfs-kernel-server   restart

    Cada vez que modificas el fichero /etc/exports hay que reiniciar el servicio.


  4. Acceso a carpetas compartidas por NFS (en el equipo cliente, equipo que accede a las carpetas compartidas en el servidor)

    Para poder acceder desde un PC a una carpeta compartida por NFS en un servidor, es necesario montar la  carpeta  compartida  en  nuestro  sistema  de  archivos.  De esta manera,  el  acceso  a  la  carpeta  compartida  es exactamente  igual  que  el  acceso  a  cualquier  otra  carpeta  de  nuestro  disco  duro (o  como  si  montásemos  un dispositivo).

    Por ejemplo,  supongamos  que  un  servidor (con  IP  192.168.1.200) comparte  por  NFS la carpeta  llamada  /todos (anteriormente  compartida).  En  el  PC  cliente  podemos  crear  una  carpeta  llamada  /cliente (punto  de  montaje) y montar  sobre  ella  la  carpeta  compartida  en  el  servidor.  Para  ello,  en  el  cliente  y  como root, ejecutaríamos  el siguiente comando:

    //Montar carpeta compartida por NFS
    sudo mount  -t  nfs  192.168.1.200:/todos  /cliente

    A partir de este momento, podemos comprobar que nuestra carpeta /cliente, contiene la información de la carpeta /todos del  servidor.  Si  disponemos  de  permisos  de  lectura  y  escritura,  podemos  incluso  crear  o  modificar  los archivos dentro de nuestra carpeta /cliente y los cambios se estarán guardando realmente en la carpeta /todos del servidor.

    Para  realizar  el  montaje,  debemos  hacerlo  sobre  una  carpeta  existente  en  nuestro  sistema.  Si  dicha  carpeta  de nuestro  sistema  contiene  archivos,  estos  no  estarán  accesibles  ya  que  la  carpeta  nos  mostrará  los  archivos remotos.

    Si  deseamos  que  nuestro  PC  monte  siempre  de  forma  automática  una  carpeta  compartida  por  NFS  cuando iniciemos nuestro Linux, existe la posibilidad de añadir en el archivo /etc/fstab una línea como, por ejemplo:

    //Montaje automático al iniciar el PC
    #añadir en el fichero /etc/fstab del cliente
    ip-del-servidor:/carpeta_servidor  /carpeta_cliente   nfs    auto,user,rw

    De esta manera,   cuando   arranquemos   nuestro   PC,   la   carpeta   /carpeta_servidor del servidor   quedará automáticamente montada sobre nuestra carpeta /carpeta_cliente y no tendremos que ejecutar el comando mount. Un  usuario  también  podrá  acceder  a  la  carpeta  compartida  montando  la  carpeta (de  la  misma  forma  que  lo hacíamos con una partición).