Samba3SMB2IntroductionPrerequisite accompanying workSMB 2.0SMB 2.1SMB 3.0SMB3.02Work in progress branchesTalksDemos

Introduction

In order to make coding easier, the following describes various design considerations for the Linux SMB2 client.

The SMB2 network file system protocol is the successor to the SMB/CIFS protocol, and is the default network file protocol for various operating systems. Although most, if not all, current servers and NAS appliances continue to support the CIFS network file system protocol, the improved scalability limits, performance and features of SMB2 make it a high priority to add SMB2 client support to the Linux kernel.

SMB2 also includes some new features such as symlink support, which are not part of the original CIFS protocol (although are available in CIFS POSIX Protocol Extensions which Samba and the Linux CIFS kernel client, among others, implement).

Although alternative network file systems (such as NFSv4) and cluster file systems have been implemented for Linux, only a small percentage of servers and NAS appliances implement those protocols, limiting the usefulness of other (non-SMB/CIFS or SMB2) network file system clients. With the release of detailed protocol documentation by Microsoft over the past few years, SMB2 (and related subprotocols such as MS-DFS) is likely to become broadly adopted.

4 гЮОСЯЙ ДЕЛНМНБ

еЯРЭ ДБЮ ДЕЛНМЮ SMB /usr/sbin/smbd Х /usr/sbin/nmbd.

бШ ЛНФЕРЕ ГЮОСЯРХРЭ ДЕЛНМШ Samba ХГ inetd ХКХ ЙЮЙ ЮБРНМНЛМШЕ ОПНЖЕЯЯШ. еЯКХ БШ МЮЯРПЮХБЮЕРЕ ОНЯРНЪММШИ ТЮИКНБШИ ЯЕПБЕП, РНЦДЮ НМХ ДНКФМШ ГЮОСЯЙЮРЭЯЪ ХГ inetd, РЮЙ ВРН НМХ АСДСР ОЕПЕГЮОСЫЕМШ ЕЯКХ НМХ ГЮЙНМВЮР ПЮАНРС. еЯКХ БШ УНРХРЕ ХЯОНКЭГНБЮРЭ ЯПЕДЯРБЮ SMB БПЕЛЪ НР БПЕЛЕМХ ХКХ ДКЪ ОНЛНЫХ Б ЯХЯРЕЛМНЛ ЮДЛХМХЯРПХПНБЮМХХ, БШ ЛНФЕРЕ ГЮОСЯРХРЭ ХУ Б ЯЙПХОРЕ /etc/rc.d/init.d ХКХ ДЮФЕ БПСВМСЧ, ЙНЦДЮ БЮЛ МЕНАУНДХЛН.

дКЪ ГЮОСЯЙЮ ДЕЛНМНБ ХГ inetd, ОНЛЕЯРХРЕ ЯКЕДСЧЫХЕ ЯРПНЙХ Б ЙНМТХЦСПЮЖХНММШИ ТЮИК inetd, /etc/inetd.conf:

# SAMBA NetBIOS services (for PC file and print sharing)

netbios-ssn stream tcp nowait root /usr/sbin/smbd smbd

netbios-ns dgram udp wait root /usr/sbin/nmbd nmbd

гЮРЕЛ ОЕПЕГЮОСЯРХРЕ ДЕЛНМ inetd ГЮОСЯЙНЛ ЙНЛЮМДШ:

kill -HUP 1

дКЪ ГЮОСЯЙЮ ДЕЛНМНБ ХГ ЯХЯРЕЛМШУ ЯРЮПРНБШУ ЯЙПХОРНБ, ОНЛЕЯРХРЕ ЯКЕДСЧЫХИ ЯЙПХОР Б ТЮИК МЮГШБЮЕЛШИ /etc/rc.d/init.d/smb Х ЯНГДЮИРЕ МЮ МЕЦН ЯХЛБНКХВЕЯЙХЕ ЯЯШКЙХ Я ХЛЕМЮЛХ СЙЮГЮММШЛХ Б ЙНЛЛЕМРЮПХЪУ:

#!/bin/sh

#

# /etc/rc.d/init.d/smb — ГЮОСЯЙЮЕР Х НЯРЮМЮБКХБЮЕР ЯЕПБХЯШ SMB

#

# яКЕДСЧЫХЕ ТЮИКШ ДНКФМШ АШРЭ ЯХЛБНКХВЕЯЙХЛХ ЯЯШКЙЮЛХ МЮ ЩРНР ТЮИК:

# symlinks:

# /etc/rc.d/rc1.d/K35smb (сАХБЮЕР ЯЕПБХЯШ SMB ОПХ БШЙКЧВЕМХХ

# /etc/rc.d/rc3.d/S91smb (гЮОСЯЙЮЕР ЯЕПБХЯШ SMB Б ЛМНЦНОНКЭГНБЮРЕКЭЯЙНЛ ПЕФХЛЕ)

# /etc/rc.d/rc6.d/K35smb (сАХБЮЕР ЯЕПБХЯШ SMB ОПХ ОЕПЕГЮЦПСГЙЕ)

#

# Source function library.

. /etc/rc.d/init.d/functions

# Source networking configuration.

. /etc/sysconfig/network

# Check that networking is up.

&& exit 0

# See how we were called.

case «$1» in

start)

echo -n «Starting SMB services: «

daemon smbd -D

daemon nmbd -D

echo

touch /var/lock/subsys/smb

;;

stop)

echo -n «Shutting down SMB services: «

killproc smbd

killproc nmbd

rm -f /var/lock/subsys/smb

echo «»

;;

*)

echo «Usage: smb {start|stop}»

exit 1

esac

Отключаем smb v1 через powershell

Данный метод подойдет для серверной операционной системы Windows Server 2012 R2 и Windos 8.1, выполните вот такую команду:

Set-SmbServerConfiguration -EnableSMB1Protocol $false

После ее выполнения smb v1 будет выключен.

Для отключения SMB версии 2 и 3 выполните:

Set-SmbServerConfiguration -EnableSMB2Protocol $false

Если захотите включить, то поменяйте $false на $true.

Теперь для Windows 7 и Windows 2008 R2, выполните следующее:

Чтобы отключить протокол SMB версии 1 на SMB-сервере, выполните следующий командлет: Set-ItemProperty -Path «HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters» SMB1 -Type DWORD -Value 0 -Force

Чтобы отключить протоколы SMB версии 2 и 3 на SMB-сервере, выполните следующий командлет: Set-ItemProperty -Path «HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters» SMB2 -Type DWORD -Value 0 -Force

Чтобы включить протокол SMB версии 1 на SMB-сервере, выполните следующий командлет: Set-ItemProperty -Path «HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters» SMB1 -Type DWORD -Value 1 -Force

Чтобы включить протоколы SMB версии 2 и 3 на SMB-сервере, выполните следующий командлет: Set-ItemProperty -Path «HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters» SMB2 -Type DWORD -Value 1 -Force

История код

Первая версия протокола была разработана сотрудником IBM Бэрри Файгенбаумом (англ. Barry Feigenbaum) в 1983 году. Изначально SMB был реализован через NetBIOS (поверх NBF, IPX/SPX или NetBIOS over TCP/IP) и использовался в сетях MS-NET и LAN Manager для DOS, а также в Windows for Workgroups. Microsoft регулярно дополняла протокол новыми возможностями; так, вторая версия Microsoft Networks SMB File Sharing Protocol Extensions появилась в 1988 году, 3-я версия — в 1989 году, версия 3.4 — в 1992.

В 1992 году появилась Samba — свободная реализация протокола SMB для UNIX-подобных операционных систем (изначально для SunOS). Поскольку Microsoft не опубликовала документацию значительной части своих дополнений к SMB, разработчикам Samba пришлось провести обратную разработку протокола.

В 1996 году Microsoft стала использовать новое название для дополненной версии протокола, которая использовалась в Windows NT 4.0 — CIFS (англ. Common Internet File System); новое имя прижилось, SMB и CIFS фактически стали синонимами. Microsoft некоторое время пыталась превратить CIFS в международный стандарт через IETF, но после 2000 года прекратила работу по стандартизации.

В Windows 2000 впервые появился SMB непосредственно поверх TCP (без NetBIOS); для этого используется порт 445 (SMB через NBT использовал порт 139).

В Windows Vista появилась новая версия протокола — SMB 2.0. Протокол был значительно упрощён (в SMB было более 100 команд, а в SMB 2 — всего 19); при этом была повышена производительность (благодаря механизму кэширования возможно совмещать несколько команд SMB 2 в одном сетевом запросе и увеличенным буферам чтения и записи), особенно в сетях с высокой латентностью, улучшена масштабируемость и добавлена возможность автоматического продолжения сеанса в случае временного отсоединения от сервера. SMB 2 использует тот же порт (445) как и SMB, но другой заголовок пакетов ( в SMB, в SMB 2).

В 2008 году под давлением Еврокомиссии Microsoft опубликовала описание своих частных протоколов, в том числе и SMB, на сайте MSDN.

Windows 7 и Windows Server 2008 R2

Windows PowerShell 2.0

Чтобы включить или отключить протоколы SMB на сервере с Windows 7, Windows Server 2008 R2, Windows Vista или Windows Server 2008, воспользуйтесь Windows PowerShell или редактором реестра.

Отключить

Чтобы отключить протокол версии 1 на сервере, выполните следующий командлет:

Set-ItemProperty -Path «HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters» SMB1 -Type DWORD -Value 0 -Force
Set-ItemProperty -Path «HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer» -Name DependOnService -Value «SamSS,Srv2»

1
2

Set-ItemProperty-Path»HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters»SMB1-Type DWORD-Value-Force

Set-ItemProperty-Path»HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer»-Name DependOnService-Value»SamSS,Srv2″

Чтобы отключить протоколы версии 2 и 3 на сервере, выполните следующий командлет:

Set-ItemProperty -Path «HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters» SMB2 -Type DWORD -Value 0 -Force

1 Set-ItemProperty-Path»HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters»SMB2-Type DWORD-Value-Force

Включить

Чтобы включить протокол версии 1 на сервере, выполните следующий командлет:

Set-ItemProperty -Path «HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters» SMB1 -Type DWORD -Value 1 -Force

1 Set-ItemProperty-Path»HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters»SMB1-Type DWORD-Value1-Force

Чтобы включить протоколы версии 2 и 3 на сервере, выполните следующий командлет:

Set-ItemProperty -Path «HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters» SMB2 -Type DWORD -Value 1 -Force

1 Set-ItemProperty-Path»HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters»SMB2-Type DWORD-Value1-Force

Сервер

Чтобы включить или отключить протокол версии 1 на сервере, настройте следующий раздел реестра:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters

1 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters

SMB1отключеновключено

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer

1 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer

DependOnService

REG_MULTI_SZ: SamSS,Srv2
По умолчанию: SamSS,Srv

Чтобы включить или отключить протокол версии 2 на сервере, настройте следующий раздел реестра:
Подраздел реестра:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters

1 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters

SMB2отключеновключено

Клиент

Как включить и отключить протоколы SMB на клиенте Windows Vista, Windows Server 2008, Windows 7, Windows Server 2008 R2, Windows 8 и Windows Server 2012

Отключить

Чтобы Отключить протокол версии 1 на клиенте, выполните следующие команды:

sc.exe config lanmanworkstation depend= bowser/mrxsmb20/nsi
sc.exe config mrxsmb10 start= disabled

1
2

sc.exe config lanmanworkstation depend=bowsermrxsmb20nsi

sc.exe config mrxsmb10 start=disabled

Чтобы Отключить протокол версии 2 и 3 на клиенте, выполните следующие команды:

sc.exe config lanmanworkstation depend= bowser/mrxsmb10/nsi

sc.exe config mrxsmb20 start= disabled

1
2
3

sc.exe config lanmanworkstation depend=bowsermrxsmb10nsi

sc.exe config mrxsmb20 start=disabled

Включить

Чтобы Включить протокол версии 1 на клиенте, выполните следующие команды:

sc.exe config lanmanworkstation depend= bowser/mrxsmb10/mrxsmb20/nsi
sc.exe config mrxsmb10 start= auto

1
2

sc.exe config lanmanworkstation depend=bowsermrxsmb10mrxsmb20nsi

sc.exe config mrxsmb10 start=auto

Чтобы Включить протокол версии 2 и 3 на клиенте, выполните следующие команды:

sc.exe config lanmanworkstation depend= bowser/mrxsmb10/mrxsmb20/nsi
sc.exe config mrxsmb20 start= auto

1
2

sc.exe config lanmanworkstation depend=bowsermrxsmb10mrxsmb20nsi

sc.exe config mrxsmb20 start=auto

Как проверить можно ли заразить ваш компьютер

Как я и писал выше, жертвами становятся те компьютеры у кого работает протокол smb v1, который требует отключения. Ниже я вам предоставлю утилиту, с помощью которой вы сможете проверить удовлетворяет ли ваш или другой компьютер в сети, требованиям по безопасности.

KB обновления защищающие от wannacrypt  и Petya

Вот подробный список KB для разных операционных систем Windows:

Windows XP

https://blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/

Windows Vista и Windows Server 2008

  • KB4012598 — 32 бита — http://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4012598
  • KB4012598 — 64 бита — http://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4012598

Windows 7

  • KB4012212 — 32 бита — http://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4012212
  • KB4012215 — 32 бита — http://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4012215
  • KB4012212 — 64 бита — http://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4012212
  • KB4012215 — 64 бита — http://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4012215

Windows Server 2008 R2

  • KB4012212 — http://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4012212
  • KB4012215 — http://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4012215

Windows 8.1

  • KB4012213 — 32 бита — http://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4012213
  • KB4012216 — 32 бита — http://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4012216
  • KB4012213 — 64 бита — http://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4012213
  • KB4012216 — 64 бита — http://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4012216

Windows Server 2012 R2

  • KB4012214 — http://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4012214
  • KB4012217 — http://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4012217
  • KB4012213 — http://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4012213
  • KB4012216 — http://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4012216

Windows 10

  • KB4012606 -32 бита — http://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4012606
  • KB4012606 -64 бита — http://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4012606
  • Windows 10 1511 — KB4013198 — 32 бита — http://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4013198
  • Windows 10 1511 — KB4013198 — 64 бита — http://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4013198
  • Windows 10 1607 — KB4013429 — 32 бита — http://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4013429
  • Windows 10 1607 — KB4013429 — 64 бита — http://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4013429

Windows Server 2016

KB4013429 — http://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4013429

Теперь зная нужные KB мы легко можем проверить, где не хватает обновлений и включен протокол smb v1. Ниже я вам предоставлю два метода поиска бреши.

  • Утилита SecurityChecker.v2
  • Power shell

Утилита SecurityChecker.v2

Данная утилита может показать, где включен smb v1 и 2.0, а так же проверить компьютер или компьютеры локальной сети на наличие нужного обновления.

В открывшейся программе, вам необходимо нажать кнопку «Add» и добавить компьютер или компьютеры, требующие проверки. Через кнопку KB вы можете подгрузить файл находящийся в корне утилиты с нужными KB для проверки, после чего нажимаете «Check». По результату проверки, вы увидите, стоит ли вам выполнить отключение smb v1 или же нет. На моем примере, вы видите, что и первая и вторая версии включены.

Проверить протокол smb v1 можно и через powershell. Открываем его от имени администратора и вводим такую команду:

get-hotfix -ComputerName имя вашего компьютера -Id нужная kb

Если у вас есть UNC соединения к вашему компьютеру, то вы можете посмотреть их версии командой

Get-SmbConnection

durable handles

Note: Support for durable handles has been released with Samba 4.0

These steps describe the necessary steps towards the implementation of durable handles. For now for a single, non-clustered Samba-Server.
For details on durable handles in a CTDB+Samba-cluster, see below.

dbwrap work

This is prerequisite work to avoid code duplication in record watching and so on:

  • clean up locking order
  • add dbwrap record watch mechanisms to abstract the mechanims for waiting for lock records to become available

state: essentially done(?)

rewrite messaging

Note: The new messaging this is included in Samba 4.2

For the implementation of durable handles, the smbd processes will need to communicate more than before:
When a client reconnects to Samba after a network outage, it will end up at a different smbd. The new
smbd will need to work on the files that had been in use as durable handles in the original client.
There are two possible approaches: keep files open or reopen files.
Depending on the approach, it might become necessary to pass open files from one smbd to another using fd passing.
For this, we need to change our messaging. But also for the generally more demanding messaging,
it would be extremely useful to get rid of the tdb+signal based messaging and replace it by an asynchronous
mechanism based on sockets and in a second step have the messaging infrastructure IDL-generated.

add new tevent_req based API

dependence: This is independent of other tasks.

in order to simplify the higher layers a new tevent_req based messaging api is needed.

rewrite messaging with sockets

dependence: This is independent of other tasks.

  • raw messaging: unix domain datagram sockets.
  • if there are too large packets, then we need stream in addition
  • if possible: keep s3 api messaging_send/receive for a start in order to reduce scope of change

implement messaging based on iRPC

dependence: Based on the two previous steps

  • do «irpc» over this raw messaging
  • rpc services defined by idl, generated by pidl
  • write rpc services for fd-passing

Define New Data Structures

locking/open files (fs layer)

  • define data structures (idl)
  • identify various databases
  • design goal API for each such database or structure

state: essentially done?

sessions/tcons/opens (smb layer)

  • define data structures (idl):
    • struct smbXsrv_session*
    • struct smbXsrv_tcon*
    • struct smbXsrv_open*
  • identify various databases
  • design goal API for each such DB or structure

state: in progress/largely done

Use New Data Structures In The Server

use in FS layer

  • refactor locking code etc: create corresponding APIs with current backend code, use in server
  • extend current structures to match targeted structures
  • change code beneath APIs to use new marshalled databases
  • add logic to use new parts of the structures

state: essentially done?

use in smb layer

  • cleanup/simplify core smbd code
  • make use of new structures

state: essentially done?

Implement durable open and reconnect

Session reconnect with previous session id

  • if previous session exists, tear it down and thereby close tcons and (non-durable) open files
  • open new session

state: done

implement durable open

  • Interpret durable flag in smb2_create call
    • Mark the file handle durable in the database record.
    • confirm durable open in the response to the client
  • change cleanup routines to not delete open file entries for durable handles, even when the opening process does not exist any more

state: done

implement scavanger mechanism to clean durable handles without corresponding smbd process after the scavenger timeout (maybe simply as part of cleanup routine?)

state: done

implement durable reconnect with reopening files (CIFS only)

  • implement reconnect for durable handles at SMB2 level after session reconnect and tcon:
    • new smbd looks for file info by persistent ID.
    • smbd should reopen the file based on the information from the databases.
  • fine-tuning of lock/oplock(/lease) behaviour under durable reopen
  • fencing against conflicting opens (==> CIFS only?! — need to keep files open for shell / nfs interop)

state: progress/largely done

improve nfs/shell interop for conflicting opens

Note: may be implemented later as an add-on

  • write tests to trigger the problem between a connection loss and a non-cifs open of the file that is still a durable handle
  • possiblity: create extra process that reopens the closed files to be able to catch opens from shell or nfs while cifs client is disconnected (==> there is still a race condition here)

implement durable reconnect with fd-passing

Note: may be implemented later as an add-on

  • have smbd keep files open which are durable when the client is disconnected
  • implement reopen:

Persistent File Handles

Introduction

Persistent file handles are a like durable file handles with strong guarantees.
They are requested with the durable v2 create request blob with the persistent
flag set to true. The server only grants persistent handles on shares that are
marked CA (continuously available).

There is no finished design yet for the implementation of persistent handles.
The foundations have been layed with the introduction of durable handles.
The challenge is to implement the additional guarantees.

Ideas

  • some dbs need to be made (at least partially) persistent:
    • smbXsrv_open_global
    • locking
    • brlock
    • index databases for smbXsrv_open (CreateGUID, AppInstanceID, LeaseKey)
  • using persistent copies is probably not an option, because because persistent transactions are too expensive
  • maybe we could introduce an intermediate variant between volatile and persistent dbs, where individual records are made persistent.
  • Maybe we also need to make a parallel copy of these databases for persistent files / ca shares so that other shares / file handles can be served with the known performance.

Описание протокола SMB

SMB, или иначе CIFS — это протокол, определяющий сетевую файловую систему, ее структуру и порядок использования. NetBIOS предоставляет интерфейс, через который SMB-сообщения передаются в сети, он используется серверами для «анонса» служб в сети, и клиентами для «обзора» этих служб. NetBIOS в качестве транспортного протокола может использовать любой низкоуровневый сетевой протокол, однако наиболее часто используется TCP/IP; когда NetBIOS работает поверх TCP/IP, это называется NBT. WINS предоставляет централизованные службы имен (отображение имен машин в IP-адреса) там, где это необходимо.

Протокол SMB, соответствующий прикладному и представительному уровням модели OSI, регламентирует взаимодействие рабочей станции с сервером. В функции SMB входят следующие операции:

Управление сессиями. Создание и разрыв логического канала между рабочей станцией и сетевыми ресурсами файлового сервера.

Файловый доступ. Рабочая станция может обратиться к файл-серверу с запросами на создание и удаление каталогов, создание, открытие и закрытие файлов, чтение и запись в файлы, переименование и удаление файлов, поиск файлов, получение и установку файловых атрибутов, блокирование записей.

Сервис печати. Рабочая станция может ставить файлы в очередь для печати на сервере и получать информацию об очереди печати.

Сервис сообщений. SMB поддерживает простую передачу сообщений со следующими функциями: послать простое сообщение; послать широковещательное сообщение; послать начало блока сообщений; послать текст блока сообщений; послать конец блока сообщений; переслать имя пользователя; отменить пересылку; получить имя машины.

На высоком уровне представление протокола SMB довольно просто. Он включает в себя все возможные операции для работы с файлами и принтерами, которыми вы пользуетесь на обычном компьютере, например :

открыть и закрыть файл;

создание и удаление директорий;

чтение и запись в файл;

поиск файлов;

посылка на печать и отмена печати на принтере.

Все эти операции могут быть помещены в сообщение SMB и переданы к и от сервера. Название SMB происходит от названия формата данных v разновидности стандартных системных вызовов DOS к различным структурам данных или Server Message Blocks, адаптированная для передачи данных другому компьютеру по сети.

Формат SMB

Richard Shape из команды разработчиков Samba дал определение протоколу SMB как запрос-ответ. На практике это означает, что клиент посылает запрос SMB к серверу и сервер отвечает сообщением на этот запрос. Сервер редко формирует ответы, которые не относятся к клиенту.

Сообщение SMB не так сложно. Рассмотрим структуру сообщения. Его можно разделить на две части: заголовок фиксированного размера и поле команды, размер которой меняется динамически в зависимости от состава сообщения.

Формат заголовка SMB

Таблица 3.1 показывает формат заголовка SMB. Команды SMB не обязательно должны заполнять все поля заголовка SMB. Например, когда клиент впервые пытается соединиться с сервером, то значение идентификатора дерева (TID) пусто v он появляется после успешного соединения и нулевое значение TID (0xFFFF) устанавливается в соответствующее поле заголовка. Другие поля могут также устанавливаться в ноль, когда не используются.

Значения полей заголовка SMB перечислены в Таблице 3.1.

Таблица 3.1 Поля заголовка SMB

Поле

Размер (байты)

Описание

0xFF ‘SMB’

1

Идентификатор протокола

COM

1

Код команды, от 0x00 до 0xFF

RCLS

1

Класс ошибки

REH

1

Зарезервирован

ERR

2

Код ошибки

REB

1

Зарезервирован

RES

14

Зарезервирован

TID

2

ID Дерева; уникальное ID для ресурса, исп. клиентом

PID

2

ID Вызывающего процесса

UID

2

Идентификатор пользователя

MID

2

Мультиплексный ID; используемый для передачи запросов внутри процесса

Формат команды SMB

После того, как заголовок представлен определенным числом байт, происходит выполнение команды SMB. Любая команда, например такая, как открыть файл (ID поля COM: SMBopen ) или получить запрос на печать (SMBsplretq), имеет свой набор параметров и данные. Как и в поле заголовка SMB, здесь также могут быть заполнены не все командные поля, все зависит от команды. Например, команда GetServerAttributes (SMBdskattr) устанавливает поля WCT BCC в 0. Поля командных сегментов показаны в Таблице 3.2.

Таблица 3.2 — Содержание команды SMB

Поле

Размер в байтах

Описание

WCT

1

Счетчик слов

VWV

Переменная

Параметр слов (размер, определяемый WCT)

BCC

2

Параметр счетчика байт

DATA

Переменная

Данные (размер, определяемый BCC)

Принцип работы

SMB — это протокол, основанный на технологии клиент-сервер, который предоставляет клиентским приложениям простой способ для чтения и записи файлов, а также запроса служб у серверных программ в различных типах сетевого окружения. Серверы предоставляют файловые системы и другие ресурсы (принтеры, почтовые сегменты, именованные каналы и т. д.) для общего доступа в сети. Клиентские компьютеры могут иметь у себя свои носители информации, но также имеют доступ к ресурсам, предоставленным сервером для общего пользования.

Клиенты соединяются с сервером, используя протоколы TCP/IP (а, точнее, NetBIOS через TCP/IP), NetBEUI или IPX/SPX. После того, как соединение установлено, клиенты могут посылать команды серверу (эти команды называются SMB-команды или SMBs), который даёт им доступ к ресурсам, позволяет открывать, читать файлы, писать в файлы и вообще выполнять весь перечень действий, которые можно выполнять с файловой системой. Однако в случае использования SMB эти действия совершаются через сеть.

Как было сказано выше, SMB работает, используя различные протоколы. В сетевой модели OSI протокол SMB используется как протокол Application/Presentation уровня и зависит от низкоуровневых транспортных протоколов. SMB может использоваться через TCP/IP, NetBEUI и IPX/SPX. Если TCP/IP или NetBEUI будут заняты, то будет использоваться NetBIOS API. SMB также может посылаться через протокол DECnet. Digital (ныне Compaq) сделала это специально для своего продукта PATHWORKS. NetBIOS в случае использования через TCP/IP имеет различные названия. Microsoft называет его в некоторых случаях NBT, а в некоторых NetBT. Также встречается название RFCNB.

С начала существования SMB было разработано множество различных вариантов протокола для обработки всё возрастающей сложности компьютерной среды, в которой он использовался. Договорились, что реальный вариант протокола, который будет использоваться клиентом и сервером, будет определяться командой negprot (negotiate protocol). Этот SMB обязан посылаться первым до установления соединения. Первым вариантом протокола был Core Protocol, известный как SMB-реализация PC NETWORK PROGRAM 1.0. Он должным образом поддерживает весь набор основных операций, который включает в себя:

  • присоединение к файловым и принтерным ресурсам и отсоединение от них;
  • открытие и закрытие файлов;
  • открытие и закрытие принтерных файлов;
  • чтение и запись файлов;
  • создание и удаление файлов и каталогов;
  • поиск каталогов;
  • получение и установление атрибутов файла;
  • блокировка и разблокировка файлов.
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector