Skip to content

Samba发展史

NetBIOS 协议

20世纪80年代初,微型计算机开始崭露头角。那时候,计算主要靠大型主机(Main Frame)服务器,放在机房里运行程序,用户桌面上的“哑终端”没啥智能,也没处理能力,只能用来输入和显示数据。

微型计算机(比如IBM-PC、苹果Macintosh、Commodore、Amiga等)的出现,颠覆了传统模式。这些机器有了处理能力,可以本地运行程序,比如文字处理、会计软件、各种应用。

这带来两个新需求:

  • 文件共享:以前大家都在同一台主机上工作,文件天然共享。现在用户在不同机器上,得能访问别人电脑上的文件。
  • 相互认证:以前通过哑终端连到主机,认证简单集中。现在这么多独立小机器,怎么知道连的是不是正确的机器?怎么确认连接者的身份?

针对这些问题,出现了好几种解决方案。我们先来看文件共享。

局域网上的文件共享

1983年,Sitek公司开发了NetBIOS协议,方便机器间通信。NetBIOS是应用层(比如文件共享)和传输层(TCP/IP、TokenRing、IPX等)之间的抽象层。那时候传输协议比现在多样得多。

有了标准的局域网API,IBM在1985年推出了更高层的SMB协议,用于网络资源共享。SMB是客户端/服务器协议:客户端发特定请求,服务器返回响应。好几家公司采用了IBM的协议,并根据自己的需求调整。IBM当时的主要竞争对手是Novell的Netware产品,它的文件共享服务性能很强。为了跟Netware竞争,微软联合IBM和3com开发了LAN Manager,集成到OS/2中。LAN Manager内置了IBM的SMB协议和NetBUI,支持OS/2共享文件、打印机和其他网络资源。

1987年,NetBIOS协议成为标准RFC1001。

IBM很快看到商机,把这技术用在IBM-PC上。那会儿IBM就像90年代的微软或现在的谷歌,定标准的主儿。所以,包括微软在内的其他IT公司都开发了自己的NetBIOS层,跟其他系统对接。

早期的NetBIOS很局限,最多支持80台机器。机器名限制在16字节,最后1字节定义机器类型(文件服务器、用户工作站等)。这也是为啥现在机器名不能超过15个字符!

安全原则

随着客户端-服务器环境的出现,得确保客户端和服务器能互相认出对方。为此,引入了三个概念:

  • 身份识别:确定用户或主机的身份。
  • 认证:验证用户身份。
  • 授权:决定用户能访问哪些资源。

LAN Manager用这三个原则保护数据访问。后来这些理念催生了Kerberos和NTLM项目。

Kerberos 的历史

Athena 项目

1983年5月,由IT厂商联合支持的Athena项目启动,计划持续5年,目标是开发客户端/服务器网络系统的策略和软件。Athena最初只为MIT(麻省理工学院)设计。

这个项目设计了一些至今仍在用的系统和协议,比如NFS和X服务器(Unix图形界面的基础)。

认证系统的想法源于MIT。当时发现学生会用自己的电脑访问高价值网络上的文件服务器,认证需求应运而生。Athena项目的目标是开发一个网络认证协议,把信任管理集中在少数严密监控的机器上。

这些信任服务器和其他网络计算机的认证通信会加密,防止被拦截(安全)。

自从在Athena项目中诞生,Kerberos协议经过大幅改进,变得更易用、模块化、更安全。

Samba 简介

Samba官网将其定义为一个让Windows和UNIX/Linux环境互操作的软件套件。核心技术是SMB通信和文件共享协议,Samba的名字也因此而来。微软在企业、公共部门和教育领域的广泛存在,加上Samba开源软件的高质量实现,让SMB协议逐渐成为Windows、Linux、Mac设备网络文件交换的标准。

Samba包括:

  • Active Directory和NT4域模式的集中身份认证管理。
  • 集中式组管理。
  • 基于微软SMB协议的文件共享。
  • 文件和目录访问权限的集中管理。
  • 打印机共享。
Samba1

Samba1版本在1990年代初发布,提供简单的LAN Manager协议和工作组支持。

Samba2

2002年发布的Samba2.2开始为域成员的Windows工作站提供NT4风格的域控制器服务。

Samba3

Samba3的各版本改进了NT4域功能支持,并支持新版SMB协议(SMB2.2、SMB3)。

Samba4

Samba4项目2005年启动,目标是根据微软公开的官方规范(因欧盟对微软垄断地位的诉讼而公开)完全重写Samba。

当时,Samba3的代码库维护越来越难。之前,Samba通过逆向工程微软协议逐步开发:开发者观察Windows工作站和服务器的通信,从收集的数据中凭经验开发Samba,模仿微软协议行为。

后来,项目能更自由地访问微软官方规范,大大方便了开发。为了加强互操作性,SMB协议的各相关方每年在PlugFest活动上测试不同实现。2010-2011年,Samba4的兴趣激增,因为大家意识到Andrew Bartlett的雄心目标开始实现。

2012年,随着Samba4关注度提升,开发者发现仅靠微软的SMB协议规范实现不完整,微软实际实现的SMB协议更复杂,文档也不完善。

Samba3是凭经验开发,没靠官方文档,所以文件和打印机共享功能很好用。历史上,微软对向下兼容很谨慎,早期版本的服务器行为在新版本中保留。

Samba4重写涉及三个主要组件:

  • Active Directory 组件。
  • 文件共享 smbd 组件。
  • 用户映射 winbindd 组件。

2012年9月,决定复用Samba3的smbd代码库提供文件和打印机共享功能,Samba4代码只负责Active Directory功能。整合Samba3代码库到Samba4后,2012年12月发布了Samba4的首个稳定版4.0.0。

Samba 的维护和安全策略

Samba项目人手有限,无法同时维护多个版本的补丁。

因此,Samba采用以下策略:

  • 开发中的非稳定版本 N+1,当前是4.23。
  • 稳定生产版本 N,当前是4.22。
  • 补丁维护版本 N-1,当前是4.21。
  • 安全维护版本 N-2,当前是4.20。

不过,Samba软件有商业生态,关注特定版本的公司可以投入资源,将特定bug修复回迁到非官方维护的版本。

Samba3已停止维护,需准备迁移到Samba4。因为Samba4集成了Samba3代码库,即使在NT4模式下也能用Samba4,享受3.x版本支持结束后的补丁和新功能。

Samba4 和 Linux 发行版

Samba4整合了Samba3代码库,给Linux发行版的打包团队带来了很大困惑。大多数发行版不想立刻放弃用户熟悉的Samba3。Samba4的Linux包部分整合了Samba3代码,与Samba3包冲突。比如Debian的samba4.0rc2包完全没法用,凸显了这种版本冲突的混乱。

SMB 协议

客户端-服务器架构

SMB是1985年IBM的Barry Feigenbaum定义的文件/打印机资源共享协议,采用客户端-服务器结构:客户端发送特定请求,文件服务器响应。协议为局域网优化,但也能用于互联网。

协议的不同实现

多家公司或实体采用并改进了SMB标准:

  • Andrew Tridgell创立的Samba;
  • 微软Windows Workgroups 3.x;
  • 微软Windows NT;
  • IBM的LAN Server;
  • Digital的PATHWORKS产品系列;
  • LAN Manager;
  • VisionFS;
  • TotalNET Advanced Server;
  • Advanced Server for Unix。

CIFS是协议的最新定义,由微软及其他厂商(如Digital Equipment、Data General、SCO、Network Appliance等)开发。从Windows Vista起,称为SMB2。

SMB 协议的版本

SMB最初设计在NetBIOS/NetBEUI API上运行(通常用NetBIOS over IPX/SPX实现)。从Windows 2000起,SMB默认在TCP上运行薄层,使用TCP 445端口,而非139端口,称为直接SMB主机。

SMB1

SMBv1协议起源于1980年代初,古老且啰嗦,在现代网络上很受限。它在VPN网络上延迟高,啰嗦特性无法充分利用现代网络带宽。

协议层复杂,bug多,尤其是安全漏洞(比如Wannacry漏洞)。建议在企业网络中禁用SMB1以提升安全。最新Windows版本默认禁用此协议,Samba也默认禁用。

SMB2

微软2006年在Windows Vista引入SMB2,Windows 7进一步改进,后续在2012年推出2.1和3.0版本。SMB2通过减少请求数量降低SMB1的啰嗦性,引入管道处理机制(在收到前一请求响应前发送更多请求),提升高延迟链路性能,支持符号链接。

Windows Vista/Server 2008及以上版本与支持SMB2的机器通信时使用SMB2。SMB1用于与旧版Windows、Samba和NAS系统连接。Samba 3.5实验性支持SMB2,Samba 3.6完全支持SMB2(除了用Windows配额管理工具更改用户配额)。

SMB 2.1随Windows 7和Server 2008 R2引入,带来小幅性能提升。

SMB3

SMB 3.0(原名SMB 2.2)随Windows 8和Server 2012引入。

协议带来重要变化,如SMB Direct(基于RDMA的SMB)和多通道SMB(一个SMB会话多个连接),旨在增加功能并提升SMB2性能,尤其在虚拟化数据中心。

还引入了多项安全增强,如端到端加密和基于AES的新签名算法。