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.
- Target:
- Un usuario no root con privilegios
sudoen ambos.
Conceptos que usarás:
| Término | Significado |
|---|---|
| IQN | Nombre único de un target o iniciador, con formato iqn.AAAA-MM.dominio.invertido:identificador |
| Backstore | Almacenamiento real que se exporta: un disco, una partición o un archivo |
| LUN | Unidad lógica que el iniciador ve como un disco |
| TPG | Grupo de portales del target: agrupa las IP de escucha, los LUN y las ACL |
| ACL | Lista 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.
AdvertenciaiSCSI no cifra el tráfico. Úsalo solo en una red privada o dentro de una VPN, nunca expuesto a Internet.
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
Importanteun disco iSCSI con ext4 o XFS solo puede montarse en un iniciador a la vez. Si dos servidores lo montan simultáneamente, el sistema de archivos se corromperá. Para acceso compartido se necesita un sistema de archivos de cluster como OCFS2 o GFS2.
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.iscsino coincide con la ACL, o el usuario o la contraseña CHAP son incorrectos. Revisa ambos lados y reiniciaiscsidsi cambiaste el IQN.iscsiadm: cannot make connection to 10.0.0.40: Connection refuseden el descubrimiento: el portal no escucha en esa IP o UFW bloquea el puerto 3260. Compruebasudo ss -tlnp | grep 3260y 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.jsony quertslib-fb-targetctl.serviceestá 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.
