|转至:技成培训
今天来聊一聊Modbus,先看看今天的主要内容:
01 术语解读
02 背景
03 协议原理
04 传输方式
05 Modbus RTU与Modbus ASCII有什么区别
06 Modbus TCP及其注意点
07 功能码作用
08 Modbus协议安全分析
校验码:校验码通常是一组数字的最后一位,由前面的数字通过某种运算得出,用以检验该组数据的正确性。代码作为数据在向计算机或其它设备进行输入时,容易产生输入错误,为了减少这种输入错误,编码专家发明了各种校验检错方法,并依据这些方法设置了校验码。常用的校验有:累加和校验SUM、字节异或校验XOR、纵向冗余校验LRC、循环冗余校验CRC……
离散量输入:主要用来读取单个位的数据,如IO的状态;
线圈:开关输出信号,主要用来写入单个位的数据,与离散量构成组成对位的操作;
输入寄存器:主要用来读取16位,也就是两个字节的数据;
保持寄存器:主要用来写入16位的数据;
PLC:可编程逻辑控制器,是一种采用一类可编程的存储器,用于其内部存储程序和执行逻辑运算、顺序控制、定时、计数与算术操作等面向用户的指令,并通过数字或模拟式输入/输出控制各种类型的机械或生产过程。
串口通信:随着计算机系统的应用和微机网络的发展,通信功能越来越显得重要。这里所说的通信是指计算机与外界的信息交换。因此,通信既包括计算机与外部设备之间,也包括计算机和计算机之间的信息交换。由于串行通信是在一根传输线上一位一位的传送信息,所用的传输线少,并且可以借助现成的电话网进行信息传送,因此特别适合于远距离传输。对于那些与计算机相距不远的人-机交换设备和串行存储的外部设备如终端、打印机、逻辑分析仪、磁盘等,采用串行方式交换数据也很普遍。在实时控制和管理方面,采用多台微机处理机组成分级分布控制系统中,各 CPU 之间的通信一般都是串行方式。所以串行接口是微机应用系统常用的接口。许多外设和计算机按串行方式进行通信,这里所说的串行方式,是指外设与接口电路之间的信息传送方式,实际上CPU 与接口之间仍按并行方式工作。
串口:串口是计算机上一种非常通用设备通信的协议,不要与通用串行总线Universal Serial Bus(USB)混淆。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。
串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信要慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。
典型地,串口用于ASCII码字符的传输。通信使用3根线完成:地线、发送和接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,这些参数必须匹配:
a. 波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率。例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。
b. 数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。
c. 停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
d. 奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。
早在1971年,Modicon公司首次推出了Modbus协议,ModbusRTU和Modbus ASCII诞生于此。后来施耐德电气(SchneiderElectric)收购了Modicon公司,并在1997年推出了ModbusTCP协议。2004年,中国国家标准委员会正式把Modbus作为了国家标准,开启了Modbus为中国工业通信做贡献的时代。
通过此协议,控制器相互之间、控制器经由网络和其它设备之间可以通信。Modbus协议具有标准、开放,可以支持多种电气接口,数据帧格式简单紧凑,数据传输量大、实时性好等特点,在工业控制系统中得到了广泛的应用,已经成为通用工业标准。深入分析Modbus协议实现原理和其安全性对提高工控系统安全性有着重要的现实意义。
ModbusRTU和ModbusASCII主要用于串行通信领域,而ModbusTCP则常用于以太网通信。现在,Modbus已经成为工业领域通信协议标准,并且现在是工业电子设备之间相当常用的连接方式。
Modbus使用一种简单的MasterandSlave主从协议(客户机/服务器协议)进行通信。客户机作为主站,向服务器发送请求;服务器(从站)接到请求后,对请求进行分析并作出应答。其中使用的通信帧被称为应用数据单元(Application Data Unit,ADU),它包括通信地址段、功能代码段、数据段和校验段,如下图:
一般使用上,监控系统(HMI)都为Master,PLC、电表、仪表等都为Slave,HMI系统一直PollingSlave的各种relayandregister最新数值,然后做显示及各种逻辑计算及控制调整等处理。
其中,功能代码段和数据段组合称为协议数据单元(Protocol Data Unit or Protocol Description Unit),PDU)。功能代码段占用一个字节,取值范围为1~255,其中128~255为保留值,用于异常消息应答报文。1~127为功能代码编号,其中65~72和100~110为用户自定义编码。
Modbus 协议是一种应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型,协议本身并没有定义物理层,只是定义了控制器能够认识和使用的消息结构,而不管它们是经过何种网络进行通信的。
Modbus 协议使用串口传输时可以选择RTU或ASCII模式,并规定了消息、数据结构、命令和应答方式并需要对数据进行校验。ASCII 模式采用LRC校验,RTU模式采用16 位CRC校验。通过以太网传输时使用TCP,这种模式不使用校验,因为TCP协议是一个面向连接的可靠协议。
Modbus是一种应用层协议,它定义了与基础网络无关的数据单元(ADU),可以在以太网(TCP/IP)或串行链路上(RS232、RS485等)进行通信(以太网ADU和串行ADU略有不同)。在串行链路上,Modbus协议有两种传输模式——ASCII模式和RTU模式。其中,ASCII是英文“American Standard Code for Information Interchange”的缩写,中文翻译为“美国国家信息交换标准编码”;RTU是英文“ Remote Terminal Unit”的缩写,中文翻译为“远程终端设备”。
首先,让我们来看看Modbus的工作原理。
Modbus采用主从(Master-Salve)通信模式,仅有主设备(Master)能对传输进行初始化,从设备(Slave)根据主设备的请求进行应答。典型的主设备包括现场仪表和显示面板,典型的从设备为可编程逻辑控制器(PLC)。
在串行链路的主从通信中,Modbus主设备可以连接一个或N(最大为247)个从设备,主从设备之间的通信包括单播模式和广播模式。
在广播模式中,Modbus主设备可同时向多个从设备发送请求(设备地址0用于广播模式),从设备对广播请求不进行响应。
在单播模式中,主设备发送请求至某个特定的从设备(每个Modbus从设备具有唯一地址),请求的消息帧中会包含功能代码和数据,比如功能代码“01”用来读取离散量线圈的状态。从设备接到请求后,进行应答并把消息反馈主设备。
在主从设备的通信中,可以使用ASCII模式或者RTU模式。在ASCII(AmericanStandard Code for Information Interchange)传输模式下,消息帧以英文冒号(“:”,ASCII3A Hex)开始,以回车和换号(CRLF,ASCII 0D and 0A Hex)符号结束,允许的传输的字符集为十六进制的0~9和A~F;网络中的从设备监视传输通路上是否有英文冒号(“:”),如果有的话,就对消息帧进行解码,查看消息中的地址是否与自己的地址相同,如果相同的话,就接收其中的数据;如果不同的话,则不予理会。
在ASCII模式下,每个8位的字节被拆分成两个ASCII字符进行发送,比如十六进制数0xAF ,会被分解成ASCII字符“A”和“F”进行发送,发送的字符量比RTU增加一倍。ASCII模式的好处是允许两个字符之间间隔的时间长达1s而不引发通信故障,该模式采用纵向冗余校验(Longitudinal Redundancy Check ,LRC)) 的方法来检验错误,当控制器设为在Modbus 网络上以RTU 模式通信,消息中的每个8Bit 字节都包含两个4 Bit 的十六进制字符,这种模式没有开始和结束标记。其优点是: 在同样的波特率下,可传送更多的数据。
在RTU(RemoteTerminal Unit)模式下,每个字节可以传输两个十六进制字符,比如十六进制数0xAF,直接以十六进制0xAF(二进制:10101111)进行发送,因此它的发送密度比ASCII模式高一倍;RTU模式采用循环冗余校验(CRC),下面是对RTU模式的总结:
具体格式如下图所示:
6.1 主机和从机、服务端和客户端
【在modbus协议中】
主机发送modbus请求,从机根据请求内容向主机返回响应。在modbus协议中,主机总是主动方,从机总是被动方。
【在网络应用中】
在网络应用中存在客户端和服务器端,客户端(例如浏览器)发送请求到服务器,服务器向客户端返回内容(例如HTML文本)。
【在modbus tcp中】
主机是客户端,而从机是服务器端。千万不要以为服务器端重要,主机也重要,所以主机就是服务器端。
modbus TCP和modbus RTU基本相同,但是也存在一些区别:
a.从机地址变得不再重要,多数情况下忽略。从某种意义上说从机地址被IP地址取代;
b.CRC校验变得不再重要,甚至可以忽略。由于TCP数据包中已经存在校验,为了不重复造轮子,modbus TCP干脆取消了CRC校验。
TCP 模式是为了让Modbus 数据顺利在以太网上传输产生的,使用TCP502 端口。该协议物理层,数据链路层,网络层,传输层都是基于TCP 协议,只在应用层,将Modbus 协议修改后封装进去; 接收端将该TCP 数据包拆封后,重新获得原始Modbus 帧,然后按照Modbus 协议规范进行解析,并将返回的数据包重新封装进TCP 协议中,返回到发送端。与串行链路传输的数据格式不同,TCP 模式去除了附加地址和校验,增加了报文头,其具体格式如图4所示。
在modbus TCP中包含一个MBAP头,该头包含以下几个部分:
区域
长度
描述
客户端
服务器
传输标志 | 2字节 | MODBUS 请求和响应传输过程中序列号 | 客户端生成 | 应答时复制该值 |
协议标志 | 2字节 | Modbus协议默认为0 | 客户端生成 | 应答时复制该值 |
长度 | 2字节 | 剩余部分的长度 | 客户端生成 | 应答时由服务器端生成 |
单元标志 | 1字节 | 从机标志(从机地址) | 客户端生成 | 应答时复制该值 |
注意:
a.传输标志可理解为序列号,防止 MODBUS TCP通信错位,例如后发生的响应先到了主机,而早发生的响应后到主机;
b.单元标志可理解为从机地址,此时已经不再重要。
modbus TCP可以理解为发生在TCP上的应用层协议,既然是TCP协议那么一个完整的MODBUSTCP报文必然包括TCP首部,IP首部和Ethernet首部。
启动Modbus事务处理的客户机创建Modbus应用数据单元。功能码(PDU中的)向服务器指示将执行哪种操作。
用一个字节编码Modbus数据单元的功能码域。有效范围是十制制1-255(128-255为异常响应保留)。当从客户机向服务器发送报文时,功能码域通过服务器执行哪种操作。
从客户机向服务器发送的报文数据域包括附加信息,服务器使用这个信息执行功能码定义的操作。这个域还包括离散项目和寄存器地址、处理项目的数量以及域中的实际数据字节数。
在某种请求中,数据域可以是不存在的,在此情况下服务器不需要任何附加信息。功能码仅说明操作。
功能码的类型:
功能码主要分为有效功能码、异常功能码和错误功能码。如果在一个正确接收Modbus ADU中,不出现与请求Modbus功能有关的差错,那么服务器至客户机的响应数据会包含请求中的正常功能码。如果出现与请求Modbus功能有关的差错,那么响应数据会包含一个异常码和错误码。
例如,客户机能够读一组离散量输出或输入的开/关状态,或者用户能够读/写一组寄存器数据内容。当服务器对客户机响应时,它使用功能码域来指示正常(无差错)响应或出现某种差错(称为异常响应)。对于一个正常响应来说,服务器仅对原始功能码响应。
对于异常响应,服务器返回一个与客户机等同的码,设置该原始功能码的最高有效位为逻辑1,并加该异常码后增加错误码,以通知客户机异常原因。
有效功能码
有效功能码有二十几种,但是一般使用上都以1、2、3、4、5、6、15、16等八种最为常用,以及另外特殊使用的20、21两种,此为General Reference Register,绝大部份的Modbus设备并不会提供此Register。于PLC上主要的控制数据有下列四种型式。此八种功能码就是处理这些控制资料,详细说明如下各点:
控制数据四种型式:
DI:DigitalInput(数字输入,离散输入),一个地址一个数据位,用户只能读取它的状态,不能修改。以一个 bit表示 On/Off,用来记录控制信号的状态输入,例如:开关,接触点,马达运转,超限switch…等等。于PLC上被称为Input relay、input coil等。
DO:DigitalOutput(数字输出,线圈输出),一个地址一个数据位,用户可以置位、复位,可以回读状态。以一个 bit表示 On/Off,用来输出控制信号,以激活或停止马达,警铃,灯光…等等。于PLC上被称为Output relay、Output coil等。
AI:Analog Input(模拟输入,输入寄存器),一个地址16位数据,用户只能读,不能修改,,以16 bits integer表示一个数值,用来记录控制信号的数值输入,例如:温度、流量、料量、速度、转速、文件板开度、液位、重量…等等。于PLC上被称为Input register。
AO:AnalogOutput(模拟输出,保持寄存器),一个地址16位数据,用户可以写,也可以回读,以16 bits integer表示一个数值,用来输出控制信号的数值,例如:温度、流量、速度、转速、文件板开度、饲料量…等等设定值。于PLC上被称为Output register、Holding register。
Modbus 协议是典型的工控网协议,研究其安全性对于加强工业控制网络的安全性有重要意义。一般来说,协议安全性问题可以分为两种,一种是协议自身的设计和描述引起的安全问题; 另一种是协议的不正确实现引起的安全问题。Modbus 协议也存在着这两方面的问题。
绝大多数工控协议在设计之初,仅仅考虑了功能实现、提高效率、提高可靠性等方面,而没考虑过安全性问题。Modbus 协议也不例外,尽管其已经成为事实上的工业标准。从前面原理分析可以看出其本身的安全性问题是: 缺乏认证、授权、加密等安全防护机制和功能码滥用问题。
(1)缺乏认证
认证的目的是保证收到的信息来自合法的用户,未认证用户向设备发送控制命令不会被执行。在Modbus 协议通信过程中,没有任何认证方面的相关定义,攻击者只需要找到一个合法的地址就可以使用功能码就能建立一个Modbus 通信会话,从而扰乱整个或者部分控制过程。
(2)缺乏授权
授权是保证不同的特权操作需要由拥有不同权限的认证用户来完成,这样可大大降低误操作与内部攻击的概率。目前,Modbus 协议没有基于角色的访问控制机制,也没有对用户分类,没有对用户的权限进行划分,这会导致任意用户可以执行任意功能。
(3)缺乏加密
加密可以保证通信过程中双方的信息不被第三方非法获取。Modbus 协议通信过程中,地址和命令全部采用明文传输,因此数据可以很容易的被攻击者捕获和解析,为攻击者提供便利。
(4)功能码滥用
功能码是Modbus 协议中的一项重要内容,几乎所有的通信都包含功能码。目前,功能码滥用是导致Modbus 网络异常的一个主要因素。例如不合法报文长度,短周期的无用命令,不正确的报文长度,确认异常代码延迟等都有可能导致拒绝服务攻击。
虽然Modbus 协议获得了广泛的应用,但是在实现具体的工业控制系统时,开发者并不具备安全知识或者没有意识到安全问题。这样就导致了使用Modbus 协议的系统中可能存在各种各样的安全漏洞。
(1)设计安全问题
Modbus 系统开发者重点关注的是其功能实现问题,安全问题在设计时很少被注意到。设计安全是指设计时充分考虑安全性,解决Modbus 系统可能出现的各种异常和非法操作等问题。比如在通信过程中,某个节点被恶意控制后发出非法数据,就需要考虑这些数据的判别和处理问题。
(2)缓冲区溢出漏洞
缓冲区溢出是指在向缓冲区内填充数据时超过了缓冲区本身的容量导致溢出的数据覆盖在合法数据上,这是在软件开发中最常见也是非常危险的漏洞,可以导致系统崩溃,或者被攻击者利用来控制系统。
Modbus 系统开发者大多不具备安全开发知识,这样就会产生很多的缓冲区溢出漏洞,一旦被恶意者利用会导致严重的后果。
(3)Modbus TCP 安全问题
目前,Modbus 协议已经可以在通用计算机和通用操作系统上实现,运行于TCP /IP 之上以满足发展需要。这样,TCP /IP 协议自身存在的安全问题不可避免地会影响到工控网络安全。非法网络数据获取,中间人,拒绝服务, IP 欺骗,病毒木马等在IP 互联网中的常用攻击手段都会影响Modbus 系统安全。
目前,Modbus 系统采取的安全防护措施普遍不足,这里参考信息安全业内研究并结合工控系统自身的安全问题,提出了一些安全建议,能够有效地降低工业控制系统面临的威胁。
(1)从源头开始
工控网络漏洞,很大一部分是其实现过程出现的漏洞。如果从源头开始控制,从Modbus 系统的需求设计、开发实现、内部测试和部署等阶段,全生命周期的介入安全手段,融入安全设计、安全编码以及安全测试等技术,可以极大地消除安全漏洞,降低整个Modbus 系统的安全风险。
(2)异常行为检测
异常行为代表着可能发生威胁,不管是有没有攻击者,因此开发针对Modbus 系统的专用异常行为检测设备可以极大提高工控网络的安全性。针对Modbus 系统,首先要分析其存在的各种操作行为,依据“主体,地点,时间,访问方式,操作,客体”等行为描述成一个六元组模型; 进而分析其行为是否属于异常; 最终决定采取记录或者报警等措施。
(3)安全审计
Modbus 的安全审计就是对协议数据进行深度解码分析,记录操作的时间、地点、操作者和操作行为等关键信息,实现对Modbus 系统的安全审计日志记录和审计功能,从而提供安全事件爆发后的时候追查能力。
(4)使用网络安全设备
使用入侵防御和防火墙等网络安全设备。防火墙是一个串行设备,通过设置,只允许特定的地址访问服务端,禁止外部地址访问Modbus 服务器,可以有效的防止外部入侵; 入侵防御设备可以分析Modbus协议的具体操作内容,有效地检测并阻止来自内部/外部的异常操作和各种渗透攻击行为,对内网提供保护功能。