Полный справочник по протоколу SMB: команды SMB1, SMB2 и SMB3, структура пакетов, FSCTL, типовые сценарии обмена, диагностика трафика и настройки безопасности сетей.
2026.09.29
#SMB
#сетевые протоколы
#Windows
#Samba
#сетевая безопасность
#администрирование
#файловые серверы
#Wireshark
Подробный гайд: Полный справочник по протоколу SMB: команды SMB / SMB2 / SMB3 - Часть 2
7. Подробное описание команд SMB2/SMB3
7.1. SMB2 NEGOTIATE
Команда: 0x0000
Назначение:
- клиент отправляет список поддерживаемых диалектов;
- сервер выбирает диалект;
- согласуются лимиты, возможности, GUID сервера, режим подписи;
- для SMB 3.1.1 передаются negotiate contexts.
Что согласуется:
- диалект;
- максимальный размер чтения/записи;
- максимальный размер транзакции;
- поддержка шифрования;
- поддержка подписи;
- возможности безопасности;
- поддержка compression/RDMA;
- preauth integrity hash.
Типичные поля ответа:
SecurityMode;
DialectRevision;
ServerGuid;
MaxTransactSize;
MaxReadSize;
MaxWriteSize;
SystemTime;
SecurityBuffer;
Capabilities.
7.2. SMB2 SESSION_SETUP
Команда: 0x0001
Назначение:
- установка пользовательской сессии;
- обмен security blob через SPNEGO;
- использование Kerberos, NTLM или других механизмов;
- получение
SessionId;
- установка флага шифрования сессии, если согласовано.
Важные флаги:
SMB2_SESSION_FLAG_BINDING — привязка дополнительной сессии;
SMB2_SESSION_FLAG_ENCRYPT_DATA — требование шифрования;
- гостевые/анонимные сессии в современных системах должны ограничиваться.
Типовой поток:
SESSION_SETUP Request -> STATUS_MORE_PROCESSING_REQUIRED -> SESSION_SETUP Response -> SUCCESS
7.3. SMB2 LOGOFF
Команда: 0x0002
Назначение:
- завершает сессию;
- сервер освобождает ресурсы сессии;
- после этого
SessionId становится недействительным.
7.4. SMB2 TREE_CONNECT
Команда: 0x0003
Назначение:
- подключение к общему ресурсу: диску, именованному каналу или принтеру;
- получение
TreeId;
- определение типа шары и её флагов.
Типы общих ресурсов:
SMB2_SHARE_TYPE_DISK — файловая шара;
SMB2_SHARE_TYPE_PIPE — именованные каналы;
SMB2_SHARE_TYPE_PRINT — очередь печати.
Пример пути:
\\server\share
7.5. SMB2 TREE_DISCONNECT
Команда: 0x0004
Назначение:
- отключение от общего ресурса;
- освобождение
TreeId;
- не завершает пользовательскую сессию целиком.
7.6. SMB2 CREATE
Команда: 0x0005
Назначение:
- открытие файла;
- создание файла;
- открытие каталога;
- открытие именованного канала;
- запрос оппортунистической блокировки или lease;
- передача create contexts.
Ключевые параметры:
| Параметр |
Назначение |
DesiredAccess |
Права доступа |
FileAttributes |
Атрибуты файла |
ShareAccess |
Совместный доступ: чтение/запись/удаление |
CreateDisposition |
Что делать, если файл существует/не существует |
CreateOptions |
Флаги открытия |
ImpersonationLevel |
Уровень олицетворения |
OplockLevel |
Уровень оппортунистической блокировки |
CreateContexts |
Дополнительные параметры открытия |
7.6.1. Типовые CreateDisposition
| Значение |
Смысл |
0 |
FILE_SUPERSEDE — заменить существующий или создать новый |
1 |
FILE_OPEN — открыть существующий |
2 |
FILE_CREATE — создать новый |
3 |
FILE_OPEN_IF — открыть существующий или создать |
4 |
FILE_OVERWRITE — перезаписать существующий |
5 |
FILE_OVERWRITE_IF — перезаписать существующий или создать |
7.6.2. Типовые CreateOptions
| Флаг |
Назначение |
FILE_DIRECTORY_FILE |
Объект должен быть каталогом |
FILE_NON_DIRECTORY_FILE |
Объект должен быть файлом |
FILE_WRITE_THROUGH |
Запись без кэширования, если поддерживается |
FILE_SEQUENTIAL_ONLY |
Последовательный доступ |
FILE_RANDOM_ACCESS |
Произвольный доступ |
FILE_DELETE_ON_CLOSE |
Удалить при закрытии |
FILE_OPEN_BY_FILE_ID |
Открытие по FileId |
FILE_OPEN_REPARSE_POINT |
Не следовать репарсинг-точке |
FILE_OPEN_FOR_BACKUP_INTENT |
Открытие с резервным намерением |
7.7. SMB2 CLOSE
Команда: 0x0006
Назначение:
- закрытие открытого дескриптора;
- освобождение ресурсов;
- при наличии флага можно запросить атрибуты после закрытия.
Флаг:
SMB2_CLOSE_FLAG_POSTQUERY_ATTRIB — запросить атрибуты после закрытия.
7.8. SMB2 FLUSH
Команда: 0x0007
Назначение:
- принудительно сбросить изменённые данные файла на сервер/диск.
7.9. SMB2 READ
Команда: 0x0008
Назначение:
- чтение данных из файла или канала.
Ключевые поля:
FileId;
Offset;
Length;
MinimumCount;
Channel;
RemainingBytes;
Flags.
Флаг для новых систем:
SMB2_READFLAG_READ_UNBUFFERED — небучферизованное чтение, в ряде сценариев для SMB 3.1.1.
7.10. SMB2 WRITE
Команда: 0x0009
Назначение:
- запись данных в файл или канал.
Ключевые поля:
FileId;
Offset;
Length;
Channel;
Flags.
Флаги:
SMB2_WRITEFLAG_WRITE_THROUGH — запись с проходом сквозь кэш;
SMB2_WRITEFLAG_WRITE_UNBUFFERED — небучферизованная запись.
7.11. SMB2 LOCK
Команда: 0x000A
Назначение:
- установка и снятие блокировок диапазонов файла.
Типы флагов:
SMB2_LOCKFLAG_SHARED_LOCK — разделяемая блокировка;
SMB2_LOCKFLAG_EXCLUSIVE_LOCK — исключительная блокировка;
SMB2_LOCKFLAG_UNLOCK — разблокировка;
SMB2_LOCKFLAG_FAIL_IMMEDIATELY — не ждать, сразу вернуть ошибку, если блокировка невозможна.
7.12. SMB2 IOCTL
Команда: 0x000B
Назначение:
- универсальная управляющая команда;
- заменяет многие специфические SMB1-операции;
- используется для файловых системных управляющих кодов
FSCTL;
- используется для операций с именованными каналами;
- может применяться для DFS, снапшотов, копирования на сервере, запросов сетевых интерфейсов и т.д.
Важные поля:
FileId;
CtlCode;
MaxInputResponse;
MaxOutputResponse;
Flags;
- буферы ввода/вывода.
7.13. SMB2 CANCEL
Команда: 0x000C
Назначение:
- отмена ранее отправленного запроса;
- используется, например, при отмене блокировки, чтения, уведомления об изменениях.
7.14. SMB2 ECHO
Команда: 0x000D
Назначение:
- проверка доступности сервера и сессии;
- поддержание активности;
- диагностика.
7.15. SMB2 QUERY_DIRECTORY
Команда: 0x000E
Назначение:
- перечисление файлов и каталогов;
- поиск по маске;
- получение разных классов информации.
Типовые сценарии:
CREATE на каталог -> QUERY_DIRECTORY -> ... -> CLOSE
Флаги:
SMB2_RESTART_SCANS — перезапустить сканирование;
SMB2_RETURN_SINGLE_ENTRY — вернуть одну запись;
SMB2_INDEX_SPECIFIED — использовать индекс;
SMB2_REOPEN — переоткрыть поиск.
7.16. SMB2 CHANGE_NOTIFY
Команда: 0x000F
Назначение:
- подписка на события изменения каталога;
- сервер отправляет завершение, когда происходят изменения.
Типовые фильтры:
- изменение имени файла;
- изменение имени каталога;
- изменение атрибутов;
- изменение размера;
- изменение времени записи;
- изменение безопасности;
- создание/удаление;
- изменения потоков данных.
7.17. SMB2 QUERY_INFO
Команда: 0x0010
Назначение:
- запрос информации о:
- файле;
- файловой системе;
- безопасности;
- квотах.
Типы информации:
| InfoType |
Назначение |
1 |
Файловая информация |
2 |
Информация о файловой системе |
3 |
Информация безопасности |
4 |
Информация о квотах |
7.18. SMB2 SET_INFO
Команда: 0x0011
Назначение:
- установка информации о:
- файле;
- файловой системе;
- безопасности;
- квотах.
Примеры:
- переименование файла через
FileRenameInformation;
- установка размера через
FileEndOfFileInformation;
- удаление через
FileDispositionInformation;
- изменение владельца или DACL через security info.
7.19. SMB2 OPLOCK_BREAK
Команда: 0x0012
Назначение:
- сервер сообщает клиенту о необходимости понизить уровень оппортунистической блокировки;
- используется также для lease-уведомлений;
- клиент может подтвердить или ответить в зависимости от ситуации.
Типовые причины:
- другой клиент открывает файл конфликтующим образом;
- изменения кэша;
- необходимость согласовать состояние.
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте
её с пониманием. Статья носит рекомендательный характер, поэтому,
пожалуйста, применяйте описанные методы осмотрительно.
Статью подготовил: Аверко Денис Сергеевич @Nymexis г. Омск (специалист по ЗИ)