iSCSI transporta comandos SCSI sobre TCP/IP, de modo que un servidor puede usar un disco de otro servidor como si fuera un disco local. El servidor que ofrece el almacenamiento es el target y el que lo usa es el iniciador. En este tutorial configurarás un target con targetcli en Ubuntu 24.04, restringirás el acceso con ACL y autenticación CHAP, y conectarás un iniciador con open-iscsi que formatea, monta y reconecta el disco en cada arranque.

Requisitos previos

  • Dos servidores con Ubuntu 24.04 LTS en la misma red privada, por ejemplo VPS de CubePath:
    • Target: 10.0.0.40. Necesita un disco adicional vacío (en los ejemplos, /dev/vdb) o espacio libre para un archivo de imagen.
    • Iniciador: 10.0.0.41.
  • Un usuario no root con privilegios sudo en ambos.

Conceptos que usarás:

TérminoSignificado
IQNNombre único de un target o iniciador, con formato iqn.AAAA-MM.dominio.invertido:identificador
BackstoreAlmacenamiento real que se exporta: un disco, una partición o un archivo
LUNUnidad lógica que el iniciador ve como un disco
TPGGrupo de portales del target: agrupa las IP de escucha, los LUN y las ACL
ACLLista de iniciadores (por IQN) autorizados a conectarse

En esta guía se usan los IQN iqn.2026-09.com.example:storage.disk1 para el target e iqn.2026-09.com.example:client1 para el iniciador. Sustituye com.example por tu dominio invertido.

Paso 1: Instalar targetcli en el target

En el servidor target, instala targetcli-fb, la herramienta que configura el target iSCSI del kernel de Linux (LIO):

sudo apt update
sudo apt install targetcli-fb

Comprueba que funciona mostrando el árbol de configuración, que al principio está vacío:

sudo targetcli ls
o- / ......................................................................... [...]
  o- backstores .............................................................. [...]
  | o- block .................................................. [Storage Objects: 0]
  | o- fileio ................................................. [Storage Objects: 0]
  | o- pscsi .................................................. [Storage Objects: 0]
  | o- ramdisk ................................................ [Storage Objects: 0]
  o- iscsi ............................................................ [Targets: 0]
  o- loopback ......................................................... [Targets: 0]
  o- vhost ............................................................ [Targets: 0]

targetcli puede usarse de forma interactiva o, como en esta guía, pasando la ruta y el comando como argumentos.

Paso 2: Crear el backstore

El backstore es el almacenamiento que verá el iniciador. Si tienes un disco dedicado, exporta el dispositivo de bloques completo, que es la opción más rápida:

sudo targetcli /backstores/block create name=disk1 dev=/dev/vdb
Created block storage object disk1 using /dev/vdb.

Si no tienes un disco libre, crea en su lugar un backstore basado en un archivo de 20 GB:

sudo mkdir -p /srv/iscsi
sudo targetcli /backstores/fileio create name=disk1 file_or_dev=/srv/iscsi/disk1.img size=20G

Usa solo una de las dos opciones; el resto de la guía funciona igual con ambas, cambiando block por fileio en las rutas.

Paso 3: Crear el target y el LUN

Crea el target iSCSI. targetcli-fb crea automáticamente el grupo tpg1 y un portal que escucha en todas las IP en el puerto 3260:

sudo targetcli /iscsi create iqn.2026-09.com.example:storage.disk1
Created target iqn.2026-09.com.example:storage.disk1.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.

Para escuchar solo en la IP privada, sustituye el portal por defecto:

sudo targetcli /iscsi/iqn.2026-09.com.example:storage.disk1/tpg1/portals delete 0.0.0.0 3260
sudo targetcli /iscsi/iqn.2026-09.com.example:storage.disk1/tpg1/portals create 10.0.0.40 3260

Asocia el backstore al target como LUN 0:

sudo targetcli /iscsi/iqn.2026-09.com.example:storage.disk1/tpg1/luns create /backstores/block/disk1
Created LUN 0.

Paso 4: Autorizar al iniciador con ACL y CHAP

Por defecto, el target solo acepta iniciadores incluidos en su ACL. Crea una entrada para el IQN del iniciador. Los LUN existentes se asignan automáticamente a la nueva ACL:

sudo targetcli /iscsi/iqn.2026-09.com.example:storage.disk1/tpg1/acls create iqn.2026-09.com.example:client1
Created Node ACL for iqn.2026-09.com.example:client1
Created mapped LUN 0.

Añade autenticación CHAP a esa ACL, de modo que además del IQN el iniciador tenga que presentar un usuario y una contraseña. Usa una contraseña de 12 a 16 caracteres, la longitud que admiten la mayoría de iniciadores; sustituye your_chap_secret por una propia:

sudo targetcli /iscsi/iqn.2026-09.com.example:storage.disk1/tpg1/acls/iqn.2026-09.com.example:client1 set auth userid=client1 password=your_chap_secret
sudo targetcli /iscsi/iqn.2026-09.com.example:storage.disk1/tpg1 set attribute authentication=1

Guarda la configuración para que se restaure al reiniciar:

sudo targetcli saveconfig
Configuration saved to /etc/rtslib-fb-target/saveconfig.json

Revisa el árbol completo del target:

sudo targetcli ls /iscsi
o- iscsi .............................................................. [Targets: 1]
  o- iqn.2026-09.com.example:storage.disk1 ............................... [TPGs: 1]
    o- tpg1 ........................................... [no-gen-acls, auth per-acl]
      o- acls ............................................................ [ACLs: 1]
      | o- iqn.2026-09.com.example:client1 ..................... [1-way auth, Mapped LUNs: 1]
      |   o- mapped_lun0 ................................... [lun0 block/disk1 (rw)]
      o- luns ............................................................ [LUNs: 1]
      | o- lun0 ....................................... [block/disk1 (/dev/vdb) (default_tg_pt_gp)]
      o- portals ...................................................... [Portals: 1]
        o- 10.0.0.40:3260 ....................................................... [OK]

Si UFW está activo, permite el puerto 3260 solo desde el iniciador:

sudo ufw allow from 10.0.0.41 to any port 3260 proto tcp

Paso 5: Configurar el iniciador

En el servidor iniciador, instala open-iscsi (ya viene instalado en las imágenes de Ubuntu Server, en cuyo caso apt no hará nada):

sudo apt update
sudo apt install open-iscsi

El iniciador se identifica con el IQN guardado en /etc/iscsi/initiatorname.iscsi. Edítalo para que coincida con el de la ACL:

sudo nano /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2026-09.com.example:client1

Reinicia el servicio para aplicar el nuevo nombre:

sudo systemctl restart iscsid

Descubre los targets que ofrece el servidor:

sudo iscsiadm -m discovery -t sendtargets -p 10.0.0.40
10.0.0.40:3260,1 iqn.2026-09.com.example:storage.disk1

El descubrimiento crea un registro del nodo en /etc/iscsi/nodes/. Añade a ese registro las credenciales CHAP:

sudo iscsiadm -m node -T iqn.2026-09.com.example:storage.disk1 -p 10.0.0.40 --op update -n node.session.auth.authmethod -v CHAP
sudo iscsiadm -m node -T iqn.2026-09.com.example:storage.disk1 -p 10.0.0.40 --op update -n node.session.auth.username -v client1
sudo iscsiadm -m node -T iqn.2026-09.com.example:storage.disk1 -p 10.0.0.40 --op update -n node.session.auth.password -v your_chap_secret

Paso 6: Iniciar sesión y usar el disco

Inicia sesión en el target:

sudo iscsiadm -m node -T iqn.2026-09.com.example:storage.disk1 -p 10.0.0.40 --login
Logging in to [iface: default, target: iqn.2026-09.com.example:storage.disk1, portal: 10.0.0.40,3260]
Login to [iface: default, target: iqn.2026-09.com.example:storage.disk1, portal: 10.0.0.40,3260] successful.

Comprueba la sesión y localiza el nuevo disco. La ruta en /dev/disk/by-path/ incluye la IP y el IQN, y no cambia entre arranques:

sudo iscsiadm -m session
ls -l /dev/disk/by-path/ | grep iscsi
tcp: [1] 10.0.0.40:3260,1 iqn.2026-09.com.example:storage.disk1 (non-flash)
lrwxrwxrwx 1 root root 9 Sep 25 11:02 ip-10.0.0.40:3260-iscsi-iqn.2026-09.com.example:storage.disk1-lun-0 -> ../../sda

En este ejemplo, el disco iSCSI es /dev/sda. Compruébalo con lsblk antes de formatear, porque el nombre depende de los discos que ya tenga el servidor:

lsblk /dev/sda
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda    8:0    0 100G  0 disk

Formatéalo y móntalo:

sudo mkfs.ext4 /dev/sda
sudo mkdir -p /mnt/iscsi
sudo mount /dev/sda /mnt/iscsi
df -h /mnt/iscsi
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda         98G   24K   93G   1% /mnt/iscsi

Paso 7: Reconectar y montar en el arranque

Configura el nodo para que open-iscsi inicie sesión automáticamente al arrancar:

sudo iscsiadm -m node -T iqn.2026-09.com.example:storage.disk1 -p 10.0.0.40 --op update -n node.startup -v automatic
sudo systemctl enable iscsid open-iscsi

Obtén el UUID del sistema de archivos, que no depende de si el disco aparece como sda o sdb:

sudo blkid /dev/sda
/dev/sda: UUID="9a1f7c3e-2b4d-4f6a-8e0c-1d2b3c4d5e6f" BLOCK_SIZE="4096" TYPE="ext4"

Edita /etc/fstab:

sudo nano /etc/fstab

Añade esta línea con tu UUID. _netdev indica que el disco depende de la red y nofail evita que el arranque se detenga si el target no está disponible:

UUID=9a1f7c3e-2b4d-4f6a-8e0c-1d2b3c4d5e6f /mnt/iscsi ext4 _netdev,nofail 0 0

Comprueba la entrada y reinicia para confirmar que todo se restablece solo:

sudo umount /mnt/iscsi
sudo mount -a
sudo reboot

Tras el reinicio, sudo iscsiadm -m session debe mostrar la sesión y df -h /mnt/iscsi el disco montado.

Solución de problemas

  • iscsiadm: Could not login ... authorization failure (err 24): el IQN de /etc/iscsi/initiatorname.iscsi no coincide con la ACL, o el usuario o la contraseña CHAP son incorrectos. Revisa ambos lados y reinicia iscsid si cambiaste el IQN.
  • iscsiadm: cannot make connection to 10.0.0.40: Connection refused en el descubrimiento: el portal no escucha en esa IP o UFW bloquea el puerto 3260. Comprueba sudo ss -tlnp | grep 3260 y las reglas del firewall en el target.
  • La configuración del target desaparece al reiniciar: faltó sudo targetcli saveconfig. Comprueba que existe /etc/rtslib-fb-target/saveconfig.json y que rtslib-fb-targetctl.service está habilitado.
  • Para desconectar el disco de forma limpia, desmóntalo y cierra la sesión con sudo iscsiadm -m node -T iqn.2026-09.com.example:storage.disk1 -p 10.0.0.40 --logout.

Conclusión

Tienes un target iSCSI que exporta un disco protegido con ACL y CHAP, y un iniciador que lo monta de forma persistente en cada arranque. Como siguientes pasos puedes añadir una segunda interfaz de red y configurar multipath (multipath-tools) para tener rutas redundantes, usar el LUN como almacenamiento compartido en Proxmox, o crear un pool ZFS sobre el backstore del target para disponer de snapshots.