1、概述

ISCSI ( internel small system computer interface):是基于TCP/IP网络 的存储技术,它利用TCP/IP网络来存储scsi命令,本身因为TCP/IP的特性,因此会架构便宜(IP 网络设备价格远比存储网络的价格要低),可以从LAN扩展到WAN上面

IP-SAN是作为存储区域网络的一种便宜的方案,但通常我们建议是将IP-SAN 建立在一个单独隔离的网络上,而不是和平常的业务网络一起用(存储网络与业务网络分离)


iscsi协议本身不加密,只是在发起连接的时候有CHAP认证(包括单向认证和双向认证),在互联网上传送并不安全,因此较少用在互联网上,通常是作为一个单独的存储网络使用,另外也可以使用LUKS linux unified key setup磁盘加密,这样保证数据在传送过程中加密,但协议本身是没有保护的,也可以让ipsec协议保护,因为ipsec本身有认证和加密的功能


Iscsi使用TCP协议、默认使用3260端口


冗余:

可以用网卡绑定或者多径来保证存储访问的高可用性

注意:bonding只是保证网卡到它连接的设备(通常是交换机)的高可用,但是多径技术 (multi-path)是保证端到端的冗余,因此多径技术更高级。


iscsi相对于NFS 或者DAS HDD的好处在于:

1、对于DAS而言,服务器坏了,硬盘没坏,也不能访问了

     iscsi磁盘还是可以让其他客户端访问的

2、NFS而言,扩容不容易

   iscsi target 可以1个,2个,3个,直接扩容,创建物理卷,将物理卷加入现存卷组,扩容逻辑卷,创建文件系统,加挂,但nfs有难度

3、要求网络存储,提供给多台主机同时访问,如集群环境 


iscsi协议

理解ISCSI协议重点是理解封装的概念,SCSI命令通过 iscis协议封装后在TCP/IP网络上传送,因此需要CPU资源来处理报文头的封装与解封装(也有专用的iscsiHBA卡,不过价格较贵罢了)


iSCSI术语


IQN(iSCSI Qualified Name)用来识别iSCSI通信的服务端和客户端,格式是

iqn.yyyy-mm.com.reverse.domain:optional-extra-name

如主机名为instructor.example.com。第一个分享的LV空间可以是iqn.2013-10.com.example.instructor:lv1-my-first-lv


可选部分(含前面的冒号)加上可以用于区分多个分享的设备,如有多个lv要分享的时候

target :iSCSI服务端叫target,target 分享LUN,logical unit ,一台服务器可以分享一个或者多个LUN 

initiator:iSCSI客户端叫initiator,可以由软硬件实现,通常软件实现的较多(省钱)

node: iSCSI服务端,iSCSI客户端都叫node

Portal :在iSCSI中,Portal是一个target或者initiator的IP,用于建立连接

iSNS:  internet storage name service ,一个命名服务,用来让initiator发现target,较少使用

2、安装包

     scsi-target-utils

     iscsi-initiator-utils 

    

    scsi-target-utils包中的主要配置文件以及命令:

                /etc/tgt/target.conf : 主要配置文件 

                /usr/sbin/tgt-admin : 在线查询、删除target等功能的命令 

     /usr/sbin/tgtd : 主要提供iscsi target服务的主程序 

    iscsi-initiator-utils中的主要配置文件以及命令: 

          /etc/iscsi/iscsid.conf : 主要配置文件 

/sbin/iscsid : 启动iscsi initiator的主要服务程序 

/sbin/iscsiadm : 管理iscsi initiator的管理程序 

/etc/intit.d/iscsid : 主要服务进程 

/etc/init.d/iscsi : 启动该脚本,可以使发现过的iscsi target配置生效,一般直接使用该脚本即可,initiator未执行的话,会调用/etc/init.d/iscsid启动initiator。 


    Target可做磁盘分享给Initiator使用的方式:

        (1)大型文件(dd命令生成)(2) 磁盘阵列、磁盘或者磁盘分区等真实磁盘(3)使用LVM中的逻辑卷LV 


3、tgtadm命令详解

[root@ser ~]# tgtadm -h 

Usage: tgtadm [OPTION]
Linux SCSI Target Framework Administration Utility, version 1.0.24

--lld <driver> --mode(模式) target --op(操作) new --tid <id> --targetname <name>      注:tid不能为0,0默认保留给本机
--lld <driver> --mode target --op delete [--force] --tid <id>           
--lld <driver> --mode target --op show
--lld <driver> --mode target --op show --tid <id>
--lld <driver> --mode target --op update --tid <id> --name <param> --value <value>     //更改目标参数
--lld <driver> --mode target --op bind(绑定) --tid <id> --initiator-address <address>
--lld <driver> --mode target --op bind --tid <id>  --initiator-name <name>
--lld <driver> --mode target --op unbind(解除绑定) --tid <id> --initiator-address <address>
--lld <driver> --mode target --op unbind --tid <id> --initiator-name <name>
--lld <driver> --mode logicalunit(逻辑磁盘块) --op new --tid <id> --lun <lun> \
                        --backing-store <path> --bstype <type> --bsoflags <options>
--lld <driver> --mode logicalunit(逻辑单元) --op delete --tid(tid号) <id> --lun(逻辑单元) <lun>
--lld <driver> --mode account(账户) --op new --user <name> --password <pass>
--lld <driver> --mode account --op delete --user <name>
--lld <driver> --mode account --op bind --tid <id> --user <name> [--outgoing]
--lld <driver> --mode account --op unbind --tid <id> --user <name>
--control-port <port> use control port <port>
--help display this help and exit

tgtadm模式化命令:

    --mode

        常用模式:target、logicalunit、account

                target --op 

                            new 、delete、show、update、bind、unbind

                logicalunit  --op        //逻辑单元块(可以是一个卷、一个磁盘、一个RAID、一个LVM),一定要在target的基础上创建lun,并为lun分配一个单元号

                            new 、delete

                account   --op            //帐号绑定

                            new、delete、bind、unbind

    --lld        //设备块地址

    --tid        //指定tid号,target的编号。不可为0,0保留给当前主机使用的。

    --lun        //指定逻辑单元号    

    --backing-store    //指定后端存储

    --user        //指定用户名

    --password    //指定密码


targetname(target命名):

    iqn.yyyy-mm.<reversed  domain  name>[:identifier]   

    例如:iqn.2014-12.com.wgmml:t

    t:是描述,可以是硬盘所在机房机柜位置。注以时间后域名段要反写。如上

例:

服务端:

    # tgtadm --lld iscsi --mode target --op new --targetname iqn.2014.12.com.ser:dosk1 --tid 1

        //新建一个target,target名为iqn.2014.12.com.ser:dosk1 ,tid为1


    # tgtadm --lld iscsi --mode target --op show     //查看当前主机target

     注:一个target上最多有32个lun


    # tgtadm --lld iscsi --mode logicalunit --op new --tid 1 --lun 1 --backing-store /dev/sdb

        //在tid为1的target上创建新lun并连接存储设备(sdb为新加的硬盘)


    # tgtadm --lld iscsi --mode target --op bind --tid 1 --initiator-address 10.1.1.0/24

        //绑定10.1.1.0/24网段可访问tid为1的target

客户端:

    # iscsi-iname        //显示initatorname

        iqn.1994-05.com.redhat:c42a4a9748db

    # iscsi-iname -p iqn.1994-05.com.wgmml  //命令更改initator端名

        iqn.1994-05.com.wgmml:35536bb7a6

    #vim  /etc/iscsi/initiatorname.iscsi        //保存initator名的文件,也可以在此文件创建别名

    # echo "InitiatorName=`iscsi-iname -p iqn.2014.12.com.wgmml`" > /etc/iscsi/initiatorname.iscsi 

    //iscsi-iname -p修改后的InitiatorName永久保存到initiatorname.iscsi 文件


    # iscsiadm -h

iscsiadm -m discoverydb [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type -p ip:port -I ifaceN ... [ -Dl ] ] | [ [ -p ip:port -t type] [ -o operation ] [ -n name ] [ -v value ] [ -lD ] ]

iscsiadm -m discovery [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type - p ip:port -I ifaceN ... [ -l ] ] | [ [ -p ip:port ] [ -l | -D ] ]

iscsiadm -m node [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ -S ] [ [ -T targetname -p ip:port -I ifaceN ] [ -l | -u | -R | -s] ] [ [ -o operation ] [ -n name ] [ -v value ] ]

iscsiadm -m session [ -hV ] [ -d debug_level ] [ -P printlevel] [ -r sessionid | sysfsdir [ -R | -u | -s ] [ -o operation ] [ -n name ] [ -v value ] ]

iscsiadm -m iface [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I ifacename | -H hostno|MAC ] [ [ -o operation ] [ -n name ] [ -v value ] ] [ -C ping [ -a ip ] [ -b packetsize ] [ -c count ] [ -i interval ] ]

iscsiadm -m fw [ -l ]

iscsiadm -m host [ -P printlevel ] [ -H hostno|MAC ] [ -C chap [ -o operation ] [ -v chap_tbl_idx ] ]

iscsiadm -k priority

iscsiadm模式化命令

    -m 

    常用模式:discovery|node|session|iface

            discovery:发现某服务器是否有target输入,以及输出哪些target;

            node:管理跟某target的关联关系,建立关联、断开关联。。。

            session:会话管理

            iface:端口管理

例:

    # iscsiadm -m discovery -d 2 -t st -p 10.1.1.2

        10.1.1.2:3260,1 iqn.2014.12.com.wgmml:disk1

    //查看10.1.1.2主机共享的target及端口,发现完后会在/var/lib/iscsi/send_targets/下显示记录,不想使用是需要删除。


    # iscsiadm -m node -T iqn.2014.12.com.wgmml:disk1 -p 10.1.1.2 -l

    //挂载登录 10.1.1.2target服务器 iqn.2014.12.com.wgmml:disk1磁盘


    

    

4、实例一:target端共享一个10G的硬盘块,硬盘路径为/dev/sdb,target端ip:10.1.1.2   Initiator端ip:10.1.1.3

   Target端:

        [root@ser ~]# yum install scsi-target-utils         //YUM安装scsi target端

        [root@ser ~]# service tgtd start        //启动服务

        [root@ser ~]# netstat -na |grep 3260         //查看是否启动

                             tcp 0 0 0.0.0.0:3260 0.0.0.0:* LISTEN                             tcp 0 0 :::3260 :::* LISTEN

        [root@ser ~]# tgtadm  --lld  iscsi  --mode  target  --op  new  --targetname   iqn.2014.12.disk1  --tid  1        //创建一个新的target,命名为 iqn.2014.12.disk1 ,target的tid为1

        [root@ser ~]# tgtadm --lld iscsi --mode target --op show        //查看本机的target基本信息,包括target名及target下Lun信息、磁盘大小等信息

        [root@ser ~]# tgtadm --lld iscsi --mode logicalunit --op new --tid 1 --lun 1  --backing-store  /dev/sdb        //在tid为1的target下创建新lun并连接logicalunit  

        [root@ser ~]# tgtadm --lld iscsi --mode target --op show        //查看新lun是否添加成功

        [root@ser ~]# tgtadm --lld iscsi --mode target --op bind --tid 1 -I ALL        //target设置访问权限允许任意访问

        [root@ser ~]# tgtadm --lld iscsi --mode target --op unbind --tid 1 -I ALL        //任意访问不安全,删除任意访问权限

        注:为target分配任意存储设备后,需要设置访问权限控制后才可以使用。

        [root@ser ~]# tgtadm --lld  iscsi --mode target --op bind --tid 1 -I  10.1.1.0/24        //设置指定网段可访问

        注: 访问控制列表可使用“tgtadm --lld iscsi --mode target --op show”下的“ACL information”查看

    Initiator端:

    Linux:

        [root@initiator ~]# yum install iscsi-initiator-utils        //安装initiator端

        [root@initiator ~]# iscsiadm -m discovery -t sendtargets -p 10.1.1.2         //发现网络中可用的target

                Starting iscsid: [ OK ] 
                10.1.1.2:3260,1 iqn.2014.12.disk1

        [root@initiator ~]# iscsiadm -m node -T iqn.2014.12.disk1 -p 10.1.1.2 -l         //登录可用target会话
                Logging in to [iface: default, target: iqn.2014.12.disk1, portal: 10.1.1.2,3260] (multiple) 
                Login to [iface: default, target: iqn.2014.12.disk1, portal: 10.1.1.2,3260] successful.

        [root@initiator ~]# fdisk -l        //查看是否多了一个10G的磁盘

        

    windows:

                运行iSCSi发起程序

                

                在目标里填写Target的地址并点击快速连接(需等待一段时间加载驱动)
                

                磁盘管理中查看是否连接成功

                

实验二开机自动创建

    Target端:

    # vim /etc/tgt/targets.conf

        <target  iqn.2014.12.com.wgmml.target1>        //targetname名

            backing-store  /dev/sdb        //target共享的磁盘

            initiator-address 10.1.1.2/24        //有访问控制权限的网段

        </target>


实例三:iscsi chap身份验证

  iscsi除了指定IP做ACL,还可以透过user/password (CHAP-Challenge Handshake Authentication Protocol(使用MD5的加密验证) )来做身分验证。

  1.   iscsi CHAP验证种类

  1.1 单向CHAP验证:在此安全性等级,只有目标Target会做验证

  1.2 相互( Mutual ) CHAP验证:在此安全性等级,目标Target与启动器Initiator皆会被彼此做验证.

  1.3 Reverse CHAP验证:一般的CHAP使用one-way hash,密码档无法回朔,但是使用Reverse CHAP是可以的 


  2.   iscsi单向CHAP验证

  预设iSCSI 采用了单向CHAP(Challenge Handshake Authentication Protocol) 的身分验证方式,基本上是一种以MD5 的加密验证方式.方式如下:

  2.1. 在双方(Target/Initiator) 建立连线后,Target 送出"challenge" 的讯息告知Initiator 要做身分验证.

  2.2. Initiator 会将使用者密码(md5码加密)给Target 端.

  2.3. Target端将密码和Initiator发送的密码做比对,如果比对正确,这身份验证即成立,否则中断此次连结做.

  2.4. 在正常连线过程中会不时重复做1~3 的CHAP 身分验证.


  3.   iscsi单向CHAP配置

  3.1. target端配置

  3.1.1 创建target并为其分配设备

  [root@station9 ~]# tgtadm --lld iscsi --mod target --op new --tid=1 -T iq.example.station9:disk1

  [root@station9 ~]# tgtadm --lld iscsi --mod logicalunit --op new --tid 1 --lun 1 -b /dev/sdb1

  [root@station9 ~]# tgtadm --lld iscsi --mod target --op bind --tid 1 -I ALL

  l 3.1.2 创建CHAP验证帐号(与系统帐号无关)

  [root@station9 ~]# tgtadm --lld iscsi --mode account --op new --user RedHat --password redhat123

  #创建帐号redhat密码为redhat123,password 和username 的最大限制是256 字元

  [root@station9 ~]# tgtadm --lld iscsi --mode account --op bind --tid 1 --user redhat

  #将帐号redhat绑定到tid为1的target

  [root@station9 ~]# tgtadm --lld iscsi --mode target --op show

  3.2. initiator端配置

  3.2.1修改iscsi配置文件,添加CHAP验证帐号

  [root@station2 ~]# vim /etc/iscsi/nf

  node.session.timeo.replacement_timeout = 20   #默认延迟时间120太长,

  node.session.auth.authmethod = CHAP           #开启CHAP验证

  node.session.auth.username = redhat           #CHAP帐号,与target中一样

  node.session.auth.password = redhat123

  3.2.2 链接target

  [root@station2 ~]# iscsiadm -m discovery -t sendtargets -p 192.168.32.39:3260

  192.168.32.39:3260,1 iq.example.station9:disk1

  [root@station2 ~]# iscsiadm -m node -T iq.example.station9:disk1 -p  192.168.32.39:3260 -l

  Logging in to [iface: default, target: iq.example.station9:disk1, portal: 192.168.32.39,3260]

  Login to [iface: default, target: iq.example.station9:disk1, portal: 192.168.32.39,3260]: successful 


  4.   相互(Mutual)HAP incoming / outgoing验证

  相互( Mutual ) CHAP验证: CHAP的认证端可为Target(Incoming Authentication)或是Initiator(Outgoing Authentication)任一端来认证.也就是说Target(Incoming Authentication)是由Target端为Initiator认证.这样的认证方式可以允许多个Initiator来连接到Target.而Initiator(Outgoing Authentication)是由Initiator来认证Target端。

  刚刚已经设定过Incoming 的认证方式,现在要透过"tgtadm" 来建立Outgoing 的认证

  4.1. target端创建outgong帐号

  [root@station9 ~]# tgtadm --lld iscsi --op new --mode account --user out_redhat --password out_redhat123

  [root@station9 ~]# tgtadm --lld iscsi --mode account --op bind --tid 1 --user out_redhat –outgoing

  [root@station9 ~]# tgtadm --lld iscsi --mode target --op show

  4.2. initiator配置

  [root@station2 ~]# vim /etc/iscsi/iscsid.conf

  node.session.timeo.replacement_timeout = 20  

  node.session.auth.authmethod = CHAP          

  node.session.auth.username = redhat          

  node.session.auth.password = redhat123

  node.session.auth.username_in = out_redhat   

  #initiator端验证帐号,和target设备的outgoing帐号一样

  node.session.auth.password_in = out_redhat123